From a8d5fad1a82bbfcc5810f417b806be67ca8f3269 Mon Sep 17 00:00:00 2001 From: marco Date: Thu, 14 May 2020 21:26:48 +0200 Subject: [PATCH] KoD 1.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - completato il supporto ai torrent e aggiunto ilcorsaronero.xyz - aggiunto supporto agli episodi locali, ovvero poter inserire nella libreria di kodi un misto tra puntate di kod e file scaricati altrove - le viste ora si salvano di nuovo dal menu laterale, ma rimangono salvate per il tipo di contenuto visualizzato e non per il singolo menu - ripensato il menu rapido, che ora è più rapido, ridisegnate alcune finestre --- README.md | 5 +- addon.xml | 13 +- channels.json | 26 +- channels/0example.json.txt | 3 +- channels/altadefinizione01.json | 1 - channels/altadefinizione01_link.json | 1 - channels/altadefinizioneclick.json | 1 - channels/animeforce.json | 1 - channels/animeleggendari.json | 1 - channels/animesaturn.json | 1 - channels/animespace.json | 1 - channels/animesubita.json | 1 - channels/animetubeita.json | 1 - channels/animeunity.json | 1 - channels/animeworld.json | 1 - channels/casacinema.json | 1 - channels/casacinemaInfo.json | 1 - channels/cb01anime.json | 1 - channels/cineblog01.json | 1 - channels/cineblog01.py | 57 +- channels/cinemalibero.json | 1 - channels/cinetecadibologna.json | 1 - channels/dreamsub.json | 1 - channels/dsda.json | 1 - channels/eurostreaming.json | 1 - channels/fastsubita.json | 1 - channels/filmigratis.json | 1 - channels/filmpertutti.json | 1 - channels/filmsenzalimiticc.json | 1 - channels/guardaserieclick.json | 1 - channels/hd4me.json | 1 - channels/ilcorsaronero.json | 3 +- channels/ilcorsaronero.py | 69 +- channels/ilgeniodellostreaming.json | 1 - channels/italiaserie.json | 1 - channels/metalvideo.json | 1 - channels/metalvideo.py | 5 +- channels/mondoserietv.json | 1 - channels/netfreex.json | 1 - channels/piratestreaming.json | 1 - channels/polpotv.json | 1 - channels/porn/LIKUOO.json | 16 - channels/porn/LIKUOO.py | 100 - channels/porn/TXXX.json | 16 - channels/porn/TXXX.py | 149 - channels/porn/__init__.py | 12 - channels/porn/absoluporn.json | 15 - channels/porn/absoluporn.py | 95 - channels/porn/alsoporn.json | 14 - channels/porn/alsoporn.py | 99 - channels/porn/analdin.json | 15 - channels/porn/analdin.py | 113 - channels/porn/beeg.json | 14 - channels/porn/beeg.py | 122 - channels/porn/bravoporn.json | 15 - channels/porn/bravoporn.py | 89 - channels/porn/camwhoresbay.json | 15 - channels/porn/camwhoresbay.py | 114 - channels/porn/canalporno.json | 12 - channels/porn/canalporno.py | 92 - channels/porn/cat3plus.json | 14 - channels/porn/cat3plus.py | 130 - channels/porn/cinetemagay.json | 12 - channels/porn/cinetemagay.py | 128 - channels/porn/cliphunter.json | 15 - channels/porn/cliphunter.py | 108 - channels/porn/coomelonitas.json | 15 - channels/porn/coomelonitas.py | 65 - channels/porn/cumlouder.json | 12 - channels/porn/cumlouder.py | 180 - channels/porn/czechvideo.json | 15 - channels/porn/czechvideo.py | 87 - channels/porn/datoporn.json | 12 - channels/porn/datoporn.py | 63 - channels/porn/elreyx.json | 16 - channels/porn/elreyx.py | 98 - channels/porn/eporner.json | 12 - channels/porn/eporner.py | 141 - channels/porn/eroticage.json | 16 - channels/porn/eroticage.py | 80 - channels/porn/eroticasonlinetv.json | 17 - channels/porn/eroticasonlinetv.py | 85 - channels/porn/erotik.json | 14 - channels/porn/erotik.py | 90 - channels/porn/fapality.json | 15 - channels/porn/fapality.py | 97 - channels/porn/fetishshrine.json | 15 - channels/porn/fetishshrine.py | 92 - channels/porn/filmoviXXX.json | 16 - channels/porn/filmoviXXX.py | 46 - channels/porn/filmpornoita.json | 15 - channels/porn/filmpornoita.py | 57 - channels/porn/foxtube.json | 16 - channels/porn/foxtube.py | 123 - channels/porn/freeporn.json | 16 - channels/porn/freeporn.py | 101 - channels/porn/freepornstreams.json | 16 - channels/porn/freepornstreams.py | 95 - channels/porn/gotporn.json | 15 - channels/porn/gotporn.py | 129 - channels/porn/hclips.json | 16 - channels/porn/hclips.py | 118 - channels/porn/hdzog.json | 16 - channels/porn/hdzog.py | 119 - channels/porn/hellporno.json | 16 - channels/porn/hellporno.py | 89 - channels/porn/hentaiid.json | 12 - channels/porn/hentaiid.py | 147 - channels/porn/hotmovs.json | 16 - channels/porn/hotmovs.py | 147 - channels/porn/javlin.json | 15 - channels/porn/javlin.py | 71 - channels/porn/javtasty.json | 21 - channels/porn/javtasty.py | 118 - channels/porn/javus.json | 14 - channels/porn/javus.py | 51 - channels/porn/javwhores.json | 15 - channels/porn/javwhores.py | 103 - channels/porn/jizzbunker.json | 17 - channels/porn/jizzbunker.py | 92 - channels/porn/justporn.json | 16 - channels/porn/justporn.py | 109 - channels/porn/kingsizetits.json | 15 - channels/porn/kingsizetits.py | 95 - channels/porn/mangovideo.json | 15 - channels/porn/mangovideo.py | 109 - channels/porn/mporno.json | 16 - channels/porn/mporno.py | 80 - channels/porn/muchoporno.json | 16 - channels/porn/muchoporno.py | 112 - channels/porn/nuvid.json | 12 - channels/porn/nuvid.py | 115 - channels/porn/pandamovie.json | 16 - channels/porn/pandamovie.py | 110 - channels/porn/peliculaseroticas.json | 12 - channels/porn/peliculaseroticas.py | 40 - channels/porn/pelisxporno.json | 14 - channels/porn/pelisxporno.py | 85 - channels/porn/perfectgirls.json | 16 - channels/porn/perfectgirls.py | 90 - channels/porn/playpornx.json | 14 - channels/porn/playpornx.py | 100 - channels/porn/porn300.json | 16 - channels/porn/porn300.py | 107 - channels/porn/pornboss.json | 16 - channels/porn/pornboss.py | 91 - channels/porn/porndish.json | 15 - channels/porn/porndish.py | 78 - channels/porn/porneq.json | 16 - channels/porn/porneq.py | 72 - channels/porn/pornhive.json | 16 - channels/porn/pornhive.py | 94 - channels/porn/pornhub.json | 15 - channels/porn/pornhub.py | 93 - channels/porn/pornohdmega.json | 15 - channels/porn/pornohdmega.py | 108 - channels/porn/pornrewind.json | 15 - channels/porn/pornrewind.py | 74 - channels/porn/porntrex.json | 21 - channels/porn/porntrex.py | 327 - channels/porn/porntv.json | 15 - channels/porn/porntv.py | 104 - channels/porn/qwertty.json | 15 - channels/porn/qwertty.py | 116 - channels/porn/redtube.json | 15 - channels/porn/redtube.py | 119 - channels/porn/serviporno.json | 14 - channels/porn/serviporno.py | 149 - channels/porn/sexgalaxy.json | 16 - channels/porn/sexgalaxy.py | 89 - channels/porn/sexkino.json | 16 - channels/porn/sexkino.py | 137 - channels/porn/sexofilm.json | 16 - channels/porn/sexofilm.py | 102 - channels/porn/shameless.json | 14 - channels/porn/shameless.py | 95 - channels/porn/siska.json | 15 - channels/porn/siska.py | 89 - channels/porn/sleazemovies.json | 14 - channels/porn/sleazemovies.py | 109 - channels/porn/spankbang.json | 16 - channels/porn/spankbang.py | 97 - channels/porn/spankwire.json | 16 - channels/porn/spankwire.py | 133 - channels/porn/streamingporn.json | 17 - channels/porn/streamingporn.py | 99 - channels/porn/streamporno.json | 17 - channels/porn/streamporno.py | 77 - channels/porn/submityouflicks.json | 14 - channels/porn/submityouflicks.py | 67 - channels/porn/sunporno.json | 16 - channels/porn/sunporno.py | 119 - channels/porn/sxyprn.json | 15 - channels/porn/sxyprn.py | 99 - channels/porn/tabooshare.json | 16 - channels/porn/tabooshare.py | 68 - channels/porn/thumbzilla.json | 37 - channels/porn/thumbzilla.py | 175 - channels/porn/titsbox.json | 15 - channels/porn/titsbox.py | 71 - channels/porn/tnaflix.json | 17 - channels/porn/tnaflix.py | 138 - channels/porn/tryboobs.json | 16 - channels/porn/tryboobs.py | 96 - channels/porn/tubedupe.json | 16 - channels/porn/tubedupe.py | 106 - channels/porn/tubehentai.json | 14 - channels/porn/tubehentai.py | 65 - channels/porn/videosXYZ.json | 16 - channels/porn/videosXYZ.py | 68 - channels/porn/vidz7.json | 22 - channels/porn/vidz7.py | 94 - channels/porn/vintagetube.json | 16 - channels/porn/vintagetube.py | 98 - channels/porn/vintagexxxsex.json | 16 - channels/porn/vintagexxxsex.py | 95 - channels/porn/vivud.json | 15 - channels/porn/vivud.py | 71 - channels/porn/vporn.json | 16 - channels/porn/vporn.py | 121 - channels/porn/watchpornfree.json | 16 - channels/porn/watchpornfree.py | 77 - channels/porn/webpeliculasporno.json | 16 - channels/porn/webpeliculasporno.py | 75 - channels/porn/woodrocket.json | 16 - channels/porn/woodrocket.py | 68 - channels/porn/x18hentai.json | 22 - channels/porn/x18hentai.py | 151 - channels/porn/xhamster.json | 22 - channels/porn/xhamster.py | 155 - channels/porn/xms.json | 37 - channels/porn/xms.py | 246 - channels/porn/xozilla.json | 16 - channels/porn/xozilla.py | 114 - channels/porn/xtapes.json | 16 - channels/porn/xtapes.py | 92 - channels/porn/xvideos.json | 15 - channels/porn/xvideos.py | 121 - channels/porn/xxxdan.json | 17 - channels/porn/xxxdan.py | 99 - channels/porn/xxxfreeinhd.json | 15 - channels/porn/xxxfreeinhd.py | 122 - channels/porn/xxxparodyhd.json | 16 - channels/porn/xxxparodyhd.py | 75 - channels/porn/xxxstreams.json | 16 - channels/porn/xxxstreams.py | 93 - channels/porn/yespornplease.json | 22 - channels/porn/yespornplease.py | 90 - channels/porn/youjizz.json | 16 - channels/porn/youjizz.py | 111 - channels/porn/youporn.json | 16 - channels/porn/youporn.py | 129 - channels/porn/yuuk.json | 16 - channels/porn/yuuk.py | 93 - channels/pufimovies.json | 1 - channels/raiplay.json | 1 - channels/seriehd.json | 1 - channels/serietvonline.json | 1 - channels/serietvonline.py | 14 +- channels/serietvsubita.json | 1 - channels/serietvu.json | 1 - channels/streamingaltadefinizione.json | 1 - channels/streamingaltadefinizione.py | 10 +- channels/streamtime.json | 1 - channels/tantifilm.json | 1 - channels/toonitalia.json | 3 +- channels/tunein.json | 1 - channels/tunein.py | 1 + channels/vedohd.json | 1 - channels/vvvvid.json | 1 - channelselector.py | 189 +- core/channeltools.py | 29 +- core/downloadtools.py | 2 +- core/httptools.py | 45 +- core/item.py | 2 +- core/jsontools.py | 12 +- core/support.py | 103 +- core/tmdb.py | 4 +- core/videolibrarytools.py | 119 +- lib/babelfish/__init__.py | 25 + lib/babelfish/converters/__init__.py | 289 + lib/babelfish/converters/alpha2.py | 17 + lib/babelfish/converters/alpha3b.py | 17 + lib/babelfish/converters/alpha3t.py | 17 + lib/babelfish/converters/countryname.py | 31 + lib/babelfish/converters/name.py | 17 + lib/babelfish/converters/opensubtitles.py | 36 + lib/babelfish/converters/scope.py | 23 + lib/babelfish/converters/type.py | 23 + lib/babelfish/country.py | 108 + lib/babelfish/data/iso-3166-1.txt | 250 + lib/babelfish/data/iso-639-3.tab | 7875 +++++++++++++++++ lib/babelfish/data/iso15924-utf8-20131012.txt | 176 + .../data/opensubtitles_languages.txt | 474 + lib/babelfish/exceptions.py | 85 + lib/babelfish/language.py | 186 + lib/babelfish/script.py | 78 + lib/btserver/__init__.py | 5 - lib/btserver/cache.py | 92 - lib/btserver/client.py | 669 -- lib/btserver/cursor.py | 106 - lib/btserver/dispatcher.py | 39 - lib/btserver/file.py | 39 - lib/btserver/handler.py | 135 - lib/btserver/monitor.py | 44 - lib/btserver/resume_data.py | 15 - lib/btserver/server.py | 37 - lib/cloudscraper/__init__.py | 12 +- lib/cloudscraper/interpreters/encapsulated.py | 8 +- lib/cloudscraper/interpreters/native.py | 108 +- lib/dateutil/__init__.py | 9 + lib/dateutil/easter.py | 92 + lib/dateutil/parser.py | 886 ++ lib/dateutil/relativedelta.py | 432 + lib/dateutil/rrule.py | 1108 +++ lib/dateutil/tz.py | 958 ++ lib/dateutil/tzwin.py | 180 + lib/dateutil/zoneinfo/__init__.py | 85 + lib/dateutil/zoneinfo/zoneinfo-2012c.tar.gz | Bin 0 -> 86841 bytes lib/dns/LICENSE | 35 - lib/dns/README.md | 665 -- lib/dns/__init__.py | 59 - lib/dns/_compat.py | 59 - lib/dns/dnssec.py | 519 -- lib/dns/dnssec.pyi | 19 - lib/dns/e164.py | 105 - lib/dns/e164.pyi | 10 - lib/dns/edns.py | 269 - lib/dns/entropy.py | 148 - lib/dns/entropy.pyi | 10 - lib/dns/exception.py | 128 - lib/dns/exception.pyi | 9 - lib/dns/flags.py | 130 - lib/dns/grange.py | 69 - lib/dns/hash.py | 37 - lib/dns/inet.py | 124 - lib/dns/inet.pyi | 4 - lib/dns/ipv4.py | 63 - lib/dns/ipv6.py | 181 - lib/dns/message.py | 1175 --- lib/dns/message.pyi | 55 - lib/dns/name.py | 994 --- lib/dns/name.pyi | 35 - lib/dns/namedict.py | 108 - lib/dns/node.py | 182 - lib/dns/node.pyi | 17 - lib/dns/opcode.py | 119 - lib/dns/py.typed | 0 lib/dns/query.py | 683 -- lib/dns/query.pyi | 15 - lib/dns/rcode.py | 144 - lib/dns/rdata.py | 456 - lib/dns/rdata.pyi | 17 - lib/dns/rdataclass.py | 122 - lib/dns/rdataset.py | 347 - lib/dns/rdataset.pyi | 58 - lib/dns/rdatatype.py | 287 - lib/dns/rdtypes/ANY/AFSDB.py | 55 - lib/dns/rdtypes/ANY/AVC.py | 25 - lib/dns/rdtypes/ANY/CAA.py | 75 - lib/dns/rdtypes/ANY/CDNSKEY.py | 27 - lib/dns/rdtypes/ANY/CDS.py | 23 - lib/dns/rdtypes/ANY/CERT.py | 123 - lib/dns/rdtypes/ANY/CNAME.py | 27 - lib/dns/rdtypes/ANY/CSYNC.py | 126 - lib/dns/rdtypes/ANY/DLV.py | 23 - lib/dns/rdtypes/ANY/DNAME.py | 26 - lib/dns/rdtypes/ANY/DNSKEY.py | 27 - lib/dns/rdtypes/ANY/DS.py | 23 - lib/dns/rdtypes/ANY/EUI48.py | 29 - lib/dns/rdtypes/ANY/EUI64.py | 29 - lib/dns/rdtypes/ANY/GPOS.py | 162 - lib/dns/rdtypes/ANY/HINFO.py | 86 - lib/dns/rdtypes/ANY/HIP.py | 115 - lib/dns/rdtypes/ANY/ISDN.py | 99 - lib/dns/rdtypes/ANY/LOC.py | 327 - lib/dns/rdtypes/ANY/MX.py | 23 - lib/dns/rdtypes/ANY/NINFO.py | 24 - lib/dns/rdtypes/ANY/NS.py | 23 - lib/dns/rdtypes/ANY/NSEC.py | 128 - lib/dns/rdtypes/ANY/NSEC3.py | 196 - lib/dns/rdtypes/ANY/NSEC3PARAM.py | 90 - lib/dns/rdtypes/ANY/OPENPGPKEY.py | 60 - lib/dns/rdtypes/ANY/PTR.py | 23 - lib/dns/rdtypes/ANY/RP.py | 82 - lib/dns/rdtypes/ANY/RRSIG.py | 158 - lib/dns/rdtypes/ANY/RT.py | 23 - lib/dns/rdtypes/ANY/SOA.py | 116 - lib/dns/rdtypes/ANY/SPF.py | 25 - lib/dns/rdtypes/ANY/SSHFP.py | 79 - lib/dns/rdtypes/ANY/TLSA.py | 84 - lib/dns/rdtypes/ANY/TXT.py | 23 - lib/dns/rdtypes/ANY/URI.py | 82 - lib/dns/rdtypes/ANY/X25.py | 66 - lib/dns/rdtypes/ANY/__init__.py | 57 - lib/dns/rdtypes/CH/A.py | 70 - lib/dns/rdtypes/CH/__init__.py | 22 - lib/dns/rdtypes/IN/A.py | 54 - lib/dns/rdtypes/IN/AAAA.py | 55 - lib/dns/rdtypes/IN/APL.py | 165 - lib/dns/rdtypes/IN/DHCID.py | 61 - lib/dns/rdtypes/IN/IPSECKEY.py | 150 - lib/dns/rdtypes/IN/KX.py | 23 - lib/dns/rdtypes/IN/NAPTR.py | 127 - lib/dns/rdtypes/IN/NSAP.py | 60 - lib/dns/rdtypes/IN/NSAP_PTR.py | 23 - lib/dns/rdtypes/IN/PX.py | 89 - lib/dns/rdtypes/IN/SRV.py | 83 - lib/dns/rdtypes/IN/WKS.py | 107 - lib/dns/rdtypes/IN/__init__.py | 33 - lib/dns/rdtypes/__init__.py | 27 - lib/dns/rdtypes/dnskeybase.py | 138 - lib/dns/rdtypes/dnskeybase.pyi | 37 - lib/dns/rdtypes/dsbase.py | 85 - lib/dns/rdtypes/euibase.py | 71 - lib/dns/rdtypes/mxbase.py | 103 - lib/dns/rdtypes/nsbase.py | 83 - lib/dns/rdtypes/txtbase.py | 97 - lib/dns/rdtypes/txtbase.pyi | 6 - lib/dns/renderer.py | 291 - lib/dns/resolver.py | 1383 --- lib/dns/resolver.pyi | 31 - lib/dns/reversename.py | 96 - lib/dns/reversename.pyi | 6 - lib/dns/rrset.py | 189 - lib/dns/rrset.pyi | 10 - lib/dns/set.py | 261 - lib/dns/tokenizer.py | 571 -- lib/dns/tsig.py | 236 - lib/dns/tsigkeyring.py | 50 - lib/dns/tsigkeyring.pyi | 7 - lib/dns/ttl.py | 70 - lib/dns/update.py | 279 - lib/dns/update.pyi | 21 - lib/dns/version.py | 43 - lib/dns/wiredata.py | 103 - lib/dns/zone.py | 1127 --- lib/dns/zone.pyi | 55 - lib/guessit/__init__.py | 14 + lib/guessit/__main__.py | 180 + lib/guessit/__version__.py | 7 + lib/guessit/api.py | 263 + lib/guessit/backports.py | 27 + lib/guessit/config/options.json | 586 ++ lib/guessit/jsonutils.py | 22 + lib/guessit/monkeypatch.py | 34 + lib/guessit/options.py | 295 + lib/guessit/reutils.py | 35 + lib/guessit/rules/__init__.py | 99 + lib/guessit/rules/common/__init__.py | 15 + lib/guessit/rules/common/comparators.py | 75 + lib/guessit/rules/common/date.py | 125 + lib/guessit/rules/common/expected.py | 53 + lib/guessit/rules/common/formatters.py | 136 + lib/guessit/rules/common/numeral.py | 165 + lib/guessit/rules/common/pattern.py | 27 + lib/guessit/rules/common/quantity.py | 106 + lib/guessit/rules/common/validators.py | 74 + lib/guessit/rules/common/words.py | 34 + lib/guessit/rules/markers/__init__.py | 5 + lib/guessit/rules/markers/groups.py | 52 + lib/guessit/rules/markers/path.py | 47 + lib/guessit/rules/match_processors.py | 20 + lib/guessit/rules/processors.py | 259 + lib/guessit/rules/properties/__init__.py | 5 + lib/guessit/rules/properties/audio_codec.py | 235 + lib/guessit/rules/properties/bit_rate.py | 74 + lib/guessit/rules/properties/bonus.py | 56 + lib/guessit/rules/properties/cds.py | 41 + lib/guessit/rules/properties/container.py | 61 + lib/guessit/rules/properties/country.py | 114 + lib/guessit/rules/properties/crc.py | 90 + lib/guessit/rules/properties/date.py | 84 + lib/guessit/rules/properties/edition.py | 52 + lib/guessit/rules/properties/episode_title.py | 300 + lib/guessit/rules/properties/episodes.py | 912 ++ lib/guessit/rules/properties/film.py | 48 + lib/guessit/rules/properties/language.py | 510 ++ lib/guessit/rules/properties/mimetype.py | 55 + lib/guessit/rules/properties/other.py | 383 + lib/guessit/rules/properties/part.py | 46 + lib/guessit/rules/properties/release_group.py | 347 + lib/guessit/rules/properties/screen_size.py | 163 + lib/guessit/rules/properties/size.py | 30 + lib/guessit/rules/properties/source.py | 235 + .../rules/properties/streaming_service.py | 78 + lib/guessit/rules/properties/title.py | 349 + lib/guessit/rules/properties/type.py | 83 + lib/guessit/rules/properties/video_codec.py | 126 + lib/guessit/rules/properties/website.py | 110 + lib/guessit/test/__init__.py | 3 + lib/guessit/test/config/dummy.txt | 1 + lib/guessit/test/config/test.json | 4 + lib/guessit/test/config/test.yaml | 4 + lib/guessit/test/config/test.yml | 4 + .../test/enable_disable_properties.yml | 335 + lib/guessit/test/episodes.yml | 4693 ++++++++++ lib/guessit/test/movies.yml | 1786 ++++ lib/guessit/test/rules/__init__.py | 3 + lib/guessit/test/rules/audio_codec.yml | 134 + lib/guessit/test/rules/bonus.yml | 9 + lib/guessit/test/rules/cds.yml | 10 + lib/guessit/test/rules/common_words.yml | 467 + lib/guessit/test/rules/country.yml | 13 + lib/guessit/test/rules/date.yml | 50 + lib/guessit/test/rules/edition.yml | 63 + lib/guessit/test/rules/episodes.yml | 331 + lib/guessit/test/rules/film.yml | 9 + lib/guessit/test/rules/language.yml | 47 + lib/guessit/test/rules/other.yml | 169 + lib/guessit/test/rules/part.yml | 18 + lib/guessit/test/rules/processors.yml | 8 + lib/guessit/test/rules/processors_test.py | 46 + lib/guessit/test/rules/release_group.yml | 71 + lib/guessit/test/rules/screen_size.yml | 280 + lib/guessit/test/rules/size.yml | 8 + lib/guessit/test/rules/source.yml | 323 + lib/guessit/test/rules/title.yml | 43 + lib/guessit/test/rules/video_codec.yml | 98 + lib/guessit/test/rules/website.yml | 23 + lib/guessit/test/streaming_services.yaml | 1934 ++++ lib/guessit/test/suggested.json | 21 + lib/guessit/test/test-input-file.txt | 2 + lib/guessit/test/test_api.py | 83 + lib/guessit/test/test_api_unicode_literals.py | 74 + lib/guessit/test/test_benchmark.py | 52 + lib/guessit/test/test_main.py | 72 + lib/guessit/test/test_options.py | 175 + lib/guessit/test/test_yml.py | 297 + lib/guessit/test/various.yml | 1199 +++ lib/guessit/tlds-alpha-by-domain.txt | 341 + lib/guessit/yamlutils.py | 81 + lib/libtorrent.pyd | Bin 2427392 -> 0 bytes lib/pyparsing.py | 7107 +++++++++++++++ lib/python_libtorrent/__init__.py | 24 - .../android_armv7/0.16.19/__init__.py | 24 - .../0.16.19/libtorrent.so.size.txt | 1 - .../android_armv7/1.0.6/__init__.py | 24 - .../1.0.6/libtorrent.so.size.txt | 1 - .../android_armv7/1.0.7/__init__.py | 24 - .../1.0.7/libtorrent.so.size.txt | 1 - .../android_armv7/1.0.8/__init__.py | 24 - .../1.0.8/libtorrent.so.size.txt | 1 - .../android_armv7/1.0.9/__init__.py | 24 - .../1.0.9/libtorrent.so.size.txt | 1 - .../android_armv7/1.1.0/__init__.py | 24 - .../1.1.0/libtorrent.so.size.txt | 1 - .../android_armv7/1.1.1/__init__.py | 24 - .../1.1.1/libtorrent.so.size.txt | 1 - .../android_armv7/__init__.py | 24 - .../android_x86/0.16.19/__init__.py | 24 - .../0.16.19/libtorrent.so.size.txt | 1 - .../android_x86/1.0.6/__init__.py | 24 - .../android_x86/1.0.6/libtorrent.so.size.txt | 1 - .../android_x86/1.0.7/__init__.py | 24 - .../android_x86/1.0.7/libtorrent.so.size.txt | 1 - .../android_x86/1.0.8/__init__.py | 24 - .../android_x86/1.0.8/libtorrent.so.size.txt | 1 - .../android_x86/1.0.9/__init__.py | 24 - .../android_x86/1.0.9/libtorrent.so.size.txt | 1 - .../android_x86/1.1.0/__init__.py | 24 - .../android_x86/1.1.0/libtorrent.so.size.txt | 1 - .../android_x86/1.1.1/__init__.py | 24 - .../android_x86/1.1.1/libtorrent.so.size.txt | 1 - lib/python_libtorrent/android_x86/__init__.py | 24 - .../darwin/0.16.19/__init__.py | 24 - .../darwin/0.16.19/libtorrent.so.size.txt | 1 - .../darwin/1.0.9/__init__.py | 24 - .../darwin/1.0.9/libtorrent.so.size.txt | 1 - .../darwin/1.1.0/__init__.py | 24 - .../darwin/1.1.0/libtorrent.so.size.txt | 1 - .../darwin/1.1.1/__init__.py | 24 - .../darwin/1.1.1/libtorrent.so.size.txt | 1 - lib/python_libtorrent/darwin/__init__.py | 24 - .../ios_arm/1.0.7/__init__.py | 24 - .../ios_arm/1.0.7/libtorrent.so.size.txt | 1 - .../ios_arm/1.0.8/__init__.py | 24 - .../ios_arm/1.0.8/libtorrent.so.size.txt | 1 - .../ios_arm/1.0.9/__init__.py | 24 - .../ios_arm/1.0.9/libtorrent.so.size.txt | 1 - .../ios_arm/1.1.1/__init__.py | 24 - .../ios_arm/1.1.1/libtorrent.so.size.txt | 1 - lib/python_libtorrent/ios_arm/__init__.py | 24 - .../linux_aarch64_ucs2/1.1.0/__init__.py | 24 - .../1.1.0/libtorrent.so.size.txt | 1 - .../linux_aarch64_ucs2/__init__.py | 24 - .../linux_aarch64_ucs4/1.1.0/__init__.py | 24 - .../1.1.0/libtorrent.so.size.txt | 1 - .../linux_aarch64_ucs4/1.1.1/__init__.py | 24 - .../1.1.1/libtorrent.so.size.txt | 1 - .../linux_aarch64_ucs4/__init__.py | 24 - .../linux_armv6/0.16.19/__init__.py | 24 - .../0.16.19/libtorrent.so.size.txt | 1 - .../linux_armv6/1.0.11/__init__.py | 24 - .../linux_armv6/1.0.11/libtorrent.so.size.txt | 1 - .../linux_armv6/1.0.6/__init__.py | 24 - .../linux_armv6/1.0.6/libtorrent.so.size.txt | 1 - .../linux_armv6/1.0.7/__init__.py | 24 - .../linux_armv6/1.0.7/libtorrent.so.size.txt | 1 - .../linux_armv6/1.0.9/__init__.py | 24 - .../linux_armv6/1.0.9/libtorrent.so.size.txt | 1 - .../linux_armv6/1.1.0/__init__.py | 24 - .../linux_armv6/1.1.0/libtorrent.so.size.txt | 1 - .../linux_armv6/1.1.1/__init__.py | 24 - .../linux_armv6/1.1.1/libtorrent.so.size.txt | 1 - .../linux_armv6/1.1.6/__init__.py | 24 - .../linux_armv6/1.1.6/libtorrent.so.size.txt | 1 - .../linux_armv6/1.1.7/__init__.py | 24 - .../linux_armv6/1.1.7/libtorrent.so.size.txt | 1 - lib/python_libtorrent/linux_armv6/__init__.py | 24 - .../linux_armv7/0.16.19/__init__.py | 24 - .../0.16.19/libtorrent.so.size.txt | 1 - .../linux_armv7/1.0.6/__init__.py | 24 - .../linux_armv7/1.0.6/libtorrent.so.size.txt | 1 - .../linux_armv7/1.0.7/__init__.py | 24 - .../linux_armv7/1.0.7/libtorrent.so.size.txt | 1 - .../linux_armv7/1.0.9/__init__.py | 24 - .../linux_armv7/1.0.9/libtorrent.so.size.txt | 1 - .../linux_armv7/1.1.0/__init__.py | 24 - .../linux_armv7/1.1.0/libtorrent.so.size.txt | 1 - .../linux_armv7/1.1.1/__init__.py | 24 - .../linux_armv7/1.1.1/libtorrent.so.size.txt | 1 - lib/python_libtorrent/linux_armv7/__init__.py | 24 - .../linux_mips/1.0.9/__init__.py | 24 - .../linux_mips/1.0.9/libtorrent.so.size.txt | 1 - lib/python_libtorrent/linux_mips/__init__.py | 24 - .../linux_mipsel_ucs2/1.0.9/__init__.py | 24 - .../1.0.9/libtorrent.so.size.txt | 1 - .../linux_mipsel_ucs2/1.1.0/__init__.py | 24 - .../1.1.0/libtorrent.so.size.txt | 1 - .../linux_mipsel_ucs2/__init__.py | 24 - .../linux_mipsel_ucs4/1.0.9/__init__.py | 24 - .../1.0.9/libtorrent.so.size.txt | 1 - .../linux_mipsel_ucs4/1.1.0/__init__.py | 24 - .../1.1.0/libtorrent.so.size.txt | 1 - .../linux_mipsel_ucs4/__init__.py | 24 - .../linux_x86/0.16.19/__init__.py | 24 - .../linux_x86/0.16.19/libtorrent.so.size.txt | 1 - .../linux_x86/1.0.6/__init__.py | 24 - .../linux_x86/1.0.6/libtorrent.so.size.txt | 1 - .../linux_x86/1.0.7/__init__.py | 24 - .../linux_x86/1.0.7/libtorrent.so.size.txt | 1 - .../linux_x86/1.0.9/__init__.py | 24 - .../linux_x86/1.0.9/libtorrent.so.size.txt | 1 - .../linux_x86/1.1.0/__init__.py | 24 - .../linux_x86/1.1.0/libtorrent.so.size.txt | 1 - .../linux_x86/1.1.1/__init__.py | 24 - .../linux_x86/1.1.1/libtorrent.so.size.txt | 1 - lib/python_libtorrent/linux_x86/__init__.py | 24 - .../linux_x86_64/0.16.19/__init__.py | 24 - .../0.16.19/libtorrent.so.size.txt | 1 - .../linux_x86_64/1.0.6/__init__.py | 24 - .../linux_x86_64/1.0.6/libtorrent.so.size.txt | 1 - .../linux_x86_64/1.0.7/__init__.py | 24 - .../linux_x86_64/1.0.7/libtorrent.so.size.txt | 1 - .../linux_x86_64/1.0.9/__init__.py | 24 - .../linux_x86_64/1.0.9/libtorrent.so.size.txt | 1 - .../linux_x86_64/1.1.0/__init__.py | 24 - .../linux_x86_64/1.1.0/libtorrent.so.size.txt | 1 - .../linux_x86_64/1.1.1/__init__.py | 24 - .../linux_x86_64/1.1.1/libtorrent.so.size.txt | 1 - lib/python_libtorrent/platform_pulsar.py | 198 - lib/python_libtorrent/public.py | 83 - .../python_libtorrent/__init__.py | 243 - .../python_libtorrent/functions.py | 187 - .../python_libtorrent/net.py | 332 - .../python_libtorrent/platform_pulsar.py | 208 - .../windows/0.16.19/__init__.py | 24 - .../windows/0.16.19/libtorrent.pyd.size.txt | 1 - .../windows/1.0.6/__init__.py | 24 - .../windows/1.0.6/libtorrent.pyd.size.txt | 1 - .../windows/1.0.8/__init__.py | 24 - .../windows/1.0.8/libtorrent.pyd.size.txt | 1 - .../windows/1.0.9/__init__.py | 24 - .../windows/1.0.9/libtorrent.pyd.size.txt | 1 - .../windows/1.1.1/__init__.py | 24 - .../windows/1.1.1/libtorrent.pyd.size.txt | 1 - .../windows/1.2.2/__init__.py | 24 - .../windows/1.2.2/libtorrent.pyd.size.txt | 1 - .../windows/1.2.3/__init__.py | 24 - .../windows/1.2.3/libtorrent.pyd.size.txt | 1 - lib/python_libtorrent/windows/__init__.py | 24 - .../windows_x64/1.2.2/__init__.py | 24 - .../windows_x64/1.2.2/libtorrent.pyd | Bin 4290048 -> 0 bytes .../windows_x64/1.2.2/libtorrent.pyd.size.txt | 1 - .../windows_x64/1.2.3/__init__.py | 24 - .../windows_x64/1.2.3/libtorrent.pyd.size.txt | 1 - lib/python_libtorrent/windows_x64/__init__.py | 24 - lib/quasar/daemon.py | 295 - lib/quasar/navigation.py | 260 - lib/quasar/osarch.py | 56 - lib/quasar/util.py | 72 - lib/rebulk/__init__.py | 10 + lib/rebulk/__version__.py | 7 + lib/rebulk/builder.py | 217 + lib/rebulk/chain.py | 380 + lib/rebulk/debug.py | 56 + lib/rebulk/formatters.py | 33 + lib/rebulk/introspector.py | 127 + lib/rebulk/loose.py | 242 + lib/rebulk/match.py | 890 ++ lib/rebulk/pattern.py | 559 ++ lib/rebulk/processors.py | 107 + lib/rebulk/rebulk.py | 190 + lib/rebulk/remodule.py | 17 + lib/rebulk/rules.py | 373 + lib/rebulk/toposort.py | 84 + lib/rebulk/utils.py | 156 + lib/rebulk/validators.py | 81 + lib/schedule.py | 617 ++ lib/torrentool/__init__.py | 1 + lib/torrentool/api.py | 7 + lib/torrentool/bencode.py | 204 + lib/torrentool/cli.py | 94 + lib/torrentool/exceptions.py | 27 + lib/torrentool/repo/open_trackers.ini | 8 + lib/torrentool/torrent.py | 436 + lib/torrentool/utils.py | 91 + platformcode/config.py | 78 +- platformcode/custom_code.py | 182 +- platformcode/envtal.py | 231 +- platformcode/keymaptools.py | 120 +- platformcode/launcher.py | 58 +- platformcode/platformtools.py | 1110 +-- platformcode/updater.py | 20 +- platformcode/xbmc_config_menu.py | 606 +- platformcode/xbmc_info_window.py | 29 +- platformcode/xbmc_videolibrary.py | 173 +- resources/language/English/strings.po | 182 +- resources/language/Italian/strings.po | 302 +- resources/settings.xml | 60 +- .../skins/Default/720p/ChannelSettings.xml | 129 +- .../skins/Default/720p/DarkShortCutMenu.xml | 64 +- resources/skins/Default/720p/InfoWindow.xml | 281 +- resources/skins/Default/720p/ShortCutMenu.xml | 46 +- resources/views/skin.ace2.json | 44 - resources/views/skin.aeon.nox.silvo.json | 109 - resources/views/skin.aeon.tajo.json | 50 - resources/views/skin.aeonmq8.json | 96 - resources/views/skin.amber.json | 62 - resources/views/skin.apptv.json | 45 - resources/views/skin.arctic.zephyr.2.json | 81 - resources/views/skin.aura.json | 78 - resources/views/skin.bello.7.json | 76 - resources/views/skin.blackglassnova.json | 67 - resources/views/skin.box.json | 46 - resources/views/skin.confluence.json | 55 - resources/views/skin.eminence.2.json | 92 - resources/views/skin.estuary.json | 54 - resources/views/skin.phenomenal.json | 62 - resources/views/skin.quartz.json | 66 - resources/views/skin.rapier.json | 51 - resources/views/skin.revolve.json | 68 - resources/views/skin.unity.json | 61 - servers/torrent.py | 1538 +--- servers/upstream.json | 4 +- servers/vupplayer.json | 4 +- service.py | 836 +- specials/autoplay.py | 51 +- specials/backup.py | 17 +- specials/checkhost.py | 29 +- specials/community.json | 1 - specials/downloads.json | 1 - specials/downloads.py | 347 +- specials/filmontv.json | 1 - specials/help.json | 1 - specials/news.json | 1 - specials/news.py | 10 +- specials/resolverdns.py | 6 +- specials/search.json | 1 - specials/search.py | 40 +- specials/setting.py | 276 +- specials/shortcuts.py | 40 +- specials/trailertools.py | 2 +- specials/tvmoviedb.json | 1 - specials/url.json | 1 - specials/videolibrary.json | 138 +- specials/videolibrary.py | 178 +- 778 files changed, 49736 insertions(+), 40697 deletions(-) delete mode 100644 channels/porn/LIKUOO.json delete mode 100644 channels/porn/LIKUOO.py delete mode 100644 channels/porn/TXXX.json delete mode 100644 channels/porn/TXXX.py delete mode 100644 channels/porn/__init__.py delete mode 100644 channels/porn/absoluporn.json delete mode 100644 channels/porn/absoluporn.py delete mode 100644 channels/porn/alsoporn.json delete mode 100644 channels/porn/alsoporn.py delete mode 100644 channels/porn/analdin.json delete mode 100644 channels/porn/analdin.py delete mode 100755 channels/porn/beeg.json delete mode 100755 channels/porn/beeg.py delete mode 100644 channels/porn/bravoporn.json delete mode 100644 channels/porn/bravoporn.py delete mode 100644 channels/porn/camwhoresbay.json delete mode 100644 channels/porn/camwhoresbay.py delete mode 100644 channels/porn/canalporno.json delete mode 100644 channels/porn/canalporno.py delete mode 100644 channels/porn/cat3plus.json delete mode 100644 channels/porn/cat3plus.py delete mode 100644 channels/porn/cinetemagay.json delete mode 100644 channels/porn/cinetemagay.py delete mode 100644 channels/porn/cliphunter.json delete mode 100644 channels/porn/cliphunter.py delete mode 100644 channels/porn/coomelonitas.json delete mode 100644 channels/porn/coomelonitas.py delete mode 100644 channels/porn/cumlouder.json delete mode 100644 channels/porn/cumlouder.py delete mode 100644 channels/porn/czechvideo.json delete mode 100644 channels/porn/czechvideo.py delete mode 100644 channels/porn/datoporn.json delete mode 100644 channels/porn/datoporn.py delete mode 100644 channels/porn/elreyx.json delete mode 100644 channels/porn/elreyx.py delete mode 100644 channels/porn/eporner.json delete mode 100644 channels/porn/eporner.py delete mode 100644 channels/porn/eroticage.json delete mode 100644 channels/porn/eroticage.py delete mode 100644 channels/porn/eroticasonlinetv.json delete mode 100644 channels/porn/eroticasonlinetv.py delete mode 100644 channels/porn/erotik.json delete mode 100644 channels/porn/erotik.py delete mode 100644 channels/porn/fapality.json delete mode 100644 channels/porn/fapality.py delete mode 100644 channels/porn/fetishshrine.json delete mode 100644 channels/porn/fetishshrine.py delete mode 100644 channels/porn/filmoviXXX.json delete mode 100644 channels/porn/filmoviXXX.py delete mode 100644 channels/porn/filmpornoita.json delete mode 100644 channels/porn/filmpornoita.py delete mode 100644 channels/porn/foxtube.json delete mode 100644 channels/porn/foxtube.py delete mode 100644 channels/porn/freeporn.json delete mode 100644 channels/porn/freeporn.py delete mode 100644 channels/porn/freepornstreams.json delete mode 100644 channels/porn/freepornstreams.py delete mode 100755 channels/porn/gotporn.json delete mode 100755 channels/porn/gotporn.py delete mode 100644 channels/porn/hclips.json delete mode 100644 channels/porn/hclips.py delete mode 100644 channels/porn/hdzog.json delete mode 100644 channels/porn/hdzog.py delete mode 100644 channels/porn/hellporno.json delete mode 100644 channels/porn/hellporno.py delete mode 100644 channels/porn/hentaiid.json delete mode 100644 channels/porn/hentaiid.py delete mode 100644 channels/porn/hotmovs.json delete mode 100644 channels/porn/hotmovs.py delete mode 100644 channels/porn/javlin.json delete mode 100644 channels/porn/javlin.py delete mode 100644 channels/porn/javtasty.json delete mode 100644 channels/porn/javtasty.py delete mode 100644 channels/porn/javus.json delete mode 100644 channels/porn/javus.py delete mode 100644 channels/porn/javwhores.json delete mode 100644 channels/porn/javwhores.py delete mode 100644 channels/porn/jizzbunker.json delete mode 100644 channels/porn/jizzbunker.py delete mode 100644 channels/porn/justporn.json delete mode 100644 channels/porn/justporn.py delete mode 100755 channels/porn/kingsizetits.json delete mode 100755 channels/porn/kingsizetits.py delete mode 100755 channels/porn/mangovideo.json delete mode 100755 channels/porn/mangovideo.py delete mode 100644 channels/porn/mporno.json delete mode 100644 channels/porn/mporno.py delete mode 100644 channels/porn/muchoporno.json delete mode 100644 channels/porn/muchoporno.py delete mode 100644 channels/porn/nuvid.json delete mode 100644 channels/porn/nuvid.py delete mode 100644 channels/porn/pandamovie.json delete mode 100644 channels/porn/pandamovie.py delete mode 100644 channels/porn/peliculaseroticas.json delete mode 100644 channels/porn/peliculaseroticas.py delete mode 100644 channels/porn/pelisxporno.json delete mode 100644 channels/porn/pelisxporno.py delete mode 100644 channels/porn/perfectgirls.json delete mode 100644 channels/porn/perfectgirls.py delete mode 100644 channels/porn/playpornx.json delete mode 100644 channels/porn/playpornx.py delete mode 100644 channels/porn/porn300.json delete mode 100644 channels/porn/porn300.py delete mode 100644 channels/porn/pornboss.json delete mode 100644 channels/porn/pornboss.py delete mode 100755 channels/porn/porndish.json delete mode 100755 channels/porn/porndish.py delete mode 100644 channels/porn/porneq.json delete mode 100644 channels/porn/porneq.py delete mode 100644 channels/porn/pornhive.json delete mode 100644 channels/porn/pornhive.py delete mode 100644 channels/porn/pornhub.json delete mode 100644 channels/porn/pornhub.py delete mode 100755 channels/porn/pornohdmega.json delete mode 100755 channels/porn/pornohdmega.py delete mode 100644 channels/porn/pornrewind.json delete mode 100644 channels/porn/pornrewind.py delete mode 100644 channels/porn/porntrex.json delete mode 100644 channels/porn/porntrex.py delete mode 100755 channels/porn/porntv.json delete mode 100755 channels/porn/porntv.py delete mode 100644 channels/porn/qwertty.json delete mode 100644 channels/porn/qwertty.py delete mode 100644 channels/porn/redtube.json delete mode 100644 channels/porn/redtube.py delete mode 100644 channels/porn/serviporno.json delete mode 100644 channels/porn/serviporno.py delete mode 100644 channels/porn/sexgalaxy.json delete mode 100644 channels/porn/sexgalaxy.py delete mode 100644 channels/porn/sexkino.json delete mode 100644 channels/porn/sexkino.py delete mode 100644 channels/porn/sexofilm.json delete mode 100644 channels/porn/sexofilm.py delete mode 100755 channels/porn/shameless.json delete mode 100755 channels/porn/shameless.py delete mode 100644 channels/porn/siska.json delete mode 100644 channels/porn/siska.py delete mode 100644 channels/porn/sleazemovies.json delete mode 100644 channels/porn/sleazemovies.py delete mode 100644 channels/porn/spankbang.json delete mode 100644 channels/porn/spankbang.py delete mode 100644 channels/porn/spankwire.json delete mode 100644 channels/porn/spankwire.py delete mode 100644 channels/porn/streamingporn.json delete mode 100644 channels/porn/streamingporn.py delete mode 100644 channels/porn/streamporno.json delete mode 100644 channels/porn/streamporno.py delete mode 100644 channels/porn/submityouflicks.json delete mode 100644 channels/porn/submityouflicks.py delete mode 100644 channels/porn/sunporno.json delete mode 100644 channels/porn/sunporno.py delete mode 100755 channels/porn/sxyprn.json delete mode 100755 channels/porn/sxyprn.py delete mode 100644 channels/porn/tabooshare.json delete mode 100644 channels/porn/tabooshare.py delete mode 100644 channels/porn/thumbzilla.json delete mode 100644 channels/porn/thumbzilla.py delete mode 100755 channels/porn/titsbox.json delete mode 100755 channels/porn/titsbox.py delete mode 100644 channels/porn/tnaflix.json delete mode 100644 channels/porn/tnaflix.py delete mode 100644 channels/porn/tryboobs.json delete mode 100644 channels/porn/tryboobs.py delete mode 100644 channels/porn/tubedupe.json delete mode 100644 channels/porn/tubedupe.py delete mode 100644 channels/porn/tubehentai.json delete mode 100644 channels/porn/tubehentai.py delete mode 100644 channels/porn/videosXYZ.json delete mode 100644 channels/porn/videosXYZ.py delete mode 100644 channels/porn/vidz7.json delete mode 100644 channels/porn/vidz7.py delete mode 100644 channels/porn/vintagetube.json delete mode 100644 channels/porn/vintagetube.py delete mode 100644 channels/porn/vintagexxxsex.json delete mode 100644 channels/porn/vintagexxxsex.py delete mode 100755 channels/porn/vivud.json delete mode 100755 channels/porn/vivud.py delete mode 100644 channels/porn/vporn.json delete mode 100644 channels/porn/vporn.py delete mode 100644 channels/porn/watchpornfree.json delete mode 100644 channels/porn/watchpornfree.py delete mode 100644 channels/porn/webpeliculasporno.json delete mode 100644 channels/porn/webpeliculasporno.py delete mode 100644 channels/porn/woodrocket.json delete mode 100644 channels/porn/woodrocket.py delete mode 100644 channels/porn/x18hentai.json delete mode 100644 channels/porn/x18hentai.py delete mode 100644 channels/porn/xhamster.json delete mode 100644 channels/porn/xhamster.py delete mode 100644 channels/porn/xms.json delete mode 100644 channels/porn/xms.py delete mode 100644 channels/porn/xozilla.json delete mode 100644 channels/porn/xozilla.py delete mode 100644 channels/porn/xtapes.json delete mode 100644 channels/porn/xtapes.py delete mode 100755 channels/porn/xvideos.json delete mode 100755 channels/porn/xvideos.py delete mode 100644 channels/porn/xxxdan.json delete mode 100644 channels/porn/xxxdan.py delete mode 100644 channels/porn/xxxfreeinhd.json delete mode 100644 channels/porn/xxxfreeinhd.py delete mode 100644 channels/porn/xxxparodyhd.json delete mode 100644 channels/porn/xxxparodyhd.py delete mode 100644 channels/porn/xxxstreams.json delete mode 100644 channels/porn/xxxstreams.py delete mode 100644 channels/porn/yespornplease.json delete mode 100644 channels/porn/yespornplease.py delete mode 100644 channels/porn/youjizz.json delete mode 100644 channels/porn/youjizz.py delete mode 100644 channels/porn/youporn.json delete mode 100644 channels/porn/youporn.py delete mode 100644 channels/porn/yuuk.json delete mode 100644 channels/porn/yuuk.py create mode 100755 lib/babelfish/__init__.py create mode 100755 lib/babelfish/converters/__init__.py create mode 100755 lib/babelfish/converters/alpha2.py create mode 100755 lib/babelfish/converters/alpha3b.py create mode 100755 lib/babelfish/converters/alpha3t.py create mode 100755 lib/babelfish/converters/countryname.py create mode 100755 lib/babelfish/converters/name.py create mode 100755 lib/babelfish/converters/opensubtitles.py create mode 100755 lib/babelfish/converters/scope.py create mode 100755 lib/babelfish/converters/type.py create mode 100755 lib/babelfish/country.py create mode 100755 lib/babelfish/data/iso-3166-1.txt create mode 100755 lib/babelfish/data/iso-639-3.tab create mode 100755 lib/babelfish/data/iso15924-utf8-20131012.txt create mode 100755 lib/babelfish/data/opensubtitles_languages.txt create mode 100755 lib/babelfish/exceptions.py create mode 100755 lib/babelfish/language.py create mode 100755 lib/babelfish/script.py delete mode 100644 lib/btserver/__init__.py delete mode 100644 lib/btserver/cache.py delete mode 100644 lib/btserver/client.py delete mode 100644 lib/btserver/cursor.py delete mode 100644 lib/btserver/dispatcher.py delete mode 100644 lib/btserver/file.py delete mode 100644 lib/btserver/handler.py delete mode 100644 lib/btserver/monitor.py delete mode 100644 lib/btserver/resume_data.py delete mode 100644 lib/btserver/server.py create mode 100644 lib/dateutil/__init__.py create mode 100644 lib/dateutil/easter.py create mode 100644 lib/dateutil/parser.py create mode 100644 lib/dateutil/relativedelta.py create mode 100644 lib/dateutil/rrule.py create mode 100644 lib/dateutil/tz.py create mode 100644 lib/dateutil/tzwin.py create mode 100644 lib/dateutil/zoneinfo/__init__.py create mode 100644 lib/dateutil/zoneinfo/zoneinfo-2012c.tar.gz delete mode 100644 lib/dns/LICENSE delete mode 100644 lib/dns/README.md delete mode 100644 lib/dns/__init__.py delete mode 100644 lib/dns/_compat.py delete mode 100644 lib/dns/dnssec.py delete mode 100644 lib/dns/dnssec.pyi delete mode 100644 lib/dns/e164.py delete mode 100644 lib/dns/e164.pyi delete mode 100644 lib/dns/edns.py delete mode 100644 lib/dns/entropy.py delete mode 100644 lib/dns/entropy.pyi delete mode 100644 lib/dns/exception.py delete mode 100644 lib/dns/exception.pyi delete mode 100644 lib/dns/flags.py delete mode 100644 lib/dns/grange.py delete mode 100644 lib/dns/hash.py delete mode 100644 lib/dns/inet.py delete mode 100644 lib/dns/inet.pyi delete mode 100644 lib/dns/ipv4.py delete mode 100644 lib/dns/ipv6.py delete mode 100644 lib/dns/message.py delete mode 100644 lib/dns/message.pyi delete mode 100644 lib/dns/name.py delete mode 100644 lib/dns/name.pyi delete mode 100644 lib/dns/namedict.py delete mode 100644 lib/dns/node.py delete mode 100644 lib/dns/node.pyi delete mode 100644 lib/dns/opcode.py delete mode 100644 lib/dns/py.typed delete mode 100644 lib/dns/query.py delete mode 100644 lib/dns/query.pyi delete mode 100644 lib/dns/rcode.py delete mode 100644 lib/dns/rdata.py delete mode 100644 lib/dns/rdata.pyi delete mode 100644 lib/dns/rdataclass.py delete mode 100644 lib/dns/rdataset.py delete mode 100644 lib/dns/rdataset.pyi delete mode 100644 lib/dns/rdatatype.py delete mode 100644 lib/dns/rdtypes/ANY/AFSDB.py delete mode 100644 lib/dns/rdtypes/ANY/AVC.py delete mode 100644 lib/dns/rdtypes/ANY/CAA.py delete mode 100644 lib/dns/rdtypes/ANY/CDNSKEY.py delete mode 100644 lib/dns/rdtypes/ANY/CDS.py delete mode 100644 lib/dns/rdtypes/ANY/CERT.py delete mode 100644 lib/dns/rdtypes/ANY/CNAME.py delete mode 100644 lib/dns/rdtypes/ANY/CSYNC.py delete mode 100644 lib/dns/rdtypes/ANY/DLV.py delete mode 100644 lib/dns/rdtypes/ANY/DNAME.py delete mode 100644 lib/dns/rdtypes/ANY/DNSKEY.py delete mode 100644 lib/dns/rdtypes/ANY/DS.py delete mode 100644 lib/dns/rdtypes/ANY/EUI48.py delete mode 100644 lib/dns/rdtypes/ANY/EUI64.py delete mode 100644 lib/dns/rdtypes/ANY/GPOS.py delete mode 100644 lib/dns/rdtypes/ANY/HINFO.py delete mode 100644 lib/dns/rdtypes/ANY/HIP.py delete mode 100644 lib/dns/rdtypes/ANY/ISDN.py delete mode 100644 lib/dns/rdtypes/ANY/LOC.py delete mode 100644 lib/dns/rdtypes/ANY/MX.py delete mode 100644 lib/dns/rdtypes/ANY/NINFO.py delete mode 100644 lib/dns/rdtypes/ANY/NS.py delete mode 100644 lib/dns/rdtypes/ANY/NSEC.py delete mode 100644 lib/dns/rdtypes/ANY/NSEC3.py delete mode 100644 lib/dns/rdtypes/ANY/NSEC3PARAM.py delete mode 100644 lib/dns/rdtypes/ANY/OPENPGPKEY.py delete mode 100644 lib/dns/rdtypes/ANY/PTR.py delete mode 100644 lib/dns/rdtypes/ANY/RP.py delete mode 100644 lib/dns/rdtypes/ANY/RRSIG.py delete mode 100644 lib/dns/rdtypes/ANY/RT.py delete mode 100644 lib/dns/rdtypes/ANY/SOA.py delete mode 100644 lib/dns/rdtypes/ANY/SPF.py delete mode 100644 lib/dns/rdtypes/ANY/SSHFP.py delete mode 100644 lib/dns/rdtypes/ANY/TLSA.py delete mode 100644 lib/dns/rdtypes/ANY/TXT.py delete mode 100644 lib/dns/rdtypes/ANY/URI.py delete mode 100644 lib/dns/rdtypes/ANY/X25.py delete mode 100644 lib/dns/rdtypes/ANY/__init__.py delete mode 100644 lib/dns/rdtypes/CH/A.py delete mode 100644 lib/dns/rdtypes/CH/__init__.py delete mode 100644 lib/dns/rdtypes/IN/A.py delete mode 100644 lib/dns/rdtypes/IN/AAAA.py delete mode 100644 lib/dns/rdtypes/IN/APL.py delete mode 100644 lib/dns/rdtypes/IN/DHCID.py delete mode 100644 lib/dns/rdtypes/IN/IPSECKEY.py delete mode 100644 lib/dns/rdtypes/IN/KX.py delete mode 100644 lib/dns/rdtypes/IN/NAPTR.py delete mode 100644 lib/dns/rdtypes/IN/NSAP.py delete mode 100644 lib/dns/rdtypes/IN/NSAP_PTR.py delete mode 100644 lib/dns/rdtypes/IN/PX.py delete mode 100644 lib/dns/rdtypes/IN/SRV.py delete mode 100644 lib/dns/rdtypes/IN/WKS.py delete mode 100644 lib/dns/rdtypes/IN/__init__.py delete mode 100644 lib/dns/rdtypes/__init__.py delete mode 100644 lib/dns/rdtypes/dnskeybase.py delete mode 100644 lib/dns/rdtypes/dnskeybase.pyi delete mode 100644 lib/dns/rdtypes/dsbase.py delete mode 100644 lib/dns/rdtypes/euibase.py delete mode 100644 lib/dns/rdtypes/mxbase.py delete mode 100644 lib/dns/rdtypes/nsbase.py delete mode 100644 lib/dns/rdtypes/txtbase.py delete mode 100644 lib/dns/rdtypes/txtbase.pyi delete mode 100644 lib/dns/renderer.py delete mode 100644 lib/dns/resolver.py delete mode 100644 lib/dns/resolver.pyi delete mode 100644 lib/dns/reversename.py delete mode 100644 lib/dns/reversename.pyi delete mode 100644 lib/dns/rrset.py delete mode 100644 lib/dns/rrset.pyi delete mode 100644 lib/dns/set.py delete mode 100644 lib/dns/tokenizer.py delete mode 100644 lib/dns/tsig.py delete mode 100644 lib/dns/tsigkeyring.py delete mode 100644 lib/dns/tsigkeyring.pyi delete mode 100644 lib/dns/ttl.py delete mode 100644 lib/dns/update.py delete mode 100644 lib/dns/update.pyi delete mode 100644 lib/dns/version.py delete mode 100644 lib/dns/wiredata.py delete mode 100644 lib/dns/zone.py delete mode 100644 lib/dns/zone.pyi create mode 100644 lib/guessit/__init__.py create mode 100644 lib/guessit/__main__.py create mode 100644 lib/guessit/__version__.py create mode 100644 lib/guessit/api.py create mode 100644 lib/guessit/backports.py create mode 100644 lib/guessit/config/options.json create mode 100644 lib/guessit/jsonutils.py create mode 100644 lib/guessit/monkeypatch.py create mode 100644 lib/guessit/options.py create mode 100644 lib/guessit/reutils.py create mode 100644 lib/guessit/rules/__init__.py create mode 100644 lib/guessit/rules/common/__init__.py create mode 100644 lib/guessit/rules/common/comparators.py create mode 100644 lib/guessit/rules/common/date.py create mode 100644 lib/guessit/rules/common/expected.py create mode 100644 lib/guessit/rules/common/formatters.py create mode 100644 lib/guessit/rules/common/numeral.py create mode 100644 lib/guessit/rules/common/pattern.py create mode 100644 lib/guessit/rules/common/quantity.py create mode 100644 lib/guessit/rules/common/validators.py create mode 100644 lib/guessit/rules/common/words.py create mode 100644 lib/guessit/rules/markers/__init__.py create mode 100644 lib/guessit/rules/markers/groups.py create mode 100644 lib/guessit/rules/markers/path.py create mode 100644 lib/guessit/rules/match_processors.py create mode 100644 lib/guessit/rules/processors.py create mode 100644 lib/guessit/rules/properties/__init__.py create mode 100644 lib/guessit/rules/properties/audio_codec.py create mode 100644 lib/guessit/rules/properties/bit_rate.py create mode 100644 lib/guessit/rules/properties/bonus.py create mode 100644 lib/guessit/rules/properties/cds.py create mode 100644 lib/guessit/rules/properties/container.py create mode 100644 lib/guessit/rules/properties/country.py create mode 100644 lib/guessit/rules/properties/crc.py create mode 100644 lib/guessit/rules/properties/date.py create mode 100644 lib/guessit/rules/properties/edition.py create mode 100644 lib/guessit/rules/properties/episode_title.py create mode 100644 lib/guessit/rules/properties/episodes.py create mode 100644 lib/guessit/rules/properties/film.py create mode 100644 lib/guessit/rules/properties/language.py create mode 100644 lib/guessit/rules/properties/mimetype.py create mode 100644 lib/guessit/rules/properties/other.py create mode 100644 lib/guessit/rules/properties/part.py create mode 100644 lib/guessit/rules/properties/release_group.py create mode 100644 lib/guessit/rules/properties/screen_size.py create mode 100644 lib/guessit/rules/properties/size.py create mode 100644 lib/guessit/rules/properties/source.py create mode 100644 lib/guessit/rules/properties/streaming_service.py create mode 100644 lib/guessit/rules/properties/title.py create mode 100644 lib/guessit/rules/properties/type.py create mode 100644 lib/guessit/rules/properties/video_codec.py create mode 100644 lib/guessit/rules/properties/website.py create mode 100644 lib/guessit/test/__init__.py create mode 100644 lib/guessit/test/config/dummy.txt create mode 100644 lib/guessit/test/config/test.json create mode 100644 lib/guessit/test/config/test.yaml create mode 100644 lib/guessit/test/config/test.yml create mode 100644 lib/guessit/test/enable_disable_properties.yml create mode 100644 lib/guessit/test/episodes.yml create mode 100644 lib/guessit/test/movies.yml create mode 100644 lib/guessit/test/rules/__init__.py create mode 100644 lib/guessit/test/rules/audio_codec.yml create mode 100644 lib/guessit/test/rules/bonus.yml create mode 100644 lib/guessit/test/rules/cds.yml create mode 100644 lib/guessit/test/rules/common_words.yml create mode 100644 lib/guessit/test/rules/country.yml create mode 100644 lib/guessit/test/rules/date.yml create mode 100644 lib/guessit/test/rules/edition.yml create mode 100644 lib/guessit/test/rules/episodes.yml create mode 100644 lib/guessit/test/rules/film.yml create mode 100644 lib/guessit/test/rules/language.yml create mode 100644 lib/guessit/test/rules/other.yml create mode 100644 lib/guessit/test/rules/part.yml create mode 100644 lib/guessit/test/rules/processors.yml create mode 100644 lib/guessit/test/rules/processors_test.py create mode 100644 lib/guessit/test/rules/release_group.yml create mode 100644 lib/guessit/test/rules/screen_size.yml create mode 100644 lib/guessit/test/rules/size.yml create mode 100644 lib/guessit/test/rules/source.yml create mode 100644 lib/guessit/test/rules/title.yml create mode 100644 lib/guessit/test/rules/video_codec.yml create mode 100644 lib/guessit/test/rules/website.yml create mode 100644 lib/guessit/test/streaming_services.yaml create mode 100644 lib/guessit/test/suggested.json create mode 100644 lib/guessit/test/test-input-file.txt create mode 100644 lib/guessit/test/test_api.py create mode 100644 lib/guessit/test/test_api_unicode_literals.py create mode 100644 lib/guessit/test/test_benchmark.py create mode 100644 lib/guessit/test/test_main.py create mode 100644 lib/guessit/test/test_options.py create mode 100644 lib/guessit/test/test_yml.py create mode 100644 lib/guessit/test/various.yml create mode 100644 lib/guessit/tlds-alpha-by-domain.txt create mode 100644 lib/guessit/yamlutils.py delete mode 100644 lib/libtorrent.pyd create mode 100644 lib/pyparsing.py delete mode 100644 lib/python_libtorrent/__init__.py delete mode 100644 lib/python_libtorrent/android_armv7/0.16.19/__init__.py delete mode 100644 lib/python_libtorrent/android_armv7/0.16.19/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/android_armv7/1.0.6/__init__.py delete mode 100644 lib/python_libtorrent/android_armv7/1.0.6/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/android_armv7/1.0.7/__init__.py delete mode 100644 lib/python_libtorrent/android_armv7/1.0.7/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/android_armv7/1.0.8/__init__.py delete mode 100644 lib/python_libtorrent/android_armv7/1.0.8/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/android_armv7/1.0.9/__init__.py delete mode 100644 lib/python_libtorrent/android_armv7/1.0.9/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/android_armv7/1.1.0/__init__.py delete mode 100644 lib/python_libtorrent/android_armv7/1.1.0/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/android_armv7/1.1.1/__init__.py delete mode 100644 lib/python_libtorrent/android_armv7/1.1.1/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/android_armv7/__init__.py delete mode 100644 lib/python_libtorrent/android_x86/0.16.19/__init__.py delete mode 100644 lib/python_libtorrent/android_x86/0.16.19/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/android_x86/1.0.6/__init__.py delete mode 100644 lib/python_libtorrent/android_x86/1.0.6/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/android_x86/1.0.7/__init__.py delete mode 100644 lib/python_libtorrent/android_x86/1.0.7/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/android_x86/1.0.8/__init__.py delete mode 100644 lib/python_libtorrent/android_x86/1.0.8/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/android_x86/1.0.9/__init__.py delete mode 100644 lib/python_libtorrent/android_x86/1.0.9/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/android_x86/1.1.0/__init__.py delete mode 100644 lib/python_libtorrent/android_x86/1.1.0/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/android_x86/1.1.1/__init__.py delete mode 100644 lib/python_libtorrent/android_x86/1.1.1/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/android_x86/__init__.py delete mode 100644 lib/python_libtorrent/darwin/0.16.19/__init__.py delete mode 100644 lib/python_libtorrent/darwin/0.16.19/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/darwin/1.0.9/__init__.py delete mode 100644 lib/python_libtorrent/darwin/1.0.9/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/darwin/1.1.0/__init__.py delete mode 100644 lib/python_libtorrent/darwin/1.1.0/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/darwin/1.1.1/__init__.py delete mode 100644 lib/python_libtorrent/darwin/1.1.1/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/darwin/__init__.py delete mode 100644 lib/python_libtorrent/ios_arm/1.0.7/__init__.py delete mode 100644 lib/python_libtorrent/ios_arm/1.0.7/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/ios_arm/1.0.8/__init__.py delete mode 100644 lib/python_libtorrent/ios_arm/1.0.8/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/ios_arm/1.0.9/__init__.py delete mode 100644 lib/python_libtorrent/ios_arm/1.0.9/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/ios_arm/1.1.1/__init__.py delete mode 100644 lib/python_libtorrent/ios_arm/1.1.1/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/ios_arm/__init__.py delete mode 100644 lib/python_libtorrent/linux_aarch64_ucs2/1.1.0/__init__.py delete mode 100644 lib/python_libtorrent/linux_aarch64_ucs2/1.1.0/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_aarch64_ucs2/__init__.py delete mode 100644 lib/python_libtorrent/linux_aarch64_ucs4/1.1.0/__init__.py delete mode 100644 lib/python_libtorrent/linux_aarch64_ucs4/1.1.0/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_aarch64_ucs4/1.1.1/__init__.py delete mode 100644 lib/python_libtorrent/linux_aarch64_ucs4/1.1.1/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_aarch64_ucs4/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv6/0.16.19/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv6/0.16.19/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv6/1.0.11/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv6/1.0.11/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv6/1.0.6/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv6/1.0.6/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv6/1.0.7/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv6/1.0.7/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv6/1.0.9/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv6/1.0.9/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv6/1.1.0/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv6/1.1.0/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv6/1.1.1/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv6/1.1.1/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv6/1.1.6/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv6/1.1.6/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv6/1.1.7/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv6/1.1.7/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv6/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv7/0.16.19/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv7/0.16.19/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv7/1.0.6/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv7/1.0.6/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv7/1.0.7/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv7/1.0.7/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv7/1.0.9/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv7/1.0.9/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv7/1.1.0/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv7/1.1.0/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv7/1.1.1/__init__.py delete mode 100644 lib/python_libtorrent/linux_armv7/1.1.1/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_armv7/__init__.py delete mode 100644 lib/python_libtorrent/linux_mips/1.0.9/__init__.py delete mode 100644 lib/python_libtorrent/linux_mips/1.0.9/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_mips/__init__.py delete mode 100644 lib/python_libtorrent/linux_mipsel_ucs2/1.0.9/__init__.py delete mode 100644 lib/python_libtorrent/linux_mipsel_ucs2/1.0.9/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_mipsel_ucs2/1.1.0/__init__.py delete mode 100644 lib/python_libtorrent/linux_mipsel_ucs2/1.1.0/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_mipsel_ucs2/__init__.py delete mode 100644 lib/python_libtorrent/linux_mipsel_ucs4/1.0.9/__init__.py delete mode 100644 lib/python_libtorrent/linux_mipsel_ucs4/1.0.9/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_mipsel_ucs4/1.1.0/__init__.py delete mode 100644 lib/python_libtorrent/linux_mipsel_ucs4/1.1.0/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_mipsel_ucs4/__init__.py delete mode 100644 lib/python_libtorrent/linux_x86/0.16.19/__init__.py delete mode 100644 lib/python_libtorrent/linux_x86/0.16.19/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_x86/1.0.6/__init__.py delete mode 100644 lib/python_libtorrent/linux_x86/1.0.6/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_x86/1.0.7/__init__.py delete mode 100644 lib/python_libtorrent/linux_x86/1.0.7/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_x86/1.0.9/__init__.py delete mode 100644 lib/python_libtorrent/linux_x86/1.0.9/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_x86/1.1.0/__init__.py delete mode 100644 lib/python_libtorrent/linux_x86/1.1.0/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_x86/1.1.1/__init__.py delete mode 100644 lib/python_libtorrent/linux_x86/1.1.1/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_x86/__init__.py delete mode 100644 lib/python_libtorrent/linux_x86_64/0.16.19/__init__.py delete mode 100644 lib/python_libtorrent/linux_x86_64/0.16.19/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_x86_64/1.0.6/__init__.py delete mode 100644 lib/python_libtorrent/linux_x86_64/1.0.6/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_x86_64/1.0.7/__init__.py delete mode 100644 lib/python_libtorrent/linux_x86_64/1.0.7/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_x86_64/1.0.9/__init__.py delete mode 100644 lib/python_libtorrent/linux_x86_64/1.0.9/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_x86_64/1.1.0/__init__.py delete mode 100644 lib/python_libtorrent/linux_x86_64/1.1.0/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/linux_x86_64/1.1.1/__init__.py delete mode 100644 lib/python_libtorrent/linux_x86_64/1.1.1/libtorrent.so.size.txt delete mode 100644 lib/python_libtorrent/platform_pulsar.py delete mode 100644 lib/python_libtorrent/public.py delete mode 100644 lib/python_libtorrent/python_libtorrent/__init__.py delete mode 100644 lib/python_libtorrent/python_libtorrent/functions.py delete mode 100644 lib/python_libtorrent/python_libtorrent/net.py delete mode 100644 lib/python_libtorrent/python_libtorrent/platform_pulsar.py delete mode 100644 lib/python_libtorrent/windows/0.16.19/__init__.py delete mode 100644 lib/python_libtorrent/windows/0.16.19/libtorrent.pyd.size.txt delete mode 100644 lib/python_libtorrent/windows/1.0.6/__init__.py delete mode 100644 lib/python_libtorrent/windows/1.0.6/libtorrent.pyd.size.txt delete mode 100644 lib/python_libtorrent/windows/1.0.8/__init__.py delete mode 100644 lib/python_libtorrent/windows/1.0.8/libtorrent.pyd.size.txt delete mode 100644 lib/python_libtorrent/windows/1.0.9/__init__.py delete mode 100644 lib/python_libtorrent/windows/1.0.9/libtorrent.pyd.size.txt delete mode 100644 lib/python_libtorrent/windows/1.1.1/__init__.py delete mode 100644 lib/python_libtorrent/windows/1.1.1/libtorrent.pyd.size.txt delete mode 100644 lib/python_libtorrent/windows/1.2.2/__init__.py delete mode 100644 lib/python_libtorrent/windows/1.2.2/libtorrent.pyd.size.txt delete mode 100644 lib/python_libtorrent/windows/1.2.3/__init__.py delete mode 100644 lib/python_libtorrent/windows/1.2.3/libtorrent.pyd.size.txt delete mode 100644 lib/python_libtorrent/windows/__init__.py delete mode 100644 lib/python_libtorrent/windows_x64/1.2.2/__init__.py delete mode 100644 lib/python_libtorrent/windows_x64/1.2.2/libtorrent.pyd delete mode 100644 lib/python_libtorrent/windows_x64/1.2.2/libtorrent.pyd.size.txt delete mode 100644 lib/python_libtorrent/windows_x64/1.2.3/__init__.py delete mode 100644 lib/python_libtorrent/windows_x64/1.2.3/libtorrent.pyd.size.txt delete mode 100644 lib/python_libtorrent/windows_x64/__init__.py delete mode 100644 lib/quasar/daemon.py delete mode 100644 lib/quasar/navigation.py delete mode 100644 lib/quasar/osarch.py delete mode 100644 lib/quasar/util.py create mode 100755 lib/rebulk/__init__.py create mode 100755 lib/rebulk/__version__.py create mode 100755 lib/rebulk/builder.py create mode 100755 lib/rebulk/chain.py create mode 100755 lib/rebulk/debug.py create mode 100755 lib/rebulk/formatters.py create mode 100755 lib/rebulk/introspector.py create mode 100755 lib/rebulk/loose.py create mode 100755 lib/rebulk/match.py create mode 100755 lib/rebulk/pattern.py create mode 100755 lib/rebulk/processors.py create mode 100755 lib/rebulk/rebulk.py create mode 100755 lib/rebulk/remodule.py create mode 100755 lib/rebulk/rules.py create mode 100755 lib/rebulk/toposort.py create mode 100755 lib/rebulk/utils.py create mode 100755 lib/rebulk/validators.py create mode 100644 lib/schedule.py create mode 100644 lib/torrentool/__init__.py create mode 100644 lib/torrentool/api.py create mode 100644 lib/torrentool/bencode.py create mode 100644 lib/torrentool/cli.py create mode 100644 lib/torrentool/exceptions.py create mode 100644 lib/torrentool/repo/open_trackers.ini create mode 100644 lib/torrentool/torrent.py create mode 100644 lib/torrentool/utils.py delete mode 100644 resources/views/skin.ace2.json delete mode 100644 resources/views/skin.aeon.nox.silvo.json delete mode 100644 resources/views/skin.aeon.tajo.json delete mode 100644 resources/views/skin.aeonmq8.json delete mode 100644 resources/views/skin.amber.json delete mode 100644 resources/views/skin.apptv.json delete mode 100644 resources/views/skin.arctic.zephyr.2.json delete mode 100644 resources/views/skin.aura.json delete mode 100644 resources/views/skin.bello.7.json delete mode 100644 resources/views/skin.blackglassnova.json delete mode 100644 resources/views/skin.box.json delete mode 100644 resources/views/skin.confluence.json delete mode 100644 resources/views/skin.eminence.2.json delete mode 100644 resources/views/skin.estuary.json delete mode 100644 resources/views/skin.phenomenal.json delete mode 100644 resources/views/skin.quartz.json delete mode 100644 resources/views/skin.rapier.json delete mode 100644 resources/views/skin.revolve.json delete mode 100644 resources/views/skin.unity.json diff --git a/README.md b/README.md index 18a7fcba..4a1f0dc0 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,13 @@ Installazione: https://kodiondemand.github.io/#download -KoD attualmente funziona con Kodi fino alla versione 18 (Python 2). - - KoD, come Alfa, è sotto licenza GPL v3, pertanto siete liberi di utilizzare parte del codice, a patto di rispettare i termini di suddetta licenza, che si possono riassumere in: - Il tuo addon deve essere rilasciando secondo la stessa licenza, ovvero essere open source (il fatto che lo zip sia visibile da chiunque non ha importanza, è necessario avere un repository git come questo) - Aggiungere i crediti a tutto ciò che copiate/modificate, ad esempio aggiungendo un commento nel file in questione o, meglio, facendo un cherry-pick (in modo da preservarnee lo storico) +Nota: KoD attualmente funziona con Kodi fino alla versione 18 (Python 2). ### Come contribuire o fare segnalazioni? Ti piace il progetto e vuoi dare una mano? Leggi [qui](https://github.com/kodiondemand/addon/blob/master/CONTRIBUTING.md) + diff --git a/addon.xml b/addon.xml index a23986c1..c104c5fb 100644 --- a/addon.xml +++ b/addon.xml @@ -1,11 +1,11 @@ - + - + - + video @@ -18,7 +18,10 @@ resources/media/themes/ss/2.png resources/media/themes/ss/3.png - - fix vari ed eventuali + - completato il supporto ai torrent e aggiunto ilcorsaronero.xyz +- aggiunto supporto agli episodi locali, ovvero poter inserire nella libreria di kodi un misto tra puntate "di kod" e file scaricati altrove +- le viste ora si salvano di nuovo dal menu laterale, ma rimangono salvate per il tipo di contenuto visualizzato e non per il singolo menu +- ripensato il menu rapido, che ora è "più rapido", ridisegnate alcune finestre Naviga velocemente sul web e guarda i contenuti presenti [COLOR red]The owners and submitters to this addon do not host or distribute any of the content displayed by these addons nor do they have any affiliation with the content providers.[/COLOR] [COLOR yellow]Kodi © is a registered trademark of the XBMC Foundation. We are not connected to or in any other way affiliated with Kodi, Team Kodi, or the XBMC Foundation. Furthermore, any software, addons, or products offered by us will receive no support in official Kodi channels, including the Kodi forums and various social networks.[/COLOR] @@ -28,6 +31,6 @@ https://t.me/kodiondemand https://github.com/kodiondemand/addon - + \ No newline at end of file diff --git a/channels.json b/channels.json index 1cc56f0a..18feb7ed 100644 --- a/channels.json +++ b/channels.json @@ -1,46 +1,44 @@ { "altadefinizione01": "https://altadefinizione01.photo", - "altadefinizione01_link": "https://altadefinizione01.kim", - "altadefinizioneclick": "https://altadefinizione.rocks", + "altadefinizione01_link": "https://altadefinizione01.gallery", + "altadefinizioneclick": "https://altadefinizione.family", "animeforce": "https://ww1.animeforce.org", - "animeleggendari": "https://animepertutti.com", + "animeleggendari": "https://animepertutti.org", "animesaturn": "https://www.animesaturn.com", "animestream": "https://www.animeworld.it", "animesubita": "http://www.animesubita.org", "animetubeita": "http://www.animetubeita.com", "animeunity": "https://www.animeunity.it", "animeworld": "https://www.animeworld.tv", - "casacinema": "https://www.casacinema.me", + "casacinema": "https://www.casacinema.digital", "casacinemaInfo": "https://casacinema.life", - "cineblog01": "https://cb01.uno", - "cb01anime": "https://www.cineblog01.network", - "cinemalibero": "https://www.cinemalibero.plus", + "cb01anime": "https://www.cineblog01.network/", + "cinemalibero": "https://cinemalibero.plus", "cinetecadibologna": "http://cinestore.cinetecadibologna.it", "dreamsub": "https://dreamsub.stream", "dsda": "https://www.dsda.press/", "fastsubita": "https://fastsubita.online", "filmgratis": "https://www.filmaltadefinizione.tv", "filmigratis": "https://filmigratis.org", - "filmsenzalimiticc": "https://www.filmsenzalimiti.cafe", + "filmsenzalimiticc": "https://www.filmsenzalimiti.estate", "filmstreaming01": "https://filmstreaming01.com", "guardaserie_stream": "https://guardaserie.store", - "guardaserieclick": "https://www.guardaserie.productions", + "guardaserieclick": "https://www.guardaserie.style", "hd4me": "https://hd4me.net", - "ilcorsaronero": "https://ilcorsaronero.pizza", - "ilgeniodellostreaming": "https://ilgeniodellostreaming.pl", + "ilgeniodellostreaming": "https://ilgeniodellostreaming.tw", "italiaserie": "https://italiaserie.org", "mondoserietv": "https://mondoserietv.com", "netfreex": "https://www.netfreex.club", - "piratestreaming": "https://www.piratestreaming.online", + "piratestreaming": "https://www.piratestreaming.biz", "polpotv": "https://polpotv.club", "pufimovies": "https://pufimovies.com", "raiplay": "https://www.raiplay.it", - "seriehd": "https://seriehd.digital", + "seriehd": "https://seriehd.net", "serietvonline": "https://serietvonline.host", "serietvsubita": "http://serietvsubita.xyz", "serietvu": "https://www.serietvu.link", "streamtime": "https://t.me/s/StreamTime", - "tantifilm": "https://www.tantifilm.vip", + "tantifilm": "https://www.tantifilm.pizza", "toonitalia": "https://toonitalia.org", "vedohd": "https://vedohd.uno", "vvvvid": "https://www.vvvvid.it" diff --git a/channels/0example.json.txt b/channels/0example.json.txt index 783193c6..1551727f 100644 --- a/channels/0example.json.txt +++ b/channels/0example.json.txt @@ -21,10 +21,9 @@ se vanno cancellati tutti deve rimanere la voce: "name": "Nome del canale visualizzato in KOD", "language": ["ita", "sub-ita"], "active": false, - "adult": false, "thumbnail": "", "banner": "", - "categories": ["movie", "tvshow", "anime", "vos", "documentary", "adult"], + "categories": ["movie", "tvshow", "anime", "vos", "documentary"], "not_active": ["include_in_newest"], "settings": [ { diff --git a/channels/altadefinizione01.json b/channels/altadefinizione01.json index f7589d50..3fc2ef26 100644 --- a/channels/altadefinizione01.json +++ b/channels/altadefinizione01.json @@ -3,7 +3,6 @@ "name": "Altadefinizione01", "language": ["ita", "sub-ita"], "active": true, - "adult": false, "thumbnail": "altadefinizione01.png", "banner": "altadefinizione01.png", "categories": ["movie", "vos"], diff --git a/channels/altadefinizione01_link.json b/channels/altadefinizione01_link.json index fe102b43..56a48c4f 100644 --- a/channels/altadefinizione01_link.json +++ b/channels/altadefinizione01_link.json @@ -2,7 +2,6 @@ "id": "altadefinizione01_link", "name": "Altadefinizione01 L", "active": true, - "adult": false, "language": ["ita","sub-ita"], "thumbnail": "altadefinizione01_L.png", "banner": "altadefinizione01_L.png", diff --git a/channels/altadefinizioneclick.json b/channels/altadefinizioneclick.json index 8ca67198..ec82baa7 100644 --- a/channels/altadefinizioneclick.json +++ b/channels/altadefinizioneclick.json @@ -2,7 +2,6 @@ "id": "altadefinizioneclick", "name": "AltadefinizioneClick", "active": true, - "adult": false, "language": ["ita","sub-ita"], "thumbnail": "altadefinizioneclick.png", "bannermenu": "altadefinizioneciclk.png", diff --git a/channels/animeforce.json b/channels/animeforce.json index 386a6e61..95578357 100644 --- a/channels/animeforce.json +++ b/channels/animeforce.json @@ -3,7 +3,6 @@ "name": "AnimeForce", "language": ["ita"], "active": true, - "adult": false, "thumbnail": "animeforce.png", "banner": "animeforce.png", "categories": ["anime"], diff --git a/channels/animeleggendari.json b/channels/animeleggendari.json index 5fd0cf6b..74c686a5 100644 --- a/channels/animeleggendari.json +++ b/channels/animeleggendari.json @@ -2,7 +2,6 @@ "id": "animeleggendari", "name": "AnimePerTutti", "active": true, - "adult": false, "language": ["ita", "sub-ita"], "thumbnail": "animepertutti.png", "bannermenu": "animepertutti.png", diff --git a/channels/animesaturn.json b/channels/animesaturn.json index e409d3c4..a3cdd28c 100644 --- a/channels/animesaturn.json +++ b/channels/animesaturn.json @@ -2,7 +2,6 @@ "id": "animesaturn", "name": "AnimeSaturn", "active": true, - "adult": false, "language": ["ita"], "thumbnail": "animesaturn.png", "banner": "animesaturn.png", diff --git a/channels/animespace.json b/channels/animespace.json index 26fafae6..54a542ae 100644 --- a/channels/animespace.json +++ b/channels/animespace.json @@ -2,7 +2,6 @@ "id": "animespace", "name": "AnimeSpace", "active": false, - "adult": false, "language": [], "thumbnail": "", "banner": "", diff --git a/channels/animesubita.json b/channels/animesubita.json index b1d695e1..b612eb16 100644 --- a/channels/animesubita.json +++ b/channels/animesubita.json @@ -2,7 +2,6 @@ "id": "animesubita", "name": "AnimeSubIta", "active": true, - "adult": false, "language": ["sub-ita"], "thumbnail": "animesubita.png", "bannermenu": "animesubita.png", diff --git a/channels/animetubeita.json b/channels/animetubeita.json index afb108c2..1565e785 100644 --- a/channels/animetubeita.json +++ b/channels/animetubeita.json @@ -2,7 +2,6 @@ "id": "animetubeita", "name": "AnimeTubeITA", "active": true, - "adult": false, "language": ["sub-ita"], "thumbnail": "animetubeita.png", "bannermenu": "animetubeita.png", diff --git a/channels/animeunity.json b/channels/animeunity.json index 99dc0fe0..22e0be35 100644 --- a/channels/animeunity.json +++ b/channels/animeunity.json @@ -2,7 +2,6 @@ "id": "animeunity", "name": "AnimeUnity", "active": true, - "adult": false, "language": ["ita", "sub-ita"], "thumbnail": "animeunity.png", "banner": "animeunity.png", diff --git a/channels/animeworld.json b/channels/animeworld.json index 0aa9aa1d..964b9d3d 100644 --- a/channels/animeworld.json +++ b/channels/animeworld.json @@ -2,7 +2,6 @@ "id": "animeworld", "name": "AnimeWorld", "active": true, - "adult": false, "language": ["ita", "sub-ita"], "thumbnail": "animeworld.png", "banner": "animeworld.png", diff --git a/channels/casacinema.json b/channels/casacinema.json index 4532df5d..b7d283bd 100644 --- a/channels/casacinema.json +++ b/channels/casacinema.json @@ -3,7 +3,6 @@ "name": "Casacinema", "language": ["ita", "sub-ita"], "active": true, - "adult": false, "thumbnail": "casacinema.png", "banner": "casacinema.png", "categories": ["tvshow", "movie","vos"], diff --git a/channels/casacinemaInfo.json b/channels/casacinemaInfo.json index 0bb89bb4..f3953133 100644 --- a/channels/casacinemaInfo.json +++ b/channels/casacinemaInfo.json @@ -3,7 +3,6 @@ "name": "La Casa del Cinema", "language": ["ita", "sub-ita"], "active": true, - "adult": false, "thumbnail": "casacinemainfo.png", "banner": "casacinemainfo.png", "categories": ["movie", "vos"], diff --git a/channels/cb01anime.json b/channels/cb01anime.json index 24fd0c8d..621c7c8a 100644 --- a/channels/cb01anime.json +++ b/channels/cb01anime.json @@ -3,7 +3,6 @@ "name": "Cb01anime", "language": ["ita", "vos", "sub-ita"], "active": true, - "adult": false, "thumbnail": "cb01anime.png", "banner": "cb01anime.png", "categories": ["anime"], diff --git a/channels/cineblog01.json b/channels/cineblog01.json index 82faafe3..c97e7d66 100644 --- a/channels/cineblog01.json +++ b/channels/cineblog01.json @@ -3,7 +3,6 @@ "name": "CB01", "language": ["ita", "sub-ita"], "active": true, - "adult": false, "thumbnail": "cb01.png", "banner": "cb01.png", "categories": ["tvshow", "movie", "vos", "documentary"], diff --git a/channels/cineblog01.py b/channels/cineblog01.py index fdc50de4..97d99488 100644 --- a/channels/cineblog01.py +++ b/channels/cineblog01.py @@ -137,32 +137,47 @@ def peliculas(item): @support.scrape def episodios(item): - patronBlock = r'(?P
\s*(?:STAGION[EI]\s*(?:DA\s*[0-9]+\s*A)?\s*[0-9]+|MINISERIE) - (?P[^-<]+)(?:- (?P[^-<]+))?.*?[^<>]*?<\/div>.*?)
\[riduci\]<\/div>' - patron = r'(?:/>|

|)(?P.*?(?P[0-9]+(?:×|×)[0-9]+)\s*(?P.*?)?(?:\s*–|\s*-|\s*<).*?)(?:<\/p>|\s+<', '> <', data) + if 'TUTTA LA ' in data: + folderUrl = scrapertools.find_single_match(data, 'TUTTA LA \w+\s+(?:–|-)\s+]+>(?P[^<]+)' + sceneTitle = True + def itemHook(item): + item.serieFolder = True + return item + else: + patronBlock = r'(?P<block><div class="sp-head[a-z ]*?" title="Espandi">\s*(?:STAGION[EI]\s*(?:DA\s*[0-9]+\s*A)?\s*[0-9]+|MINISERIE) - (?P<lang>[^-<]+)(?:- (?P<quality>[^-<]+))?.*?[^<>]*?<\/div>.*?)<div class="spdiv">\[riduci\]<\/div>' + patron = r'(?:/>|<p>|<strong>)(?P<url>.*?(?P<episode>[0-9]+(?:×|×)[0-9]+)\s*(?P<title2>.*?)?(?:\s*–|\s*-|\s*<).*?)(?:<\/p>|<br)' + def itemlistHook(itemlist): + title_dict = {} + itlist = [] + for item in itemlist: + item.title = re.sub(r'\.(\D)',' \\1', item.title) + match = support.match(item.title, patron=r'(\d+.\d+)').match.replace('x','') + item.order = match + if match not in title_dict: + title_dict[match] = item + elif match in title_dict and item.contentLanguage == title_dict[match].contentLanguage \ + or item.contentLanguage == 'ITA' and not title_dict[match].contentLanguage \ + or title_dict[match].contentLanguage == 'ITA' and not item.contentLanguage: + title_dict[match].url = item.url + else: + title_dict[match + '1'] = item - for key, value in title_dict.items(): - itlist.append(value) + for key, value in title_dict.items(): + itlist.append(value) - return sorted(itlist, key=lambda it: (it.contentLanguage, int(it.order))) + return sorted(itlist, key=lambda it: (it.contentLanguage, int(it.order))) return locals() def findvideos(item): + if item.serieFolder: + return support.server(item, data=item.url) if item.contentType == "episode": return findvid_serie(item) @@ -205,7 +220,7 @@ def findvideos(item): itemlist = support.server(item, itemlist=itemlist) # Extract the quality format - patronvideos = '>([^<]+)</strong></div>' + patronvideos = '([\w.]+)</strong></div></td>' support.addQualityTag(item, itemlist, data, patronvideos) return itemlist diff --git a/channels/cinemalibero.json b/channels/cinemalibero.json index 72ca5d06..c64c78a3 100644 --- a/channels/cinemalibero.json +++ b/channels/cinemalibero.json @@ -3,7 +3,6 @@ "name": "Cinemalibero", "language": ["ita"], "active": true, - "adult": false, "thumbnail": "cinemalibero.png", "banner": "cinemalibero.png", "categories": ["movie","tvshow"], diff --git a/channels/cinetecadibologna.json b/channels/cinetecadibologna.json index d398eb63..fd556a17 100644 --- a/channels/cinetecadibologna.json +++ b/channels/cinetecadibologna.json @@ -3,7 +3,6 @@ "name": "Cineteca di Bologna", "language": ["ita"], "active": true, - "adult": false, "thumbnail": "cinetecadibologna.png", "banner": "cinetecadibologna.png", "categories": ["documentary"], diff --git a/channels/dreamsub.json b/channels/dreamsub.json index d0d39ea9..578ab806 100644 --- a/channels/dreamsub.json +++ b/channels/dreamsub.json @@ -3,7 +3,6 @@ "name": "DreamSub", "language": ["ita", "sub-ita"], "active": true, - "adult": false, "thumbnail": "dreamsub.png", "banner": "dreamsub.png", "categories": ["anime", "vos"], diff --git a/channels/dsda.json b/channels/dsda.json index f6d4adf6..4ec18a80 100644 --- a/channels/dsda.json +++ b/channels/dsda.json @@ -3,7 +3,6 @@ "name": "D.S.D.A", "language": ["ita"], "active": true, - "adult": false, "thumbnail": "dsda.png", "banner": "dsda.png", "categories": ["documentary"], diff --git a/channels/eurostreaming.json b/channels/eurostreaming.json index 88d7d021..79a3eb99 100644 --- a/channels/eurostreaming.json +++ b/channels/eurostreaming.json @@ -2,7 +2,6 @@ "id": "eurostreaming", "name": "Eurostreaming", "active": true, - "adult": false, "language": ["ita","sub-ita"], "thumbnail": "eurostreaming.png", "banner": "eurostreaming.png", diff --git a/channels/fastsubita.json b/channels/fastsubita.json index 3feb7834..c77eaa54 100644 --- a/channels/fastsubita.json +++ b/channels/fastsubita.json @@ -3,7 +3,6 @@ "name": "Fastsubita", "language": ["sub-ita"], "active": true, - "adult": false, "thumbnail": "fastsubita.png", "banner": "fastsubita.png", "categories": ["tvshow", "vos"], diff --git a/channels/filmigratis.json b/channels/filmigratis.json index 46290f5b..6a970b15 100644 --- a/channels/filmigratis.json +++ b/channels/filmigratis.json @@ -2,7 +2,6 @@ "id": "filmigratis", "name": "Filmi Gratis", "active": true, - "adult": false, "language": ["ita", "sub-ita"], "thumbnail": "filmigratis.png", "banner": "filmigratis.png", diff --git a/channels/filmpertutti.json b/channels/filmpertutti.json index 65179cbe..0130b04a 100644 --- a/channels/filmpertutti.json +++ b/channels/filmpertutti.json @@ -2,7 +2,6 @@ "id": "filmpertutti", "name": "Filmpertutti", "active": true, - "adult": false, "language": ["ita", "sub-ita"], "thumbnail": "filmpertutti.png", "banner": "filmpertutti.png", diff --git a/channels/filmsenzalimiticc.json b/channels/filmsenzalimiticc.json index 81f21615..04636231 100644 --- a/channels/filmsenzalimiticc.json +++ b/channels/filmsenzalimiticc.json @@ -2,7 +2,6 @@ "id": "filmsenzalimiticc", "name": "Filmsenzalimiti CC", "active": false, - "adult": false, "language": ["ita"], "thumbnail": "filmsenzalimiticc.png", "banner": "", diff --git a/channels/guardaserieclick.json b/channels/guardaserieclick.json index 2593ae40..056097f1 100644 --- a/channels/guardaserieclick.json +++ b/channels/guardaserieclick.json @@ -2,7 +2,6 @@ "id": "guardaserieclick", "name": "GuardaSerie.click", "active": true, - "adult": false, "language": ["ita", "vos"], "thumbnail": "guardaserieclick.png", "bannermenu": "guardaserieclick.png", diff --git a/channels/hd4me.json b/channels/hd4me.json index 04465df9..e85964a0 100644 --- a/channels/hd4me.json +++ b/channels/hd4me.json @@ -3,7 +3,6 @@ "name": "HD4ME", "language": ["ita", "sub-ita"], "active": true, - "adult": false, "thumbnail": "hd4me.png", "banner": "hd4me.png", "categories": ["movie", "vos"], diff --git a/channels/ilcorsaronero.json b/channels/ilcorsaronero.json index ab5be5ed..129bdc68 100644 --- a/channels/ilcorsaronero.json +++ b/channels/ilcorsaronero.json @@ -1,8 +1,7 @@ { "id": "ilcorsaronero", "name": "ilCorSaRoNeRo", - "active": false, - "adult": false, + "active": true, "language": ["ita"], "thumbnail": "ilcorsaronero.png", "banner": "ilcorsaronero.png", diff --git a/channels/ilcorsaronero.py b/channels/ilcorsaronero.py index ac5a47d7..39941c7d 100644 --- a/channels/ilcorsaronero.py +++ b/channels/ilcorsaronero.py @@ -5,7 +5,13 @@ from core import support -host = support.config.get_channel_url() +def findhost(): + data = support.httptools.downloadpage('https://lagazzettadelcorsaro.com/').data + url = support.scrapertools.find_single_match(data, '<li><a href="([^"]+)') + return url[:-1] if url.endswith('/') else url + +host = support.config.get_channel_url(findhost) +support.log('HOST',host) # host = 'https://ilcorsaronero.xyz' headers = [['Referer', host]] @@ -16,23 +22,24 @@ list_quality = ['default'] def mainlist(item): menu = [ - ('BDRiP {film}', ['/categoria.php?active=0&category=1&order=data&by=DESC&page=', 'peliculas', [0, 'movie']]), - ('Cerca BDRiP... submenu {film}', ['/categoria.php?active=0&category=1&order=data&by=DESC&argh.php?search=', 'search', 'search']), - ('DVD {film}', ['/categoria.php?active=0&category=20&order=data&by=DESC&page=', 'peliculas', [0, 'movie']]), - ('Cerca DVD... submenu {film}', ['/categoria.php?active=0&category=20&order=data&by=DESC&argh.php?search=', 'search', 'search']), - ('Screener {film}', ['/categoria.php?active=0&category=19&order=data&by=DESC&page=', 'peliculas', [0, 'movie']]), - ('Cerca Screener.. submenu {film}', ['/categoria.php?active=0&category=19&order=data&by=DESC&argh.php?search=', 'search', 'search']), - ('Serie TV', ['/categoria.php?active=0&category=15&order=data&by=DES&page=', 'peliculas', [0 , 'tvshow']]), - ('Cerca Serie TV.. submenu', ['/categoria.php?active=0&category=15&order=data&by=DESC&argh.php?search=', 'search', 'search']), - ('Anime', ['/categoria.php?active=0&category=5&order=data&by=DESC&page=', 'peliculas', [0, 'anime']]), - ('Cerca Anime.. submenu', ['/categoria.php?active=0&category=5&order=data&by=DESC&argh.php?search=', 'search', 'search']), - ('Musica', ['/categoria.php?active=0&category=2&order=data&by=DESC&page=', 'peliculas', [0, 'music']]), - ('Cerca Musica.. submenu', ['/categoria.php?active=0&category=2&order=data&by=DESC&argh.php?search=', 'search', 'search']), - ('Audiolibri {musica}', ['/categoria.php?active=0&category=18&order=data&by=DESC&page=', 'peliculas', [0, 'music']]), - ('Cerca Audiolibri.. submenu', ['/categoria.php?active=0&category=18&order=data&by=DESC&argh.php?search=', 'search', 'search']), - ('Altro {film}', ['/categoria.php?active=0&category=4&order=data&by=DESC&page=', 'peliculas', [0, 'movie']]), - ('Cerca altro.. submenu', ['/categoria.php?active=0&category=4&order=data&by=DESC&argh.php?search=', 'search', 'search']), - ('Cerca Tutto... color kod bold', ['/argh.php?search=', 'search', 'search']) + ('BDRiP {film}', ['/categoria.php?active=0&category=1&order=data&by=DESC&page=', 'peliculas', [0, 'movie', True]]), + ('Cerca BDRiP... submenu {film}', ['/torrent-ita/1/', 'search', ['search', 'movie', True]]), + ('DVD {film}', ['/categoria.php?active=0&category=20&order=data&by=DESC&page=', 'peliculas', [0, 'movie', True]]), + ('Cerca DVD... submenu {film}', ['/torrent-ita/20/', 'search', ['search', 'movie', True]]), + ('Screener {film}', ['/categoria.php?active=0&category=19&order=data&by=DESC&page=', 'peliculas', [0, 'movie', True]]), + ('Cerca Screener.. submenu {film}', ['/torrent-ita/19/', 'search', ['search', 'movie', True]]), + ('Serie TV', ['/categoria.php?active=0&category=15&order=data&by=DES&page=', 'peliculas', [0 , 'tvshow', True]]), + ('Cerca Serie TV.. submenu', ['/torrent-ita/15/', 'search', ['search', 'tvshow',True]]), + ('Anime', ['/categoria.php?active=0&category=5&order=data&by=DESC&page=', 'peliculas', [0, 'anime', True]]), + ('Cerca Anime.. submenu', ['/torrent-ita/5/', 'search', ['search', 'anime', True]]), + ('Musica', ['/categoria.php?active=0&category=2&order=data&by=DESC&page=', 'peliculas', [0, 'music', False]]), + ('Cerca Musica.. submenu', ['/torrent-ita/2/', 'search', ['search', 'music', False]]), + ('Audiolibri {musica}', ['/categoria.php?active=0&category=18&order=data&by=DESC&page=', 'peliculas', [0, 'music', False]]), + ('Cerca Audiolibri.. submenu', ['/torrent-ita/18/', 'search', ['search', 'music', False]]), + # mostrerebbe anche risultati non "multimediali" e allungherebbero inutilmente la ricerca globale + # ('Altro {film}', ['/categoria.php?active=0&category=4&order=data&by=DESC&page=', 'peliculas', [0, 'other', False]]), + # ('Cerca altro.. submenu', ['/torrent-ita/4/', 'search', ['search', 'other', False]]), + # ('Cerca Tutto... color kod bold', ['/argh.php?search=', 'search', ['search', 'all', False]]) ] return locals() @@ -40,23 +47,28 @@ def mainlist(item): @support.scrape def peliculas(item): - patron = r'>(?P<quality>[^"<]+)</td> <TD[^>]+><A class="tab" HREF="(?P<url>[^"]+)"\s*>(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<size>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<seed>[^<]+)' + sceneTitle = item.args[2] + if item.args[1] in ['tvshow', 'anime', 'music', 'other']: + patron = r'>[^"<]+' + else: + patron = r'>(?P<quality>[^"<]+)' + patron += '</td> <TD[^>]+><A class="tab" HREF="(?P<url>[^"]+)"\s*>(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<size>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<seed>[^<]+)' def itemHook(item): - item.title = item.title.replace('.',' ') - thumb = (item.args[1] if type(item.args) == list else item.args) + '.png' - item.thumbnail = support.thumb(thumb=thumb) + item.contentType = item.args[1] + return item if 'search' not in item.args: - support.log('OK') item.url += str(item.args[0]) def itemlistHook(itemlist): + args = item.args + args[0] += 1 itemlist.append( support.Item(channel=item.channel, action = item.action, contentType=item.contentType, title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), url=item.url, - args=item.args[0] + 1, + args=args, thumbnail=support.thumb())) return itemlist return locals() @@ -64,9 +76,11 @@ def peliculas(item): def search(item, text): support.log(item, text) - itemlist = [] - item.url += text + if 'all' in item.args: + item.url += text + else: + item.url += text + '.html' try: return peliculas(item) # Cattura la eccezione così non interrompe la ricerca globle se il canale si rompe! @@ -78,5 +92,6 @@ def search(item, text): def findvideos(item): + if item.contentType == 'tvshow': item.contentType = 'episode' video_library = True if 'movie' in item.args else False - return support.server(item, support.match(item.url, patron=r'"(magnet[^"]+)').match,down_load=False, video_library=video_library) + return support.server(item, support.match(item.url, patron=r'"(magnet[^"]+)').match, video_library=video_library) diff --git a/channels/ilgeniodellostreaming.json b/channels/ilgeniodellostreaming.json index 960aaabe..61bc398b 100644 --- a/channels/ilgeniodellostreaming.json +++ b/channels/ilgeniodellostreaming.json @@ -2,7 +2,6 @@ "id": "ilgeniodellostreaming", "name": "IlGenioDelloStreaming", "active": true, - "adult": false, "language": ["ita", "sub-ita"], "thumbnail": "ilgeniodellostreaming.png", "banner": "ilgeniodellostreaming.png", diff --git a/channels/italiaserie.json b/channels/italiaserie.json index a8d184b6..ad1b8c42 100644 --- a/channels/italiaserie.json +++ b/channels/italiaserie.json @@ -2,7 +2,6 @@ "id": "italiaserie", "name": "Italia Serie", "active": true, - "adult": false, "language": ["ita","sub-ita"], "thumbnail": "italiaserie.png", "bannermenu": "italiaserie.png", diff --git a/channels/metalvideo.json b/channels/metalvideo.json index e18004c7..bb2e792a 100644 --- a/channels/metalvideo.json +++ b/channels/metalvideo.json @@ -2,7 +2,6 @@ "id": "metalvideo", "name": "Metal Video", "active": true, - "adult": false, "language": ["*"], "thumbnail": "metalvideo.png", "banner": "metalvideo.png", diff --git a/channels/metalvideo.py b/channels/metalvideo.py index 95ccad47..823bc40e 100644 --- a/channels/metalvideo.py +++ b/channels/metalvideo.py @@ -25,6 +25,7 @@ def mainlist(item): patron = r'<a href="(?P<url>[^"]+)"(?: class="")?>(?P<title>[^<]+)<' def itemHook(item): item.thumbnail = support.thumb(thumb='music.png') + item.contentType = 'music' return item def itemlistHook(itemlist): itemlist.pop(0) @@ -32,7 +33,8 @@ def mainlist(item): support.Item( channel=item.channel, title=support.typo('Cerca...', 'bold color kod'), - url = item.url, + contentType='music', + url=item.url, action='search', thumbnail=support.thumb(thumb='search.png'))) return itemlist @@ -43,6 +45,7 @@ def peliculas(item): action = 'findvideos' patron= r'<img src="[^"]+" alt="(?P<title>[^"]+)" data-echo="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+><a href="(?P<url>[^"]+)"' patronNext = r'<a href="([^"]+)">»' + typeContentDict = {'': 'music'} return locals() diff --git a/channels/mondoserietv.json b/channels/mondoserietv.json index 3bd6ab63..9a7b1e0b 100644 --- a/channels/mondoserietv.json +++ b/channels/mondoserietv.json @@ -2,7 +2,6 @@ "id": "mondoserietv", "name": "MondoSerieTV", "active": true, - "adult": false, "language": ["ita"], "thumbnail": "mondoserietv.png", "bannermenu": "mondoserietv.png", diff --git a/channels/netfreex.json b/channels/netfreex.json index 775f3677..6c69f917 100644 --- a/channels/netfreex.json +++ b/channels/netfreex.json @@ -3,7 +3,6 @@ "name": "Netfreex", "language": ["ita"], "active": true, - "adult": false, "thumbnail": "netfreex.png", "banner": "netfreex.png", "categories": ["tvshow", "movie", "anime"], diff --git a/channels/piratestreaming.json b/channels/piratestreaming.json index b52b1c73..1f7ad819 100644 --- a/channels/piratestreaming.json +++ b/channels/piratestreaming.json @@ -2,7 +2,6 @@ "id": "piratestreaming", "name": "Pirate Streaming", "active": true, - "adult": false, "language": ["ita"], "thumbnail": "piratestreaming.png", "bannermenu": "piratestreaming.png", diff --git a/channels/polpotv.json b/channels/polpotv.json index 26c0610a..d3c8d09a 100644 --- a/channels/polpotv.json +++ b/channels/polpotv.json @@ -3,7 +3,6 @@ "name": "PolpoTV", "language": ["ita"], "active": true, - "adult": false, "thumbnail": "polpotv.png", "banner": "polpotv.png", "categories": ["movie","tvshow"], diff --git a/channels/porn/LIKUOO.json b/channels/porn/LIKUOO.json deleted file mode 100644 index 593db20f..00000000 --- a/channels/porn/LIKUOO.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "LIKUOO", - "name": "LIKUOO", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://likuoo.video/files_static/images/logo.jpg", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/LIKUOO.py b/channels/porn/LIKUOO.py deleted file mode 100644 index a0038dc6..00000000 --- a/channels/porn/LIKUOO.py +++ /dev/null @@ -1,100 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.likuoo.video' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Ultimos" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Pornstar" , action="categorias", url=host + "/pornstars/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/all-channels/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="item_p">.*?<a href="([^"]+)" title="([^"]+)"><img src="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail in matches: - scrapedplot = "" - scrapedthumbnail = "https:" + scrapedthumbnail - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'...<a href="([^"]+)" class="next">»</a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="categorias", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="item">.*?' - patron += '<a href="([^"]+)" title="(.*?)">.*?' - patron += 'src="(.*?)".*?' - patron += '<div class="runtime">(.*?)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,scrapedtime in matches: - url = urlparse.urljoin(item.url,scrapedurl) - scrapedtime = scrapedtime.replace("m", ":").replace("s", " ") - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " +scrapedtitle - contentTitle = title - thumbnail = "https:" + scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = contentTitle)) - next_page = scrapertools.find_single_match(data,'...<a href="([^"]+)" class="next">»</a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|amp;|\s{2}| ", "", data) - patron = 'url:\'([^\']+)\'.*?' - patron += 'data:\'([^\']+)\'' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl,post in matches: - post = post.replace("%3D", "=") - scrapedurl = host + scrapedurl - logger.debug( item.url +" , "+ scrapedurl +" , " +post ) - datas = httptools.downloadpage(scrapedurl, post=post, headers={'Referer':item.url}).data - datas = datas.replace("\\", "") - url = scrapertools.find_single_match(datas, '<iframe src="([^"]+)"') - itemlist.append( Item(channel=item.channel, action="play", title = "%s", url=url )) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - return itemlist - diff --git a/channels/porn/TXXX.json b/channels/porn/TXXX.json deleted file mode 100644 index ee4be410..00000000 --- a/channels/porn/TXXX.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "TXXX", - "name": "TXXX", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.txxx.com/images/desktop-logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/TXXX.py b/channels/porn/TXXX.py deleted file mode 100644 index 32a360b2..00000000 --- a/channels/porn/TXXX.py +++ /dev/null @@ -1,149 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://www.txxx.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Ultimas" , action="lista", url=host + "/latest-updates/")) - itemlist.append( Item(channel=item.channel, title="Mejor valoradas" , action="lista", url=host + "/top-rated/")) - itemlist.append( Item(channel=item.channel, title="Mas popular" , action="lista", url=host + "/most-popular/")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="catalogo", url=host + "/channels-list/most-popular/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="channel-thumb">.*?' - patron += '<a href="([^"]+)" title="([^"]+)".*?' - patron += '<img src="([^"]+)".*?' - patron += '<span>(.*?)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,num in matches: - scrapedplot = "" - scrapedurl = host + scrapedurl - title = scrapedtitle + "[COLOR yellow] " + num + "[/COLOR]" - itemlist.append( Item(channel=item.channel, action="lista", title=title , url=scrapedurl , - thumbnail=scrapedthumbnail , plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<a class=" btn btn--size--l btn--next" href="([^"]+)" title="Next Page"') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel , action="catalogo" , title="Página Siguiente >>" , - text_color="blue", url=next_page) ) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<a class="categories-list__link" href="([^"]+)">.*?' - patron += '<span class="categories-list__name cat-icon" data-title="([^"]+)">.*?' - patron += '<span class="categories-list__badge">(.*?)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,num in matches: - url = urlparse.urljoin(item.url,scrapedurl) - scrapedthumbnail = "" - scrapedplot = "" - title = scrapedtitle + "[COLOR yellow] " + num + "[/COLOR]" - itemlist.append( Item(channel=item.channel, action="lista", title=title , url=url , - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = 'data-video-id="\d+">.*?<a href="([^"]+)".*?' - patron += '<img src="([^"]+)" alt="([^"]+)".*?' - patron += '</div>(.*?)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,scrapedtime in matches: - contentTitle = scrapedtitle - scrapedhd = scrapertools.find_single_match(scrapedtime, '<span class="thumb__hd">(.*?)</span>') - duration = scrapertools.find_single_match(scrapedtime, '<span class="thumb__duration">(.*?)</span>') - if scrapedhd != '': - title = "[COLOR yellow]" +duration+ "[/COLOR] " + "[COLOR red]" +scrapedhd+ "[/COLOR] "+scrapedtitle - else: - title = "[COLOR yellow]" + duration + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play" , title=title , url=scrapedurl, thumbnail=thumbnail, - plot=plot, contentTitle=title) ) - next_page = scrapertools.find_single_match(data,'<a class=" btn btn--size--l btn--next.*?" href="([^"]+)" title="Next Page"') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - video_url = scrapertools.find_single_match(data, 'var video_url = "([^"]*)"') - video_url += scrapertools.find_single_match(data, 'video_url \+= "([^"]*)"') - partes = video_url.split('||') - video_url = decode_url(partes[0]) - video_url = re.sub('/get_file/\d+/[0-9a-z]{32}/', partes[1], video_url) - video_url += '&' if '?' in video_url else '?' - video_url += 'lip=' + partes[2] + '<=' + partes[3] - itemlist.append(item.clone(action="play", title=item.title, url=video_url)) - return itemlist - - -def decode_url(txt): - _0x52f6x15 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,~' - reto = ''; n = 0 - # En las dos siguientes líneas, ABCEM ocupan 2 bytes cada letra! El replace lo deja en 1 byte. !!!!: АВСЕМ (10 bytes) ABCEM (5 bytes) - txt = re.sub('[^АВСЕМA-Za-z0-9\.\,\~]', '', txt) - txt = txt.replace('А', 'A').replace('В', 'B').replace('С', 'C').replace('Е', 'E').replace('М', 'M') - - while n < len(txt): - a = _0x52f6x15.index(txt[n]) - n += 1 - b = _0x52f6x15.index(txt[n]) - n += 1 - c = _0x52f6x15.index(txt[n]) - n += 1 - d = _0x52f6x15.index(txt[n]) - n += 1 - - a = a << 2 | b >> 4 - b = (b & 15) << 4 | c >> 2 - e = (c & 3) << 6 | d - reto += chr(a) - if c != 64: reto += chr(b) - if d != 64: reto += chr(e) - - return urllib.unquote(reto) - diff --git a/channels/porn/__init__.py b/channels/porn/__init__.py deleted file mode 100644 index 0b95a268..00000000 --- a/channels/porn/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import sys - -# Appends the main plugin dir to the PYTHONPATH if an internal package cannot be imported. -# Examples: In Plex Media Server all modules are under "Code.*" package, and in Enigma2 under "Plugins.Extensions.*" -try: - # from core import logger - import core -except: - sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) diff --git a/channels/porn/absoluporn.json b/channels/porn/absoluporn.json deleted file mode 100644 index b3234d03..00000000 --- a/channels/porn/absoluporn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "absoluporn", - "name": "absoluporn", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.absoluporn.es/image/deco/logo.gif", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/absoluporn.py b/channels/porn/absoluporn.py deleted file mode 100644 index 32abc69c..00000000 --- a/channels/porn/absoluporn.py +++ /dev/null @@ -1,95 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://www.absoluporn.es' - - -def mainlist(item): - logger.info() - itemlist = [] - - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/wall-date-1.html")) - itemlist.append( Item(channel=item.channel, title="Mas valorados" , action="lista", url=host + "/wall-note-1.html")) - itemlist.append( Item(channel=item.channel, title="Mas vistos" , action="lista", url=host + "/wall-main-1.html")) - itemlist.append( Item(channel=item.channel, title="Mas largos" , action="lista", url=host + "/wall-time-1.html")) - - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search-%s-1.html" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = ' <a href="([^"]+)" class="link1">([^"]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedurl = scrapedurl.replace(".html", "_date.html") - scrapedurl = host +"/" + scrapedurl - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail , plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<div class="thumb-main-titre"><a href="([^"]+)".*?' - patron += 'title="([^"]+)".*?' - patron += 'src="([^"]+)".*?' - patron += '<div class="time">(.*?)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,scrapedtime in matches: - url = urlparse.urljoin(item.url,scrapedurl) - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, plot=plot, - fanart=thumbnail, contentTitle = scrapedtitle)) - next_page = scrapertools.find_single_match(data, '<span class="text16">\d+</span> <a href="..([^"]+)"') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="lista", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = 'servervideo = \'([^\']+)\'.*?' - patron += 'path = \'([^\']+)\'.*?' - patron += 'filee = \'([^\']+)\'.*?' - matches = scrapertools.find_multiple_matches(data, patron) - for servervideo,path,filee in matches: - scrapedurl = servervideo + path + "56ea912c4df934c216c352fa8d623af3" + filee - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=scrapedurl, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - return itemlist - diff --git a/channels/porn/alsoporn.json b/channels/porn/alsoporn.json deleted file mode 100644 index 25501c10..00000000 --- a/channels/porn/alsoporn.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "alsoporn", - "name": "alsoporn", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://alsoporn.com/images/alsoporn.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} diff --git a/channels/porn/alsoporn.py b/channels/porn/alsoporn.py deleted file mode 100644 index 5433405d..00000000 --- a/channels/porn/alsoporn.py +++ /dev/null @@ -1,99 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools -import base64 - -host = 'http://www.alsoporn.com' - - -def mainlist(item): - logger.info() - itemlist = [] - # itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/en/g/All/new/1")) - itemlist.append( Item(channel=item.channel, title="Top" , action="lista", url=host + "/g/All/top/1")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/=%s/" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a href="([^"]+)">.*?' - patron += '<img src="([^"]+)" alt="([^"]+)" />' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - scrapedplot = "" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return sorted(itemlist, key=lambda i: i.title) - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="alsoporn_prev">.*?' - patron += '<a href="([^"]+)">.*?' - patron += '<img src="([^"]+)" alt="([^"]+)">.*?' - patron += '<span>([^"]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,scrapedtime in matches: - url = urlparse.urljoin(item.url,scrapedurl) - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - if not "0:00" in scrapedtime: - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = scrapedtitle)) - - next_page = scrapertools.find_single_match(data,'<li><a href="([^"]+)" target="_self"><span class="alsoporn_page">NEXT</span></a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - scrapedurl = scrapertools.find_single_match(data,'<iframe frameborder=0 scrolling="no" src=\'([^\']+)\'') - data = httptools.downloadpage(scrapedurl).data - scrapedurl1 = scrapertools.find_single_match(data,'<iframe src="(.*?)"') - scrapedurl1 = scrapedurl1.replace("//www.playercdn.com/ec/i2.php?url=", "") - scrapedurl1 = base64.b64decode(scrapedurl1 + "=") - logger.debug(scrapedurl1) - data = httptools.downloadpage(scrapedurl1).data - if "xvideos" in scrapedurl1: - scrapedurl2 = scrapertools.find_single_match(data, 'html5player.setVideoHLS\(\'([^\']+)\'\)') - if "xhamster" in scrapedurl1: - scrapedurl2 = scrapertools.find_single_match(data, '"[0-9]+p":"([^"]+)"').replace("\\", "") - - logger.debug(scrapedurl2) - itemlist.append(item.clone(action="play", title=item.title, url=scrapedurl2)) - return itemlist - diff --git a/channels/porn/analdin.json b/channels/porn/analdin.json deleted file mode 100644 index f465b719..00000000 --- a/channels/porn/analdin.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "analdin", - "name": "analdin", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://www.analdin.com/images/logo-retina.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} diff --git a/channels/porn/analdin.py b/channels/porn/analdin.py deleted file mode 100644 index 65cb6793..00000000 --- a/channels/porn/analdin.py +++ /dev/null @@ -1,113 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - - -host = 'https://www.analdin.com/es' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host + "/más-reciente/")) - itemlist.append( Item(channel=item.channel, title="Mas Vistas" , action="lista", url=host + "/más-visto/")) - itemlist.append( Item(channel=item.channel, title="Mejor valorada" , action="lista", url=host + "/mejor-valorado/")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="catalogo", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categorías/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data,'<strong class="popup-title">Canales</strong>(.*?)<strong>Models</strong>') - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<li><a class="item" href="([^"]+)" title="([^"]+)">' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<li class="arrow"><a rel="next" href="([^"]+)">»</a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="catalogo", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a class="item" href="([^"]+)" title="([^"]+)">.*?' - patron += 'src="([^"]+)".*?' - patron += '<div class="videos">([^"]+)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,cantidad in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return sorted(itemlist, key=lambda i: i.title) - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a class="popup-video-link" href="([^"]+)".*?' - patron += 'thumb="([^"]+)".*?' - patron += '<div class="duration">(.*?)</div>.*?' - patron += '<strong class="title">\s*([^"]+)</strong>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtime,scrapedtitle in matches: - url = urlparse.urljoin(item.url,scrapedurl) - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, plot=plot, - fanart=thumbnail, contentTitle = title)) - next_page = scrapertools.find_single_match(data,'<li class="next"><a href="([^"]+)"') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="lista", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = 'video_url: \'([^\']+)\'' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl in matches: - url = scrapedurl - itemlist.append(item.clone(action="play", title=url, url=url)) - return itemlist - diff --git a/channels/porn/beeg.json b/channels/porn/beeg.json deleted file mode 100755 index 01d595cb..00000000 --- a/channels/porn/beeg.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "beeg", - "name": "Beeg", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "beeg.png", - "banner": "beeg.png", - "categories": [ - "adult" - ], - "settings": [ - ] -} diff --git a/channels/porn/beeg.py b/channels/porn/beeg.py deleted file mode 100755 index 3ce4c8f9..00000000 --- a/channels/porn/beeg.py +++ /dev/null @@ -1,122 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urllib - -from core import jsontools as json -from core import scrapertools -from core.item import Item -from platformcode import logger -from core import httptools - - -url_api = "" -Host = "https://beeg.com" - - -def get_api_url(): - global url_api - data = httptools.downloadpage(Host).data - version = re.compile('var beeg_version = ([\d]+)').findall(data)[0] - url_api = Host + "/api/v6/" + version - - -get_api_url() - - -def mainlist(item): - logger.info() - get_api_url() - itemlist = [] - itemlist.append(Item(channel=item.channel, action="videos", title="Útimos videos", url=url_api + "/index/main/0/pc", - viewmode="movie")) - itemlist.append(Item(channel=item.channel, action="canal", title="Canal", - url=url_api + "/channels")) - itemlist.append(Item(channel=item.channel, action="listcategorias", title="Categorias", - url=url_api + "/index/main/0/pc", extra="nonpopular")) - itemlist.append( - Item(channel=item.channel, action="search", title="Buscar")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = url_api + "/index/tag/0/pc?tag=%s" % (texto) - - try: - return videos(item) - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - -def videos(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - JSONData = json.load(data) - for Video in JSONData["videos"]: - thumbnail = "http://img.beeg.com/236x177/" + str(Video["id"]) + ".jpg" - url= '%s/video/%s?v=2&s=%s&e=%s' % (url_api, Video['svid'], Video['start'], Video['end']) - title = Video["title"] - itemlist.append( - Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, plot="", show="", - folder=True, contentType="movie")) - # Paginador - Actual = int(scrapertools.find_single_match(item.url, url_api + '/index/[^/]+/([0-9]+)/pc')) - if JSONData["pages"] - 1 > Actual: - scrapedurl = item.url.replace("/" + str(Actual) + "/", "/" + str(Actual + 1) + "/") - itemlist.append( - Item(channel=item.channel, action="videos", title="Página Siguiente", url=scrapedurl, thumbnail="", - viewmode="movie")) - return itemlist - - -def listcategorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - JSONData = json.load(data) - for Tag in JSONData["tags"]: - url = url_api + "/index/tag/0/pc?tag=" + Tag["tag"] - url = url.replace("%20", "-") - title = '%s (%s)' % (str(Tag["tag"]), str(Tag["videos"])) - itemlist.append( - Item(channel=item.channel, action="videos", title=title, url=url, viewmode="movie", type="item")) - return itemlist - - -def canal(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - JSONData = json.load(data) - for Tag in JSONData["channels"]: - url = url_api + "/index/channel/0/pc?channel=" + Tag["channel"] - url = url.replace("%20", "-") - title = '%s (%s)' % (str(Tag["ps_name"]), str(Tag["videos"])) - itemlist.append( - Item(channel=item.channel, action="videos", title=title, url=url, viewmode="movie", type="item")) - return itemlist - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - JSONData = json.load(data) - for key in JSONData: - videourl = re.compile("([0-9]+p)", re.DOTALL).findall(key) - if videourl: - videourl = videourl[0] - if not JSONData[videourl] == None: - url = JSONData[videourl] - url = url.replace("{DATA_MARKERS}", "data=pc.ES") - if not url.startswith("https:"): url = "https:" + url - title = videourl - itemlist.append(["%s %s [directo]" % (title, url[-4:]), url]) - itemlist.sort(key=lambda item: item[0]) - return itemlist - diff --git a/channels/porn/bravoporn.json b/channels/porn/bravoporn.json deleted file mode 100644 index 2ed81efb..00000000 --- a/channels/porn/bravoporn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "bravoporn", - "name": "bravoporn", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.bravoporn.com/v/images/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} diff --git a/channels/porn/bravoporn.py b/channels/porn/bravoporn.py deleted file mode 100644 index 740dd779..00000000 --- a/channels/porn/bravoporn.py +++ /dev/null @@ -1,89 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ - -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://www.bravoporn.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host +"/latest-updates/")) - itemlist.append( Item(channel=item.channel, title="Popular" , action="lista", url=host + "/most-popular/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/c/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/s/?q=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a href="([^"]+)" class="th">.*?' - patron += '<img src="([^"]+)".*?' - patron += '<span>([^"]+)</span>\s*(\d+) movies.*?</strong>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - scrapedthumbnail = "http:" + scrapedthumbnail - scrapedurl = urlparse.urljoin(item.url,scrapedurl) + "/latest/" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class=".*?video_block"><a href="([^"]+)".*?' - patron += '<img src="([^"]+)".*?alt="([^"]+)".*?' - patron += '<span class="time">([^"]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,duracion in matches: - url = urlparse.urljoin(item.url,scrapedurl) - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - thumbnail = "https:" + scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = scrapedtitle)) - next_page = scrapertools.find_single_match(data,'<a href="([^"]+)" class="next" title="Next">Next</a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<source src="([^"]+)" type=\'video/mp4\' title="HQ" />' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl in matches: - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=scrapedurl)) - return itemlist - diff --git a/channels/porn/camwhoresbay.json b/channels/porn/camwhoresbay.json deleted file mode 100644 index f57213ca..00000000 --- a/channels/porn/camwhoresbay.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "camwhoresbay", - "name": "camwhoresbay", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://www.camwhoresbay.com/images/porntrex.ico", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/camwhoresbay.py b/channels/porn/camwhoresbay.py deleted file mode 100644 index 85ba0b04..00000000 --- a/channels/porn/camwhoresbay.py +++ /dev/null @@ -1,114 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.camwhoresbay.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/latest-updates/")) - itemlist.append( Item(channel=item.channel, title="Mejor valorados" , action="lista", url=host + "/top-rated/")) - itemlist.append( Item(channel=item.channel, title="Mas vistos" , action="lista", url=host + "/most-popular/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - item.url = "%s/search/%s/" % (host, texto.replace("+", "-")) - item.extra = texto - try: - return lista(item) - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<a class="item" href="([^"]+)" title="([^"]+)">.*?' - patron += '<img class="thumb" src="([^"]+)".*?' - patron += '<div class="videos">([^"]+)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle,scrapedthumbnail,cantidad in matches: - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - scrapedplot = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return sorted(itemlist, key=lambda i: i.title) - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="video-item ">.*?' - patron += '<a href="([^"]+)" title="([^"]+)" class="thumb">.*?' - patron += 'data-original="([^"]+)".*?' - patron += '<i class="fa fa-clock-o"></i>(.*?)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,scrapedtime in matches: - url = urlparse.urljoin(item.url,scrapedurl) - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - thumbnail = "http:" + scrapedthumbnail + "|Referer=%s" % item.url - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, plot=plot, - contentTitle = scrapedtitle, fanart=thumbnail)) - if item.extra: - next_page = scrapertools.find_single_match(data, '<li class="next">.*?from_videos\+from_albums:(\d+)') - if next_page: - if "from_videos=" in item.url: - next_page = re.sub(r'&from_videos=(\d+)', '&from_videos=%s' % next_page, item.url) - else: - next_page = "%s?mode=async&function=get_block&block_id=list_videos_videos_list_search_result" \ - "&q=%s&category_ids=&sort_by=post_date&from_videos=%s" % (item.url, item.extra, next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page)) - else: - next_page = scrapertools.find_single_match(data, '<li class="next"><a href="([^"]+)"') - if next_page and not next_page.startswith("#"): - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - else: - next_page = scrapertools.find_single_match(data, '<li class="next">.*?from:(\d+)') - if next_page: - if "from" in item.url: - next_page = re.sub(r'&from=(\d+)', '&from=%s' % next_page, item.url) - else: - next_page = "%s?mode=async&function=get_block&block_id=list_videos_common_videos_list&sort_by=post_date&from=%s" % ( - item.url, next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page)) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - scrapedurl = scrapertools.find_single_match(data, 'video_alt_url3: \'([^\']+)\'') - if scrapedurl == "" : - scrapedurl = scrapertools.find_single_match(data, 'video_alt_url2: \'([^\']+)\'') - if scrapedurl == "" : - scrapedurl = scrapertools.find_single_match(data, 'video_alt_url: \'([^\']+)\'') - if scrapedurl == "" : - scrapedurl = scrapertools.find_single_match(data, 'video_url: \'([^\']+)\'') - - itemlist.append(Item(channel=item.channel, action="play", title=scrapedurl, url=scrapedurl, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo")) - return itemlist - - diff --git a/channels/porn/canalporno.json b/channels/porn/canalporno.json deleted file mode 100644 index 9d6913b7..00000000 --- a/channels/porn/canalporno.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "id": "canalporno", - "name": "Canalporno", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://i.imgur.com/gAbPcvT.png?1", - "banner": "canalporno.png", - "categories": [ - "adult" - ] -} \ No newline at end of file diff --git a/channels/porn/canalporno.py b/channels/porn/canalporno.py deleted file mode 100644 index 58051909..00000000 --- a/channels/porn/canalporno.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- coding: utf-8 -*- -import urlparse,re - -from core import httptools -from core import scrapertools -from platformcode import logger - -host = "http://www.canalporno.com" - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(item.clone(action="lista", title="Útimos videos", url=host + "/ajax/homepage/?page=1")) - itemlist.append(item.clone(action="categorias", title="Canal", url=host + "/ajax/list_producers/?page=1")) - itemlist.append(item.clone(action="categorias", title="PornStar", url=host + "/ajax/list_pornstars/?page=1")) - itemlist.append(item.clone(action="categorias", title="Categorias", - url=host + "/categorias")) - itemlist.append(item.clone(action="search", title="Buscar")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/ajax/new_search/?q=%s&page=1" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - if "pornstars" in item.url: - patron = '<div class="muestra.*?href="([^"]+)".*?src=\'([^\']+)\'.*?alt="([^"]+)".*?' - else: - patron = '<div class="muestra.*?href="([^"]+)".*?src="([^"]+)".*?alt="([^"]+)".*?' - if "Categorias" in item.title: - patron += '<div class="numero">([^<]+)</div>' - else: - patron += '</span> (\d+) vídeos</div>' - matches = scrapertools.find_multiple_matches(data, patron) - for url, scrapedthumbnail, scrapedtitle, cantidad in matches: - title= "%s [COLOR yellow] %s [/COLOR]" % (scrapedtitle, cantidad) - url= url.replace("/videos-porno/", "/ajax/show_category/").replace("/sitio/", "/ajax/show_producer/").replace("/pornstar/", "/ajax/show_pornstar/") - url = host + url + "?page=1" - itemlist.append(item.clone(action="lista", title=title, url=url, thumbnail=scrapedthumbnail)) - if "/?page=" in item.url: - next_page=item.url - num= int(scrapertools.find_single_match(item.url,".*?/?page=(\d+)")) - num += 1 - next_page = "?page=" + str(num) - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="categorias", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = 'data-src="([^"]+)" alt="([^"]+)".*?<h2><a href="([^"]+)">.*?' \ - '<div class="duracion"><span class="ico-duracion sprite"></span> ([^"]+) min</div>' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedthumbnail, scrapedtitle, scrapedurl, duration in matches: - title = "[COLOR yellow] %s [/COLOR] %s" % (duration, scrapedtitle) - url = host + scrapedurl - itemlist.append(item.clone(action="play", title=title, url=url, thumbnail=scrapedthumbnail)) - last=scrapertools.find_single_match(item.url,'(.*?)page=\d+') - num= int(scrapertools.find_single_match(item.url,".*?/?page=(\d+)")) - num += 1 - next_page = "page=" + str(num) - if next_page!="": - next_page = last + next_page - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - url = scrapertools.find_single_match(data, '<source src="([^"]+)"') - itemlist.append(item.clone(url=url, server="directo")) - return itemlist diff --git a/channels/porn/cat3plus.json b/channels/porn/cat3plus.json deleted file mode 100644 index ada3335f..00000000 --- a/channels/porn/cat3plus.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "cat3plus", - "name": "Cat3plus", - "active": true, - "adult": true, - "language": [], - "thumbnail": "https://i.imgur.com/SJxXKa2.png", - "fanart": "https://i.imgur.com/ejCwTxT.jpg", - "banner": "https://i.imgur.com/bXUyk6m.png", - "categories": [ - "movie", - "vos" - ] -} diff --git a/channels/porn/cat3plus.py b/channels/porn/cat3plus.py deleted file mode 100644 index ea0a7234..00000000 --- a/channels/porn/cat3plus.py +++ /dev/null @@ -1,130 +0,0 @@ -# -*- coding: utf-8 -*- -# -*- Channel SleazeMovies -*- -# -*- Created for Alfa-addon -*- -# -*- By Sculkurt -*- - - -import re -import urllib -import urlparse -from channelselector import get_thumb -from core import httptools -from core import scrapertools -from core import servertools -from core import tmdb -from core.item import Item -from platformcode import config, logger - -host = 'http://www.cat3plus.com/' - -headers = [ - ['User-Agent', 'Mozilla/5.0 (Windows NT 6.1; rv:38.0) Gecko/20100101 Firefox/38.0'], - ['Accept-Encoding', 'gzip, deflate'], - ['Referer', host] -] - -def mainlist(item): - logger.info() - - itemlist = list() - itemlist.append(item.clone(title="Todas", action="list_all", url=host, thumbnail=get_thumb('all', auto=True))) - itemlist.append(item.clone(title="Años", action="years", url=host, thumbnail=get_thumb('year', auto=True))) - itemlist.append(item.clone(title="Buscar", action="search", thumbnail=get_thumb('search', auto=True))) - - return itemlist - -def years(item): - logger.info() - itemlist = list() - data = httptools.downloadpage(item.url, cookies=False).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - patron = "<a dir='ltr' href='([^']+)'>([^<]+)</a>" - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedtitle in matches: - itemlist.append(item.clone(action='list_all', title=scrapedtitle, url=scrapedurl)) - return itemlist - -def get_source(url): - logger.info() - data = httptools.downloadpage(url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - return data - - -def list_all(item): - logger.info() - itemlist = [] - data = get_source(item.url) - - patron = "<h2 class='post-title entry-title'><a href='([^']+)'>([^(]+).*?\(([^)]+).*?" - patron += 'src="([^"]+).*?' - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedurl, scrapedtitle, year, img in matches: - itemlist.append(Item(channel = item.channel, - title = scrapedtitle, - url = scrapedurl, - action = "findvideos", - thumbnail = img, - contentTitle = scrapedtitle, - contentType = "movie", - infoLabels = {'year': year})) - tmdb.set_infoLabels_itemlist(itemlist, seekTmdb = True) - - # Extraer la marca de siguiente página - next_page = scrapertools.find_single_match(data, "<a class='blog-pager-older-link' href='([^']+)'") - if next_page != "": - itemlist.append(Item(channel=item.channel, action="list_all", title=">> Página siguiente", url=next_page, folder=True)) - - return itemlist - - - -def search(item, texto): - logger.info() - if texto != "": - texto = texto.replace(" ", "+") - item.url = host + "search?q=" + texto - item.extra = "busqueda" - try: - return list_all(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def findvideos(item): - logger.info() - - itemlist = [] - - data = httptools.downloadpage(item.url).data - - patron = '<h2>\s*<a href="([^"]+)" target="_blank">.*?</a></h2>' - matches = re.compile(patron, re.DOTALL).findall(data) - - for url in matches: - data = httptools.downloadpage(url, headers={'Referer': item.url}).data - - itemlist.extend(servertools.find_video_items(data=data)) - - for video in itemlist: - - video.channel = item.channel - video.contentTitle = item.contentTitle - video.title = video.server.capitalize() - - # Opción "Añadir esta pelicula a la videoteca" - if config.get_videolibrary_support() and len(itemlist) > 0 and item.extra != 'findvideos': - itemlist.append(Item(channel = item.channel, - title = '[COLOR yellow]Añadir esta pelicula a la videoteca[/COLOR]', - url = item.url, - action = "add_pelicula_to_library", - extra = "findvideos", - contentTitle = item.contentTitle, - thumbnail = item.thumbnail - )) - - return itemlist \ No newline at end of file diff --git a/channels/porn/cinetemagay.json b/channels/porn/cinetemagay.json deleted file mode 100644 index a94f5844..00000000 --- a/channels/porn/cinetemagay.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "id": "cinetemagay", - "name": "Cinetemagay", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "cinetemagay.png", - "banner": "cinetemagay.png", - "categories": [ - "adult" - ] -} \ No newline at end of file diff --git a/channels/porn/cinetemagay.py b/channels/porn/cinetemagay.py deleted file mode 100644 index ad5f5a6d..00000000 --- a/channels/porn/cinetemagay.py +++ /dev/null @@ -1,128 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import re - -from core import scrapertools -from core import servertools -from core import httptools -from core.item import Item -from platformcode import config, logger - -IMAGES_PATH = os.path.join(config.get_runtime_path(), 'resources', 'images', 'cinetemagay') - - -def strip_tags(value): - return re.sub(r'<[^>]*?>', '', value) - - -def mainlist(item): - logger.info() - - itemlist = [] - itemlist.append(Item(channel=item.channel, action="lista", title="Cine gay latinoamericano", - url="http://cinegaylatinoamericano.blogspot.com.es/feeds/posts/default/?max-results=100&start-index=1", - thumbnail="http://www.americaeconomia.com/sites/default/files/imagecache/foto_nota/homosexual1.jpg")) - itemlist.append(Item(channel=item.channel, action="lista", title="Cine y cortos gay", - url="http://cineycortosgay.blogspot.com.es/feeds/posts/default/?max-results=100&start-index=1", - thumbnail="http://www.elmolar.org/wp-content/uploads/2015/05/cortometraje.jpg")) - itemlist.append(Item(channel=item.channel, action="lista", title="Cine gay online (México)", - url="http://cinegayonlinemexico.blogspot.com.es/feeds/posts/default/?max-results=100&start-index=1", - thumbnail="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTmmqL6tS2Ced1VoxlGQT0q-ibPEz1DCV3E1waHFDI5KT0pg1lJ")) - itemlist.append(Item(channel=item.channel, action="lista", title="Sentido gay", - url="http://www.sentidogay.blogspot.com.es//feeds/posts/default/?max-results=100&start-index=1", - thumbnail="http://1.bp.blogspot.com/-epOPgDD_MQw/VPGZGQOou1I/AAAAAAAAAkI/lC25GrukDuo/s1048/SentidoGay.jpg")) - itemlist.append(Item(channel=item.channel, action="lista", title="PGPA", - url="http://pgpa.blogspot.com.es/feeds/posts/default/?max-results=100&start-index=1", - thumbnail="http://themes.googleusercontent.com/image?id=0BwVBOzw_-hbMNTRlZjk2YWMtYTVlMC00ZjZjLWI3OWEtMWEzZDEzYWVjZmQ4")) - - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - - # Descarga la pagina - data = httptools.downloadpage(item.url).data - - # Extrae las entradas (carpetas) - patronvideos = '<img .*?src="(.*?)"' - patronvideos += "(.*?)<link rel='alternate' type='text/html' href='([^']+)' title='([^']+)'.*?>" - matches = re.compile(patronvideos, re.DOTALL).findall(data) - - for match in matches: - scrapedtitle = match[3] - scrapedtitle = scrapedtitle.replace("'", "'") - scrapedtitle = scrapedtitle.replace(""", "'") - scrapedtitle = scrapedtitle.replace("&amp;", "'") - scrapedtitle = scrapedtitle.replace("&#39;", "'") - scrapedurl = match[2] - scrapedthumbnail = match[0] - imagen = "" - scrapedplot = match[1] - tipo = match[1] - logger.debug("title=[" + scrapedtitle + "], url=[" + scrapedurl + "], thumbnail=[" + scrapedthumbnail + "]") - scrapedplot = "<" + scrapedplot - scrapedplot = scrapedplot.replace(">", ">") - scrapedplot = scrapedplot.replace("<", "<") - scrapedplot = scrapedplot.replace("</div>", "\n") - scrapedplot = scrapedplot.replace("<br />", "\n") - scrapedplot = scrapedplot.replace("&", "") - scrapedplot = scrapedplot.replace("nbsp;", "") - scrapedplot = strip_tags(scrapedplot) - itemlist.append( - Item(channel=item.channel, action="detail", title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail, - plot=scrapedurl + scrapedplot, folder=True)) - - variable = item.url.split("index=")[1] - variable = int(variable) - variable += 100 - variable = str(variable) - variable_url = item.url.split("index=")[0] - url_nueva = variable_url + "index=" + variable - itemlist.append( - Item(channel=item.channel, action="lista", title="Ir a la página siguiente (desde " + variable + ")", - url=url_nueva, thumbnail="", plot="Pasar a la página siguiente (en grupos de 100)\n\n" + url_nueva)) - - return itemlist - - -def detail(item): - logger.info() - itemlist = [] - - # Descarga la pagina - data = httptools.downloadpage(item.url).data - - data = data.replace("%3A", ":") - data = data.replace("%2F", "/") - data = data.replace("%3D", "=") - data = data.replace("%3", "?") - data = data.replace("%26", "&") - descripcion = "" - plot = "" - patrondescrip = 'SINOPSIS:(.*?)' - matches = re.compile(patrondescrip, re.DOTALL).findall(data) - if len(matches) > 0: - descripcion = matches[0] - descripcion = descripcion.replace(" ", "") - descripcion = descripcion.replace("<br/>", "") - descripcion = descripcion.replace("\r", "") - descripcion = descripcion.replace("\n", " ") - descripcion = descripcion.replace("\t", " ") - descripcion = re.sub("<[^>]+>", " ", descripcion) - descripcion = descripcion - try: - plot = unicode(descripcion, "utf-8").encode("iso-8859-1") - except: - plot = descripcion - - # Busca los enlaces a los videos de servidores - video_itemlist = servertools.find_video_items(data=data) - for video_item in video_itemlist: - itemlist.append(Item(channel=item.channel, action="play", server=video_item.server, - title=item.title + " " + video_item.title, url=video_item.url, thumbnail=item.thumbnail, - plot=video_item.url, folder=False)) - - return itemlist diff --git a/channels/porn/cliphunter.json b/channels/porn/cliphunter.json deleted file mode 100644 index 98a6fe42..00000000 --- a/channels/porn/cliphunter.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "cliphunter", - "name": "cliphunter", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.cliphunter.com/gfx/new/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} diff --git a/channels/porn/cliphunter.py b/channels/porn/cliphunter.py deleted file mode 100644 index 16f3d093..00000000 --- a/channels/porn/cliphunter.py +++ /dev/null @@ -1,108 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - - -host = 'https://www.cliphunter.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host + "/categories/All")) - itemlist.append( Item(channel=item.channel, title="Popular" , action="lista", url=host + "/popular/ratings/yesterday")) - itemlist.append( Item(channel=item.channel, title="Pornstars" , action="catalogo", url=host + "/pornstars/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a href="([^"]+)">\s*<img src=\'([^\']+)\'/>.*?<span>([^"]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - scrapedplot = "" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) + "/movies" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail , plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<li class="arrow"><a rel="next" href="([^"]+)">»</a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="catalogo", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a href="([^"]+)" title="([^"]+)">.*?<img src="([^"]+)"/>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<img class=".*?" src="([^"]+)".*?<div class="tr">(.*?)</div>.*?<a href="([^"]+)\s*" class="vttl.*?">(.*?)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedthumbnail,scrapedtime,scrapedurl,scrapedtitle in matches: - url = urlparse.urljoin(item.url,scrapedurl) - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, plot=plot, - fanart=thumbnail, contentTitle = title )) - next_page = scrapertools.find_single_match(data,'<li class="arrow"><a rel="next" href="([^"]+)">»</a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '"url"\:"(.*?)"' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl in matches: - scrapedurl = scrapedurl.replace("\/", "/") - title = scrapedurl - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=scrapedurl, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo")) - return itemlist - diff --git a/channels/porn/coomelonitas.json b/channels/porn/coomelonitas.json deleted file mode 100644 index e20668d1..00000000 --- a/channels/porn/coomelonitas.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "coomelonitas", - "name": "Coomelonitas", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.coomelonitas.com/wp-content/themes/3xTheme/images/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} diff --git a/channels/porn/coomelonitas.py b/channels/porn/coomelonitas.py deleted file mode 100644 index ae943a7d..00000000 --- a/channels/porn/coomelonitas.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host ='http://www.coomelonitas.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host+ "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<li class="cat-item cat-item-\d+"><a href="([^"]+)">([^"]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="all"(.*?)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for match in matches: - title = scrapertools.find_single_match(match,'title="([^"]+)"') - url = scrapertools.find_single_match(match,'<a href="([^"]+)"') - plot = scrapertools.find_single_match(match,'<p class="summary">(.*?)</p>') - thumbnail = scrapertools.find_single_match(match,'<img src="([^"]+)"') - itemlist.append( Item(channel=item.channel, action="findvideos", title=title, url=url, - fanart=thumbnail, thumbnail=thumbnail, plot=plot, viewmode="movie") ) - next_page = scrapertools.find_single_match(data,'<a href="([^"]+)" class="siguiente">') - if next_page!="": - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - diff --git a/channels/porn/cumlouder.json b/channels/porn/cumlouder.json deleted file mode 100644 index 10bcc031..00000000 --- a/channels/porn/cumlouder.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "id": "cumlouder", - "name": "Cumlouder", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "cumlouder.png", - "banner": "cumlouder.png", - "categories": [ - "adult" - ] -} \ No newline at end of file diff --git a/channels/porn/cumlouder.py b/channels/porn/cumlouder.py deleted file mode 100644 index 4380a53a..00000000 --- a/channels/porn/cumlouder.py +++ /dev/null @@ -1,180 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urllib -import urlparse - -from core import httptools -from core import scrapertools -from core.item import Item -from platformcode import config, logger - - -host = 'https://www.cumlouder.com' - -def mainlist(item): - logger.info() - itemlist = [] - config.set_setting("url_error", False, "cumlouder") - itemlist.append(item.clone(title="Últimos videos", action="videos", url= host + "/porn/")) - itemlist.append(item.clone(title="Pornstars", action="pornstars_list", url=host + "/girls/")) - itemlist.append(item.clone(title="Listas", action="series", url= host + "/series/")) - itemlist.append(item.clone(title="Categorias", action="categorias", url= host + "/categories/")) - itemlist.append(item.clone(title="Buscar", action="search", url= host + "/search?q=%s")) - return itemlist - - -def search(item, texto): - logger.info() - item.url = item.url % texto - item.action = "videos" - try: - return videos(item) - except: - import traceback - logger.error(traceback.format_exc()) - return [] - - -def pornstars_list(item): - logger.info() - itemlist = [] - itemlist.append(item.clone(title="Mas Populares", action="pornstars", url=host + "/girls/1/")) - for letra in "abcdefghijklmnopqrstuvwxyz": - itemlist.append(item.clone(title=letra.upper(), url=urlparse.urljoin(item.url, letra), action="pornstars")) - return itemlist - - -def pornstars(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<a girl-url=.*?' - patron += 'href="([^"]+)" title="([^"]+)">.*?' - patron += 'data-lazy="([^"]+)".*?' - patron += '<span class="ico-videos sprite"></span>([^<]+)</span>' - matches = re.compile(patron, re.DOTALL).findall(data) - for url, title, thumbnail, count in matches: - if "go.php?" in url: - url = urllib.unquote(url.split("/go.php?u=")[1].split("&")[0]) - thumbnail = urllib.unquote(thumbnail.split("/go.php?u=")[1].split("&")[0]) - else: - url = urlparse.urljoin(item.url, url) - if not thumbnail.startswith("https"): - thumbnail = "https:%s" % thumbnail - itemlist.append(item.clone(title="%s (%s)" % (title, count), url=url, action="videos", fanart=thumbnail, thumbnail=thumbnail)) - # Paginador - matches = re.compile('<li[^<]+<a href="([^"]+)" rel="nofollow">Next[^<]+</a[^<]+</li>', re.DOTALL).findall(data) - if matches: - if "go.php?" in matches[0]: - url = urllib.unquote(matches[0].split("/go.php?u=")[1].split("&")[0]) - else: - url = urlparse.urljoin(item.url, matches[0]) - itemlist.append(item.clone(title="Página Siguiente >>", url=url)) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - patron = '<a tag-url=.*?' - patron += 'href="([^"]+)" title="([^"]+)".*?' - patron += 'data-lazy="([^"]+)".*?' - patron += '<span class="cantidad">([^<]+)</span>' - matches = re.compile(patron, re.DOTALL).findall(data) - for url, title, thumbnail, count in matches: - if "go.php?" in url: - url = urllib.unquote(url.split("/go.php?u=")[1].split("&")[0]) - thumbnail = urllib.unquote(thumbnail.split("/go.php?u=")[1].split("&")[0]) - else: - url = urlparse.urljoin(item.url, url) - if not thumbnail.startswith("https"): - thumbnail = "https:%s" % thumbnail - itemlist.append( - item.clone(title="%s (%s videos)" % (title, count), url=url, action="videos", fanart=thumbnail, thumbnail=thumbnail)) - # Paginador - matches = re.compile('<li[^<]+<a href="([^"]+)" rel="nofollow">Next[^<]+</a[^<]+</li>', re.DOTALL).findall(data) - if matches: - if "go.php?" in matches[0]: - url = urllib.unquote(matches[0].split("/go.php?u=")[1].split("&")[0]) - else: - url = urlparse.urljoin(item.url, matches[0]) - itemlist.append(item.clone(title="Página Siguiente >>", url=url)) - return itemlist - - -def series(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - patron = '<a onclick=.*?href="([^"]+)".*?\<img src="([^"]+)".*?h2 itemprop="name">([^<]+).*?p>([^<]+)</p>' - matches = re.compile(patron, re.DOTALL).findall(data) - for url, thumbnail, title, count in matches: - itemlist.append( - item.clone(title="%s (%s) " % (title, count), url=urlparse.urljoin(item.url, url), action="videos", fanart=thumbnail, thumbnail=thumbnail)) - # Paginador - matches = re.compile('<li[^<]+<a href="([^"]+)" rel="nofollow">Next[^<]+</a[^<]+</li>', re.DOTALL).findall(data) - if matches: - if "go.php?" in matches[0]: - url = urllib.unquote(matches[0].split("/go.php?u=")[1].split("&")[0]) - else: - url = urlparse.urljoin(item.url, matches[0]) - itemlist.append(item.clone(title="Página Siguiente >>", url=url)) - return itemlist - - -def videos(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<a class="muestra-escena" href="([^"]+)" title="([^"]+)".*?' - patron += 'data-lazy="([^"]+)".*?' - patron += '<span class="ico-minutos sprite"></span>([^<]+)</span>(.*?)</a>' - matches = re.compile(patron, re.DOTALL).findall(data) - for url, title, thumbnail, duration,calidad in matches: - if "hd sprite" in calidad: - title="[COLOR yellow] %s [/COLOR][COLOR red] HD [/COLOR] %s" % (duration, title) - else: - title="[COLOR yellow] %s [/COLOR] %s" % (duration, title) - if "go.php?" in url: - url = urllib.unquote(url.split("/go.php?u=")[1].split("&")[0]) - thumbnail = urllib.unquote(thumbnail.split("/go.php?u=")[1].split("&")[0]) - else: - url = urlparse.urljoin(host, url) - if not thumbnail.startswith("https"): - thumbnail = "https:%s" % thumbnail - itemlist.append(item.clone(title=title, url=url, - action="play", thumbnail=thumbnail, contentThumbnail=thumbnail, - fanart=thumbnail, contentType="movie", contentTitle=title)) - # Paginador - nextpage = scrapertools.find_single_match(data, '<ul class="paginador"(.*?)</ul>') - matches = re.compile('<a href="([^"]+)" rel="nofollow">Next »</a>', re.DOTALL).findall(nextpage) - if not matches: - matches = re.compile('<li[^<]+<a href="([^"]+)">Next »</a[^<]+</li>', re.DOTALL).findall(nextpage) - if matches: - if "go.php?" in matches[0]: - url = urllib.unquote(matches[0].split("/go.php?u=")[1].split("&")[0]) - else: - url = urlparse.urljoin(item.url, matches[0]) - itemlist.append(item.clone(title="Página Siguiente >>", url=url)) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<source src="([^"]+)" type=\'video/([^\']+)\' label=\'[^\']+\' res=\'([^\']+)\'' - url, type, res = re.compile(patron, re.DOTALL).findall(data)[0] - if "go.php?" in url: - url = urllib.unquote(url.split("/go.php?u=")[1].split("&")[0]) - elif not url.startswith("http"): - url = "https:" + url.replace("&", "&") - itemlist.append( - Item(channel='cumlouder', action="play", title='Video' + res, contentTitle=type.upper() + ' ' + res, url=url, - server="directo", folder=False)) - return itemlist - diff --git a/channels/porn/czechvideo.json b/channels/porn/czechvideo.json deleted file mode 100644 index 84b1c775..00000000 --- a/channels/porn/czechvideo.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "czechvideo", - "name": "Czechvideo", - "active": false, - "adult": true, - "language": ["*"], - "thumbnail": "http://czechvideo.org/templates/Default/images/black75.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} diff --git a/channels/porn/czechvideo.py b/channels/porn/czechvideo.py deleted file mode 100644 index 23b444aa..00000000 --- a/channels/porn/czechvideo.py +++ /dev/null @@ -1,87 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ - -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://czechvideo.org' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Ultimos" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/tags/%s/" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data,'<div class="category">(.*?)</ul>') - patron = '<li><a href="(.*?)".*?>(.*?)</a></li>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - thumbnail = urlparse.urljoin(item.url,scrapedthumbnail) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="short-story">.*?' - patron += '<a href="([^"]+)" title="([^"]+)"><img src="([^"]+)".*?' - patron += 'div class="short-time">(.*?)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle,scrapedthumbnail,scrapedtime in matches: - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - scrapedthumbnail = urlparse.urljoin(item.url,scrapedthumbnail) - scrapedplot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, - thumbnail=scrapedthumbnail, fanart=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<del><a href="([^"]+)">Next</a></del>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - data = httptools.downloadpage(item.url).data - - itemlist = servertools.find_video_items(data=data) - for videoitem in itemlist: - videoitem.title = item.title - videoitem.contentTitle = item.contentTitle - videoitem.thumbnail = item.thumbnail - videoitem.channel = item.channel - return itemlist - diff --git a/channels/porn/datoporn.json b/channels/porn/datoporn.json deleted file mode 100644 index 1a9f2211..00000000 --- a/channels/porn/datoporn.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "id": "datoporn", - "name": "DatoPorn", - "language": ["*"], - "active": true, - "adult": true, - "thumbnail": "http://i.imgur.com/tBSWudd.png?1", - "banner": "datoporn.png", - "categories": [ - "adult" - ] -} \ No newline at end of file diff --git a/channels/porn/datoporn.py b/channels/porn/datoporn.py deleted file mode 100644 index 243e4a8c..00000000 --- a/channels/porn/datoporn.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from core import httptools -from core import scrapertools -from platformcode import config, logger - - -def mainlist(item): - logger.info() - itemlist = [] - - itemlist.append(item.clone(action="categorias", title="Categorías", url="http://dato.porn/categories_all", contentType="movie", viewmode="movie")) - itemlist.append(item.clone(title="Buscar...", action="search", contentType="movie", viewmode="movie")) - return itemlist - - -def search(item, texto): - logger.info() - item.url = "http://dato.porn/?k=%s&op=search" % texto.replace(" ", "+") - return lista(item) - - -def lista(item): - logger.info() - itemlist = [] - data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(item.url).data) - patron = '<div class="videobox">\s*<a href="([^"]+)".*?' - patron += 'url\(\'([^\']+)\'.*?' - patron += '<span>(.*?)<\/span>.*?' - patron += 'class="title">(.*?)<\/a>' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedthumbnail, duration, scrapedtitle in matches: - if "/embed-" not in scrapedurl: - scrapedurl = scrapedurl.replace("datoporn.co/", "datoporn.co/embed-") + ".html" - if not config.get_setting('unify'): - scrapedtitle = '[COLOR yellow] %s [/COLOR] %s' % (duration , scrapedtitle) - else: - scrapedtitle += ' gb' - scrapedtitle = "[COLOR yellow]" + duration + "[/COLOR] " + scrapedtitle - scrapedtitle = scrapedtitle.replace(":", "'") - # logger.debug(scrapedurl + ' / ' + scrapedthumbnail + ' / ' + duration + ' / ' + scrapedtitle) - itemlist.append(item.clone(action="play", title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail, server="datoporn", - fanart=scrapedthumbnail.replace("_t.jpg", ".jpg"), plot = "")) - next_page = scrapertools.find_single_match(data, '<a class=["|\']page-link["|\'] href=["|\']([^["|\']+)["|\']>Next') - if next_page and itemlist: - itemlist.append(item.clone(action="lista", title=">> Página Siguiente", url=next_page)) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="vid_block">\s*<a href="([^"]+)".*?url\((.*?)\).*?<span>(.*?)</span>.*?<b>(.*?)</b>' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedthumbnail, numero, scrapedtitle in matches: - if numero: - scrapedtitle = "%s (%s)" % (scrapedtitle, numero) - itemlist.append(item.clone(action="lista", title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail)) - return itemlist - diff --git a/channels/porn/elreyx.json b/channels/porn/elreyx.json deleted file mode 100644 index af3f59de..00000000 --- a/channels/porn/elreyx.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "elreyx", - "name": "elreyx", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.elreyx.com/template/images/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/elreyx.py b/channels/porn/elreyx.py deleted file mode 100644 index 8f6a20a7..00000000 --- a/channels/porn/elreyx.py +++ /dev/null @@ -1,98 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import re -import urlparse - -from core import httptools -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import logger -from platformcode import config - -host = 'http://www.elreyx.com' - - -def mainlist(item): - logger.info() - itemlist = [] - - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url=host + "/peliculasporno.html") ) - itemlist.append( Item(channel=item.channel, title="Escenas" , action="lista", url=host + "/index.html")) - itemlist.append( Item(channel=item.channel, title="Productora" , action="categorias", url=host + "/index.html") ) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/peliculasporno.html") ) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search") ) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search-%s" % texto + ".html" - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - if item.title == "Categorias" : - patron = '<td><a href="([^<]+)" title="Movies ([^<]+)">.*?</a>' - else: - patron = '<a href="([^<]+)" title="View Category ([^<]+)">.*?</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - url="https:" + scrapedurl - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=url, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - if not "/peliculasporno" in item.url: - patron = '<div class="notice_image">.*?<a title="([^"]+)" href="([^"]+)">.*?<img src="(.*?)">' - else: - patron = '<div class="captura"><a title="([^"]+)" href="([^"]+)".*?><img src="(.*?)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedtitle,scrapedurl,scrapedthumbnail in matches: - scrapedplot = "" - url="https:" + scrapedurl - thumbnail="https:" + scrapedthumbnail - itemlist.append( Item(channel=item.channel, action="play", title=scrapedtitle, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<li class="float-xs-right"><a href=\'([^\']+)\' title=\'Pagina \d+\'>') - if next_page == "": - next_page = scrapertools.find_single_match(data,'<li><a href=\'([^\']+)\' title=\'Pagina \d+\'>»</a>') - if next_page!= "": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - data = httptools.downloadpage(item.url).data - url = scrapertools.find_single_match(data, '<IFRAME SRC="(.*?)"') - if url == "": - url = scrapertools.find_single_match(data,'<iframe src="(.*?)"') - data = httptools.downloadpage(url).data - itemlist = servertools.find_video_items(data=data) - for videoitem in itemlist: - videoitem.title = item.title - videoitem.fulltitle = item.fulltitle - videoitem.thumbnail = item.thumbnail - videoitem.channel = item.channel - return itemlist - diff --git a/channels/porn/eporner.json b/channels/porn/eporner.json deleted file mode 100644 index 9bdf1de4..00000000 --- a/channels/porn/eporner.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "id": "eporner", - "name": "Eporner", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "eporner.png", - "banner": "eporner.png", - "categories": [ - "adult" - ] -} \ No newline at end of file diff --git a/channels/porn/eporner.py b/channels/porn/eporner.py deleted file mode 100644 index b82358c0..00000000 --- a/channels/porn/eporner.py +++ /dev/null @@ -1,141 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urlparse - -from core import httptools -from core import scrapertools -from platformcode import logger - -host = 'http://www.eporner.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(item.clone(title="Últimos videos", action="videos", url=host + "/0/")) - itemlist.append(item.clone(title="Más visto", action="videos", url=host + "/most-viewed/")) - itemlist.append(item.clone(title="Mejor valorado", action="videos", url=host + "/top-rated/")) - itemlist.append(item.clone(title="Categorias", action="categorias", url=host + "/categories/")) - itemlist.append(item.clone(title="Pornstars", action="pornstars", url=host + "/pornstars/")) - itemlist.append(item.clone(title=" Alfabetico", action="pornstars_list", url=host + "/pornstars/")) - itemlist.append(item.clone(title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "-") - item.url = host + "/search/%s/" % texto - try: - return videos(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def pornstars_list(item): - logger.info() - itemlist = [] - for letra in "ABCDEFGHIJKLMNOPQRSTUVWXYZ": - itemlist.append(item.clone(title=letra, url=urlparse.urljoin(item.url, letra), action="pornstars")) - return itemlist - - -def pornstars(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="mbprofile">.*?' - patron += '<a href="([^"]+)" title="([^"]+)">.*?' - patron += '<img src="([^"]+)".*?' - patron += '<div class="mbtim"><span>Videos: </span>([^<]+)</div>' - matches = re.compile(patron, re.DOTALL).findall(data) - for url, title, thumbnail, count in matches: - itemlist.append( - item.clone(title="%s (%s videos)" % (title, count), url=urlparse.urljoin(item.url, url), action="videos", - thumbnail=thumbnail)) - # Paginador - next_page = scrapertools.find_single_match(data,"<a href='([^']+)' class='nmnext' title='Next page'>") - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="pornstars", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<span class="addrem-cat">.*?' - patron += '<a href="([^"]+)" title="([^"]+)">.*?' - patron +='<div class="cllnumber">([^<]+)</div>' - matches = re.compile(patron, re.DOTALL).findall(data) - for url, title, cantidad in matches: - url = urlparse.urljoin(item.url, url) - title = title + " " + cantidad - thumbnail = "" - if not thumbnail: - thumbnail = scrapertools.find_single_match(data,'<img src="([^"]+)" alt="%s"> % title') - itemlist.append(item.clone(title=title, url=url, action="videos", thumbnail=thumbnail)) - return sorted(itemlist, key=lambda i: i.title) - - -def videos(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="mvhdico"><span>([^<]+)</span>.*?' - patron += '<a href="([^"]+)" title="([^"]+)" id="[^"]+">.*?' - patron += 'src="([^"]+)"[^>]+>.*?' - patron += '<div class="mbtim">([^<]+)</div>' - matches = re.compile(patron, re.DOTALL).findall(data) - for quality, url, title, thumbnail, duration in matches: - title = "[COLOR yellow]" + duration + "[/COLOR] " + "[COLOR red]" + quality + "[/COLOR] " +title - itemlist.append(item.clone(title=title, url=urlparse.urljoin(item.url, url), - action="play", thumbnail=thumbnail, contentThumbnail=thumbnail, - contentType="movie", contentTitle=title)) - # Paginador - next_page = scrapertools.find_single_match(data,"<a href='([^']+)' class='nmnext' title='Next page'>") - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="videos", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def int_to_base36(num): - """Converts a positive integer into a base36 string.""" - assert num >= 0 - digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.lower() - - res = '' - while not res or num > 0: - num, i = divmod(num, 36) - res = digits[i] + res - return res - - -def play(item): - logger.info() - itemlist = [] - - data = httptools.downloadpage(item.url).data - - patron = "EP: { vid: '([^']+)', hash: '([^']+)'" - - vid, hash = re.compile(patron, re.DOTALL).findall(data)[0] - - hash = int_to_base36(int(hash[0:8], 16)) + int_to_base36(int(hash[8:16], 16)) + int_to_base36( - int(hash[16:24], 16)) + int_to_base36(int(hash[24:32], 16)) - - url = "https://www.eporner.com/xhr/video/%s?hash=%s" % (vid, hash) - jsondata = httptools.downloadpage(url).json - - for source in jsondata["sources"]["mp4"]: - url = jsondata["sources"]["mp4"][source]["src"] - title = source.split(" ")[0] - - itemlist.append(["%s %s [directo]" % (title, url[-4:]), url]) - - return sorted(itemlist, key=lambda i: int(i[0].split("p")[0])) diff --git a/channels/porn/eroticage.json b/channels/porn/eroticage.json deleted file mode 100644 index e45b4f9b..00000000 --- a/channels/porn/eroticage.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "eroticage", - "name": "eroticage", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://eroticage.net/wp-content/themes/oz-movie-v3/img/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/eroticage.py b/channels/porn/eroticage.py deleted file mode 100644 index fab51da2..00000000 --- a/channels/porn/eroticage.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://www.eroticage.net' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Novedades" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data,'<h2>TAGS</h2>(.*?)<div class="sideitem"') - patron = '<a href="(.*?)".*?>(.*?)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="titleFilm"><a href="([^"]+)">([^"]+)</a>.*?src="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail in matches: - contentTitle = scrapedtitle - title = scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, thumbnail=thumbnail, - plot=plot, fanart=scrapedthumbnail, contentTitle=contentTitle )) - next_page = scrapertools.find_single_match(data,'<a class="nextpostslink" rel="next" href="([^"]+)">') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - data = httptools.downloadpage(item.url).data - itemlist = servertools.find_video_items(data=data) - for videoitem in itemlist: - videoitem.title = item.title - videoitem.thumbnail = item.thumbnail - videochannel=item.channel - return itemlist - diff --git a/channels/porn/eroticasonlinetv.json b/channels/porn/eroticasonlinetv.json deleted file mode 100644 index fdcdd76f..00000000 --- a/channels/porn/eroticasonlinetv.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "eroticasonlinetv", - "name": "eroticasonlinetv", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.peliculaseroticasonline.tv/wp-content/themes/wpeliculaseroticasonlinetv/favicon.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - - diff --git a/channels/porn/eroticasonlinetv.py b/channels/porn/eroticasonlinetv.py deleted file mode 100644 index b3d7f3d6..00000000 --- a/channels/porn/eroticasonlinetv.py +++ /dev/null @@ -1,85 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import re -import urlparse - -from core import httptools -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import logger -from platformcode import config - -host = 'http://www.peliculaseroticasonline.tv' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<li class="cat-item cat-item-\d+"><a href="([^"]+)".*?>([^"]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="movie-poster"><a href="([^"]+)".*?<img src="([^"]+)" alt="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - plot = "" - url = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="play", title=scrapedtitle, url=url, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=plot, contentTitle = scrapedtitle) ) - next_page = scrapertools.find_single_match(data, '<div class="naviright"><a href="([^"]+)">Siguiente »</a>') - if next_page: - next_page = urlparse.urljoin(item.url, next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page )) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - url = scrapertools.find_single_match(data, '<iframe src="([^"]+)"') - url = urlparse.urljoin(item.url, url) - data = httptools.downloadpage(url).data - itemlist = servertools.find_video_items(data=data) - for videoitem in itemlist: - videoitem.title = item.title - videoitem.fulltitle = item.fulltitle - videoitem.thumbnail = item.thumbnail - videoitem.channel = item.channel - return itemlist - diff --git a/channels/porn/erotik.json b/channels/porn/erotik.json deleted file mode 100644 index 8724bd2f..00000000 --- a/channels/porn/erotik.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "erotik", - "name": "Erotik", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.youfreeporntube.com/uploads/custom-logo.png", - "banner": "http://www.youfreeporntube.com/uploads/custom-logo.png", - "categories": [ - "adult" - ], - "settings": [ - ] -} diff --git a/channels/porn/erotik.py b/channels/porn/erotik.py deleted file mode 100644 index 55f089fb..00000000 --- a/channels/porn/erotik.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urlparse - -from core import httptools -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import logger - -host = "https://www.youfreeporntube.net" - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(Item(channel=item.channel, action="lista", title="Útimos videos", - url= host + "/newvideos.html?&page=1")) - itemlist.append(Item(channel=item.channel, action="lista", title="Populares", - url=host + "/topvideos.html?page=1")) - itemlist.append( - Item(channel=item.channel, action="categorias", title="Categorias", url=host + "/browse.html")) - - itemlist.append(Item(channel=item.channel, action="search", title="Buscar", - url=host + "/search.php?keywords=")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = "{0}{1}".format(item.url, texto) - try: - return lista(item) - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("{0}".format(line)) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}", "", data) - patron = '<div class="pm-li-category"><a href="([^"]+)">.*?.<h3>(.*?)</h3></a>' - matches = re.compile(patron, re.DOTALL).findall(data) - for url, actriz in matches: - itemlist.append(Item(channel=item.channel, action="lista", title=actriz, url=url)) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}", "", data) - patron = '<li><div class=".*?' - patron += '<a href="([^"]+)".*?' - patron += '<img src="([^"]+)".*?alt="([^"]+)"' - matches = re.compile(patron, re.DOTALL).findall(data) - itemlist = [] - for scrapedurl, scrapedthumbnail, scrapedtitle in matches: - url = urlparse.urljoin(item.url, scrapedurl) - thumbnail = urlparse.urljoin(item.url, scrapedthumbnail) - title = scrapedtitle.strip() - itemlist.append(Item(channel=item.channel, action="play", thumbnail=thumbnail, fanart=thumbnail, title=title, - url=url, - viewmode="movie", folder=True)) - paginacion = scrapertools.find_single_match(data, - '<li class="active">.*?</li>.*?<a href="([^"]+)">') - if paginacion: - paginacion = urlparse.urljoin(item.url,paginacion) - itemlist.append(Item(channel=item.channel, action="lista", title=">> Página Siguiente", - url= paginacion)) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - url = scrapertools.find_single_match(data, '<div id="video-wrapper">.*?<iframe.*?src="([^"]+)"') - itemlist.append(item.clone(action="play", title=url, url=url )) - itemlist = servertools.get_servers_itemlist(itemlist) - return itemlist - - diff --git a/channels/porn/fapality.json b/channels/porn/fapality.json deleted file mode 100644 index 564fc8d4..00000000 --- a/channels/porn/fapality.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "fapality", - "name": "fapality", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://i.imgur.com/Orguh85.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} diff --git a/channels/porn/fapality.py b/channels/porn/fapality.py deleted file mode 100644 index d0527c27..00000000 --- a/channels/porn/fapality.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://fapality.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host + "/newest/")) - itemlist.append( Item(channel=item.channel, title="Mas Vistas" , action="lista", url=host + "/popular/")) - itemlist.append( Item(channel=item.channel, title="Mejor valorada" , action="lista", url=host + "/top/")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="categorias", url=host + "/channels/")) - itemlist.append( Item(channel=item.channel, title="PornStar" , action="categorias", url=host + "/pornstars/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/?q=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="item"><a href="([^"]+)" title="([^"]+)">.*?' - patron += '<img src="([^"]+)">.*?' - patron += '<div class="right">([^"]+)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,cantidad in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle.replace("movies", "") + " (" + cantidad + ")" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - next_page_url = scrapertools.find_single_match(data,'<li itemprop="url" class="current">.*?<a href="([^"]+)"') - if next_page_url!="": - next_page_url = urlparse.urljoin(item.url,next_page_url) - itemlist.append(item.clone(action="categorias", title="Página Siguiente >>", text_color="blue", url=next_page_url) ) - if "/categories/" in item.url: - itemlist = sorted(itemlist, key=lambda i: i.title) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<li class="masonry-item item ".*?' - patron += '<a href="([^"]+)" class="kt_imgrc popfire" title="([^"]+)" >.*?' - patron += '<img src="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail in matches: - title = scrapedtitle - contentTitle = title - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = contentTitle) ) - next_page_url = scrapertools.find_single_match(data,'<li itemprop="url" class="current">.*?<a href="([^"]+)"') - if next_page_url!="": - next_page_url = urlparse.urljoin(item.url,next_page_url) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page_url) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<source id="video_source_1" src="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl in matches: - url = scrapedurl - itemlist.append(item.clone(action="play", title=url, contentTitle = item.title, url=url)) - return itemlist - diff --git a/channels/porn/fetishshrine.json b/channels/porn/fetishshrine.json deleted file mode 100644 index 1aa17d67..00000000 --- a/channels/porn/fetishshrine.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "fetishshrine", - "name": "fetishshrine", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://www.fetishshrine.com/images/foot-logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} diff --git a/channels/porn/fetishshrine.py b/channels/porn/fetishshrine.py deleted file mode 100644 index a0a3971d..00000000 --- a/channels/porn/fetishshrine.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.fetishshrine.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host + "/latest-updates/")) - itemlist.append( Item(channel=item.channel, title="Popular" , action="lista", url=host + "/most-popular/")) - itemlist.append( Item(channel=item.channel, title="Mejor Valorado" , action="lista", url=host + "/top-rated/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/?q=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a href="([^"]+)" title="([^"]+)">.*?' - patron += '<img src="([^"]+)".*?' - patron += '<span class="vids">(\d+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,cantidad in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a href="([^"]+)" itemprop="url">.*?' - patron += '<img src="([^"]+)" alt="([^"]+)">.*?' - patron += '<span itemprop="duration" class="length">(.*?)</span>(.*?)<span class="thumb-info">' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,duracion,calidad in matches: - url = scrapedurl - if ">HD<" in calidad: - title = "[COLOR yellow]" + duracion + "[/COLOR] " + "[COLOR red]" + "HD" + "[/COLOR] " +scrapedtitle - else: - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - contentTitle = scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - plot=plot, fanart=scrapedthumbnail, contentTitle = contentTitle )) - next_page = scrapertools.find_single_match(data,'<li><a data=\'\d+\' href="([^"]+)" title="Next">') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista" , title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = 'video_url: \'([^\']+)\'' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl in matches: - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=scrapedurl, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - return itemlist - diff --git a/channels/porn/filmoviXXX.json b/channels/porn/filmoviXXX.json deleted file mode 100644 index 051c0fbb..00000000 --- a/channels/porn/filmoviXXX.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "filmoviXXX", - "name": "filmoviXXX", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.filmovix.net/wp-content/themes/Video/skins/1-default/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/filmoviXXX.py b/channels/porn/filmoviXXX.py deleted file mode 100644 index 5993b540..00000000 --- a/channels/porn/filmoviXXX.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -# BLOQUEO ESET INTERNET SECURITY -def mainlist(item): - logger.info() - itemlist = [] - if item.url=="": - item.url = "http://www.filmovix.net/videoscategory/porno/" - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data,'<h1 class="cat_head">XXX</h1>(.*?)<h3> Novo dodato </h3>') - patron = '<li class="clearfix">.*?' - patron += 'src="([^"]+)".*?' - patron += '<p class="title"><a href="([^"]+)" rel="bookmark" title="([^"]+)">' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedthumbnail,scrapedurl,scrapedtitle in matches: - contentTitle = scrapedtitle - title = scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, - thumbnail=thumbnail, fanart=thumbnail, plot=plot, contentTitle=contentTitle)) - next_page_url = scrapertools.find_single_match(data,'<a class="nextpostslink" rel="next" href="([^"]+)">') - if next_page_url!="": - next_page_url = urlparse.urljoin(item.url,next_page_url) - itemlist.append(item.clone(action="mainlist", title="Página Siguiente >>", text_color="blue", url=next_page_url) ) - return itemlist - - -def play(item): - logger.info() - data = httptools.downloadpage(item.url).data - itemlist = servertools.find_video_items(data=data) - for videoitem in itemlist: - videoitem.title = item.title - videoitem.thumbnail = item.thumbnail - videoitem.channel = item.channel - return itemlist - diff --git a/channels/porn/filmpornoita.json b/channels/porn/filmpornoita.json deleted file mode 100644 index 27329265..00000000 --- a/channels/porn/filmpornoita.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "filmpornoita", - "name": "filmpornoita", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.filmpornoita.net/wp-content/uploads/2015/01/header1.jpg", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} diff --git a/channels/porn/filmpornoita.py b/channels/porn/filmpornoita.py deleted file mode 100644 index 30171546..00000000 --- a/channels/porn/filmpornoita.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import re -import urlparse - -from core import httptools -from core import scrapertools -from core.item import Item -from platformcode import logger -from platformcode import config - -host = 'http://www.streamxxxx.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url= host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url= host)) - return itemlist - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a href=\'([^\']+)\' class=\'tag-link-.*?>([^<]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="post" id="post-\d+">.*?' - patron += '<a href="([^"]+)" title="([^"]+)">.*?' - patron += 'src="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle,scrapedthumbnail in matches: - plot = "" - itemlist.append( Item(channel=item.channel, action="findvideos", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail , plot=plot , viewmode="movie") ) - next_page = scrapertools.find_single_match(data,'<a href="([^"]+)">Next') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - diff --git a/channels/porn/foxtube.json b/channels/porn/foxtube.json deleted file mode 100644 index 6d58342d..00000000 --- a/channels/porn/foxtube.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "foxtube", - "name": "foxtube", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://fxtimg.com/xlogo_.png.pagespeed.ic.doVRQMV5ub.png|Referer=http://es.foxtube.com", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/foxtube.py b/channels/porn/foxtube.py deleted file mode 100644 index ae2fae11..00000000 --- a/channels/porn/foxtube.py +++ /dev/null @@ -1,123 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://es.foxtube.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Ultimos" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="PornStar" , action="catalogo", url=host + '/actrices/')) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/buscador/%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a class="tco5" href="([^"]+)">.*?' - patron += 'data-origen="([^"]+)" alt="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - scrapedplot = "" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - # <a class="bgco2 tco3" rel="next" href="/actrices/2/">></a> - next_page = scrapertools.find_single_match(data,'<a class="bgco2 tco3" rel="next" href="([^"]+)">></a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista" , title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<li class="bgco1"><a class="tco2" href="([^"]+)">([^"]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - if "/actrices/" in item.url: - data=scrapertools.find_single_match(data,'<section class="container">(.*?)>Actrices similares</h3>') - patron = '<a class="thumb tco1" href="([^"]+)">.*?' - patron += 'src="([^"]+)".*?' - patron += 'alt="([^"]+)".*?' - patron += '<span class="t">(.*?)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,duracion in matches: - url = urlparse.urljoin(item.url,scrapedurl) - contentTitle = scrapedtitle - time = scrapertools.find_single_match(duracion, '<i class="m tc2">([^"]+)</i>') - if not 'HD' in duracion : - title = "[COLOR yellow]" + time + "[/COLOR] " + scrapedtitle - else: - title = "[COLOR yellow]" + time + "[/COLOR] " + "[COLOR red]" + "HD" + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail + "|Referer=%s" %host - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = contentTitle)) - next_page = scrapertools.find_single_match(data,'<a class="bgco2 tco3" rel="next" href="([^"]+)">></a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista" , title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - url = scrapertools.find_single_match(data,'<iframe title="video" src="([^"]+)"') - url = url.replace("https://flashservice.xvideos.com/embedframe/", "https://www.xvideos.com/video") + "/" - data = httptools.downloadpage(url).data - patron = 'html5player.setVideoHLS\\(\'([^\']+)\'' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl in matches: - scrapedurl = scrapedurl.replace("\/", "/") - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=scrapedurl, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - return itemlist - diff --git a/channels/porn/freeporn.json b/channels/porn/freeporn.json deleted file mode 100644 index a6fbb792..00000000 --- a/channels/porn/freeporn.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "freeporn", - "name": "freeporn", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://frprn.com/images/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/freeporn.py b/channels/porn/freeporn.py deleted file mode 100644 index c2ef1df2..00000000 --- a/channels/porn/freeporn.py +++ /dev/null @@ -1,101 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://frprn.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Mejor valorada" , action="lista", url=host + "/top-raped/")) - itemlist.append( Item(channel=item.channel, title="Modelos" , action="categorias", url=host + "/models/most-popular/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/%s/" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<li class="thumb thumb-\w+">.*?' - patron += '<a href="([^"]+)">.*?' - patron += '<img class="lazy" data-original="([^"]+)".*?' - patron += '<div class="title">(.*?)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - scrapedplot = "" - title = scrapertools.find_single_match(scrapedtitle,'<div class="text">([^<]+)<') - if "/categories/" in item.url: - cantidad = scrapertools.find_single_match(scrapedtitle,'<div class="count">(\d+)</div>') - scrapedtitle = scrapertools.find_single_match(scrapedtitle,'<div class="name">([^<]+)</div>') - title = scrapedtitle + " (" + cantidad + ")" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=title, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<li class="pagination-next"><a href="([^"]+)">') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="categorias", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="thumb">.*?' - patron += '<a href="([^"]+)".*?' - patron += '<img class="lazy" data-original="([^"]+)" alt="([^"]+)".*?' - patron += '<span class="duration">([^"]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,duracion in matches: - url = urlparse.urljoin(item.url,scrapedurl) - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - contentTitle = title - thumbnail = scrapedthumbnail - plot = "" - year = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = contentTitle)) - next_page = scrapertools.find_single_match(data,'<li class="pagination-next"><a href="([^"]+)">') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<meta property="og:video" content="([^"]+)"' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl in matches: - title = scrapedurl - itemlist.append(item.clone(action="play", title=title, contentTitle = scrapedurl, url=scrapedurl)) - return itemlist - diff --git a/channels/porn/freepornstreams.json b/channels/porn/freepornstreams.json deleted file mode 100644 index f3bf0f7a..00000000 --- a/channels/porn/freepornstreams.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "freepornstreams", - "name": "freepornstreams", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://freepornstreams.org/wp-content/uploads/2016/11/FPS_Logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/freepornstreams.py b/channels/porn/freepornstreams.py deleted file mode 100644 index f5eae9c7..00000000 --- a/channels/porn/freepornstreams.py +++ /dev/null @@ -1,95 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://freepornstreams.org' #es http://xxxstreams.org - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url=host + "/free-full-porn-movies/")) - itemlist.append( Item(channel=item.channel, title="Videos" , action="lista", url=host + "/free-stream-porn/")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - if item.title == "Categorias" : - data = scrapertools.find_single_match(data,'>Top Tags(.*?)</ul>') - else: - data = scrapertools.find_single_match(data,'>Top Sites</a>(.*?)</aside>') - patron = '<a href="([^"]+)">(.*?)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - if not "Featured" in scrapedtitle: - scrapedplot = "" - scrapedthumbnail = "" - scrapedurl = scrapedurl.replace ("http://freepornstreams.org/freepornst/stout.php?s=100,75,65:*&u=" , "") - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<article id="post-\d+".*?' - patron += '<a href="([^"]+)" rel="bookmark">(.*?)</a>.*?' - patron += '<img src="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail in matches: - if '/HD' in scrapedtitle : title= "[COLOR red]" + "HD" + "[/COLOR] " + scrapedtitle - elif 'SD' in scrapedtitle : title= "[COLOR red]" + "SD" + "[/COLOR] " + scrapedtitle - elif 'FullHD' in scrapedtitle : title= "[COLOR red]" + "FullHD" + "[/COLOR] " + scrapedtitle - elif '1080' in scrapedtitle : title= "[COLOR red]" + "1080p" + "[/COLOR] " + scrapedtitle - else: title = scrapedtitle - thumbnail = scrapedthumbnail.replace("jpg#", "jpg") - plot = "" - itemlist.append( Item(channel=item.channel, action="findvideos", title=title, url=scrapedurl, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle=title) ) - next_page = scrapertools.find_single_match(data, '<div class="nav-previous"><a href="([^"]+)"') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def findvideos(item): - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|amp;|\s{2}| ", "", data) - patron = '<a href="([^"]+)" rel="nofollow"[^<]+>(?:Streaming|Download)' - matches = scrapertools.find_multiple_matches(data, patron) - for url in matches: - if not "ubiqfile" in url: - itemlist.append(item.clone(action='play',title="%s", url=url)) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - return itemlist diff --git a/channels/porn/gotporn.json b/channels/porn/gotporn.json deleted file mode 100755 index 96df587b..00000000 --- a/channels/porn/gotporn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "gotporn", - "name": "gotporn", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://cdn2-static-cf.gotporn.com/desktop/img/gotporn-logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/gotporn.py b/channels/porn/gotporn.py deleted file mode 100755 index fc42255d..00000000 --- a/channels/porn/gotporn.py +++ /dev/null @@ -1,129 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.gotporn.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/?page=1")) - itemlist.append( Item(channel=item.channel, title="Mejor valorados" , action="lista", url=host + "/top-rated?page=1")) - itemlist.append( Item(channel=item.channel, title="Mas vistos" , action="lista", url=host + "/most-viewed?page=1")) - itemlist.append( Item(channel=item.channel, title="Longitud" , action="lista", url=host + "/longest?page=1")) - - itemlist.append( Item(channel=item.channel, title="Canal" , action="catalogo", url=host + "/channels?page=1")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/results?search_query=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - - - patron = '<a href="([^"]+)">' - patron += '<span class="text">([^<]+)</span>' - patron += '<span class="num">([^<]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedtitle = "%s %s" % (scrapedtitle,cantidad) - scrapedurl = scrapedurl + "?page=1" - thumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=thumbnail , plot=scrapedplot) ) - return itemlist - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - logger.debug(data) - patron = '<header class="clearfix" itemscope>.*?' - patron += '<a href="([^"]+)".*?' - patron += '<img src="([^"]+)" alt="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - scrapedplot = "" - scrapedurl = scrapedurl + "?page=1" - thumbnail = "https:" + scrapedthumbnail - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=thumbnail , plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data, '<a href="([^"]+)" class="btn btn-secondary"><span class="text">Next') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="catalogo", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<li class="video-item poptrigger".*?' - patron += 'href="([^"]+)" data-title="([^"]+)".*?' - patron += '<span class="duration">(.*?)</span>.*?' - patron += 'src=\'([^\']+)\'.*?' - patron += '<h3 class="video-thumb-title(.*?)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedtime,scrapedthumbnail,quality in matches: - scrapedtime = scrapedtime.strip() - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - if quality: - title = "[COLOR yellow]%s[/COLOR] [COLOR red]HD[/COLOR] %s" % (scrapedtime,scrapedtitle) - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, thumbnail=thumbnail, - fanart=thumbnail, plot=plot,)) - next_page = scrapertools.find_single_match(data, '<a href="([^"]+)" class="btn btn-secondary') - if "categories" in item.url: - next_page = scrapertools.find_single_match(data, '<a href="([^"]+)" class="btn btn-secondary paginate-show-more') - if "search_query" in item.url: - next_page = scrapertools.find_single_match(data, '<link rel=\'next\' href="([^"]+)">') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="lista", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<source src="([^"]+)"' - matches = scrapertools.find_multiple_matches(data, patron) - for url in matches: - url += "|Referer=%s" % host - itemlist.append(item.clone(action="play", title = item.title, url=url )) - return itemlist - diff --git a/channels/porn/hclips.json b/channels/porn/hclips.json deleted file mode 100644 index 8207dd3d..00000000 --- a/channels/porn/hclips.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "hclips", - "name": "hclips", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.hclips.com/apple-touch-icon-152x152.png?v=3", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/hclips.py b/channels/porn/hclips.py deleted file mode 100644 index 9ae7ce89..00000000 --- a/channels/porn/hclips.py +++ /dev/null @@ -1,118 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://www.hclips.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="peliculas", url=host + "/latest-updates/")) - itemlist.append( Item(channel=item.channel, title="Popular" , action="peliculas", url=host + "/most-popular/?")) - itemlist.append( Item(channel=item.channel, title="Longitud" , action="peliculas", url=host + "/longest/?")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/?q=%s" % texto - try: - return peliculas(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a href="([^"]+)" class="thumb">.*?' - patron += 'src="([^"]+)".*?' - patron += '<strong class="title">([^"]+)</strong>.*?' - patron += '<b>(.*?)</b>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,vidnum in matches: - scrapedplot = "" - title = scrapedtitle + " \(" + vidnum + "\)" - itemlist.append( Item(channel=item.channel, action="peliculas", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def peliculas(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<a href="([^"]+)" class="thumb">.*?' - patron += '<img src="([^"]+)" alt="([^"]+)".*?' - patron += '<span class="dur">(.*?)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,time in matches: - title = "[COLOR yellow]" + time + "[/COLOR] " + scrapedtitle - contentTitle = title - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, - thumbnail=thumbnail, plot=plot, contentTitle = contentTitle)) - next_page_url = scrapertools.find_single_match(data,'<a href="([^"]+)" title="Next Page">Next</a>') - if next_page_url!="": - next_page_url = urlparse.urljoin(item.url,next_page_url) - itemlist.append(item.clone(action="peliculas", title="Página Siguiente >>", text_color="blue", url=next_page_url) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - video_url = scrapertools.find_single_match(data, 'var video_url = "([^"]*)"') - video_url += scrapertools.find_single_match(data, 'video_url \+= "([^"]*)"') - partes = video_url.split('||') - video_url = decode_url(partes[0]) - video_url = re.sub('/get_file/\d+/[0-9a-z]{32}/', partes[1], video_url) - video_url += '&' if '?' in video_url else '?' - video_url += 'lip=' + partes[2] + '<=' + partes[3] - itemlist.append(item.clone(action="play", title=item.title, url=video_url)) - return itemlist - - -def decode_url(txt): - _0x52f6x15 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,~' - reto = ''; n = 0 - # En las dos siguientes líneas, ABCEM ocupan 2 bytes cada letra! El replace lo deja en 1 byte. !!!!: АВСЕМ (10 bytes) ABCEM (5 bytes) - txt = re.sub('[^АВСЕМA-Za-z0-9\.\,\~]', '', txt) - txt = txt.replace('А', 'A').replace('В', 'B').replace('С', 'C').replace('Е', 'E').replace('М', 'M') - - while n < len(txt): - a = _0x52f6x15.index(txt[n]) - n += 1 - b = _0x52f6x15.index(txt[n]) - n += 1 - c = _0x52f6x15.index(txt[n]) - n += 1 - d = _0x52f6x15.index(txt[n]) - n += 1 - - a = a << 2 | b >> 4 - b = (b & 15) << 4 | c >> 2 - e = (c & 3) << 6 | d - reto += chr(a) - if c != 64: reto += chr(b) - if d != 64: reto += chr(e) - - return urllib.unquote(reto) - diff --git a/channels/porn/hdzog.json b/channels/porn/hdzog.json deleted file mode 100644 index fe66dbd5..00000000 --- a/channels/porn/hdzog.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "hdzog", - "name": "hdzog", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.hdzog.com/apple-touch-icon-120x120.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/hdzog.py b/channels/porn/hdzog.py deleted file mode 100644 index 09ef0158..00000000 --- a/channels/porn/hdzog.py +++ /dev/null @@ -1,119 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://www.hdzog.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/new/")) - itemlist.append( Item(channel=item.channel, title="Popular" , action="lista", url=host + "/popular/")) - itemlist.append( Item(channel=item.channel, title="Longitud" , action="lista", url=host + "/longest/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/?q=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data,'<ul class="cf">(.*?)</ul>') - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<li>.*?<a href="([^"]+)".*?' - patron += '<img class="thumb" src="([^"]+)" alt="([^"]+)".*?' - patron += '<span class="videos-count">(\d+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,vidnum in matches: - scrapedplot = "" - - url= scrapedurl + "?sortby=post_date" - title = scrapedtitle + " \(" + vidnum + "\)" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=url, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data,'<ul class="cf">(.*?)<h2>Advertisement</h2>') - patron = '<li>.*?<a href="([^"]+)".*?' - patron += 'src="([^"]+)" alt="([^"]+)".*?' - patron += '<span class="time">(.*?)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,time in matches: - contentTitle = scrapedtitle - title = "[COLOR yellow]" + time + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, - thumbnail=thumbnail, plot=plot, contentTitle = contentTitle)) - next_page = scrapertools.find_single_match(data,'<a href="([^"]+)" title="Next Page" data-page-num="\d+">Next page »</a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info(item) - itemlist = [] - data = httptools.downloadpage(item.url).data - video_url = scrapertools.find_single_match(data, 'var video_url="([^"]*)"') - video_url += scrapertools.find_single_match(data, 'video_url\+="([^"]*)"') - partes = video_url.split('||') - video_url = decode_url(partes[0]) - video_url = re.sub('/get_file/\d+/[0-9a-z]{32}/', partes[1], video_url) - video_url += '&' if '?' in video_url else '?' - video_url += 'lip=' + partes[2] + '<=' + partes[3] - itemlist.append(item.clone(action="play", title=item.title, url=video_url)) - return itemlist - - -def decode_url(txt): - _0x52f6x15 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,~' - reto = ''; n = 0 - # En las dos siguientes líneas, ABCEM ocupan 2 bytes cada letra! El replace lo deja en 1 byte. !!!!: АВСЕМ (10 bytes) ABCEM (5 bytes) - txt = re.sub('[^АВСЕМA-Za-z0-9\.\,\~]', '', txt) - txt = txt.replace('А', 'A').replace('В', 'B').replace('С', 'C').replace('Е', 'E').replace('М', 'M') - - while n < len(txt): - a = _0x52f6x15.index(txt[n]) - n += 1 - b = _0x52f6x15.index(txt[n]) - n += 1 - c = _0x52f6x15.index(txt[n]) - n += 1 - d = _0x52f6x15.index(txt[n]) - n += 1 - - a = a << 2 | b >> 4 - b = (b & 15) << 4 | c >> 2 - e = (c & 3) << 6 | d - reto += chr(a) - if c != 64: reto += chr(b) - if d != 64: reto += chr(e) - - return urllib.unquote(reto) - diff --git a/channels/porn/hellporno.json b/channels/porn/hellporno.json deleted file mode 100644 index bbb61486..00000000 --- a/channels/porn/hellporno.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "hellporno", - "name": "hellporno", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://hellporno.com/apple-touch-icon-152x152.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/hellporno.py b/channels/porn/hellporno.py deleted file mode 100644 index 0dab3be3..00000000 --- a/channels/porn/hellporno.py +++ /dev/null @@ -1,89 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://hellporno.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host + "/?page=1")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/?q=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a href="([^"]+)">.*?' - patron += '<img src="([^"]+)" alt="([^"]+) - Porn videos">.*?' - patron += '<span>(\d+) videos</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail , plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<a href="([^"]+)" class="next">Next page »</a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="categorias" , title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="video-thumb"><a href="([^"]+)" class="title".*?>([^"]+)</a>.*?' - patron += '<span class="time">([^<]+)</span>.*?' - patron += '<video muted poster="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,duracion,scrapedthumbnail in matches: - url = scrapedurl - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - contentTitle = title - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = contentTitle)) - next_page = scrapertools.find_single_match(data,'<a href="([^"]+)" class="next">Next page »</a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - scrapedurl = scrapertools.find_single_match(data,'<source data-fluid-hd src="([^"]+)/?br=\d+"') - if scrapedurl=="": - scrapedurl = scrapertools.find_single_match(data,'<source src="([^"]+)/?br=\d+"') - itemlist.append(item.clone(action="play", title=scrapedurl, url=scrapedurl)) - return itemlist - diff --git a/channels/porn/hentaiid.json b/channels/porn/hentaiid.json deleted file mode 100644 index 0519590a..00000000 --- a/channels/porn/hentaiid.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "id": "hentaiid", - "name": "Hentai ID", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.hentai-id.tv/wp-content/themes/moviescript/assets/img/logo.png", - "banner": "http://www.hentai-id.tv/wp-content/themes/moviescript/assets/img/background.jpg", - "categories": [ - "adult" - ] -} diff --git a/channels/porn/hentaiid.py b/channels/porn/hentaiid.py deleted file mode 100644 index 495fae4d..00000000 --- a/channels/porn/hentaiid.py +++ /dev/null @@ -1,147 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urlparse - -from core import httptools -from core import scrapertools -from core.item import Item -from platformcode import logger - -CHANNEL_HOST = "http://hentai-id.tv/" - - -def mainlist(item): - logger.info() - - itemlist = list() - itemlist.append(Item(channel=item.channel, action="series", title="Novedades", - url=urlparse.urljoin(CHANNEL_HOST, "archivos/h2/"), extra="novedades")) - itemlist.append(Item(channel=item.channel, action="generos", title="Por géneros", url=CHANNEL_HOST)) - itemlist.append(Item(channel=item.channel, action="series", title="Sin Censura", - url=urlparse.urljoin(CHANNEL_HOST, "archivos/sin-censura/"))) - itemlist.append(Item(channel=item.channel, action="series", title="High Definition", - url=urlparse.urljoin(CHANNEL_HOST, "archivos/high-definition/"))) - itemlist.append(Item(channel=item.channel, action="series", title="Mejores Hentais", - url=urlparse.urljoin(CHANNEL_HOST, "archivos/ranking-hentai/"))) - - return itemlist - - -def generos(item): - logger.info() - - itemlist = [] - data = re.sub(r"\n|\r|\t|\s{2}", "", httptools.downloadpage(item.url).data) - - pattern = 'id="hentai2"><div[^>]+>(.*?)</div></div>' - data = scrapertools.find_single_match(data, pattern) - - patron = 'href="([^"]+)"[^>]+>(.*?)</a>' - matches = re.compile(patron, re.DOTALL).findall(data) - - for url, title in matches: - # logger.debug("title=[{0}], url=[{1}]".format(title, url)) - itemlist.append(Item(channel=item.channel, action="series", title=title, url=url)) - - return itemlist - - -def series(item): - logger.info() - - data = re.sub(r"\n|\r|\t|\s{2}", "", httptools.downloadpage(item.url).data) - - pattern = "<div class='wp-pagenavi'>(.*?)</div>" - pagination = scrapertools.find_single_match(data, pattern) - - pattern = '<div class="col-xs-12 col-md-12 col-lg-9px-3"><ul>(.*?)</ul><div class="clearfix">' - data = scrapertools.find_single_match(data, pattern) - - pattern = '<a href="([^"]+)".*?<img src="([^"]+)" title="([^"]+)"' - matches = re.compile(pattern, re.DOTALL).findall(data) - itemlist = [] - - if item.extra == "novedades": - action = "findvideos" - else: - action = "episodios" - - for url, thumbnail, title in matches: - contentTitle = title - show = title - # logger.debug("title=[{0}], url=[{1}], thumbnail=[{2}]".format(title, url, thumbnail)) - itemlist.append(Item(channel=item.channel, action=action, title=title, url=url, thumbnail=thumbnail, - show=show, fanart=thumbnail, folder=True)) - - if pagination: - page = scrapertools.find_single_match(pagination, '>(?:Page|Página)\s*(\d+)\s*(?:of|de)\s*\d+<') - pattern = 'href="([^"]+)">%s<' % (int(page) + 1) - url_page = scrapertools.find_single_match(pagination, pattern) - - if url_page: - itemlist.append(Item(channel=item.channel, action="series", title=">> Página Siguiente", url=url_page)) - - return itemlist - - -def episodios(item): - logger.info() - itemlist = [] - - data = re.sub(r"\n|\r|\t|\s{2}", "", httptools.downloadpage(item.url).data) - pattern = '<div class="box-entry-title text-center">Lista de Capítulos</div>(.*?)</div></div>' - - data = scrapertools.find_single_match(data, pattern) - patron = '<a href="([^"]+)"[^>]+>([^<]+)</a>' - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedurl, scrapedtitle in matches: - title = scrapertools.unescape(scrapedtitle) - url = urlparse.urljoin(item.url, scrapedurl) - thumbnail = item.thumbnail - plot = item.plot - - # logger.debug("title=[{0}], url=[{1}], thumbnail=[{2}]".format(title, url, thumbnail)) - itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, - thumbnail=thumbnail, plot=plot, - fanart=thumbnail)) - - return itemlist - - -def findvideos(item): - logger.info() - - data = httptools.downloadpage(item.url).data - video_urls = [] - down_urls = [] - patron = '<(?:iframe)?(?:IFRAME)?\s*(?:src)?(?:SRC)?="([^"]+)"' - matches = re.compile(patron, re.DOTALL).findall(data) - - for url in matches: - if 'goo.gl' in url or 'tinyurl' in url: - video = httptools.downloadpage(url, follow_redirects=False, only_headers=True).headers["location"] - video_urls.append(video) - else: - video_urls.append(url) - paste = scrapertools.find_single_match(data, 'https://gpaste.us/([a-zA-Z0-9]+)') - if paste: - try: - new_data = httptools.downloadpage('https://gpaste.us/'+paste).data - - bloq = scrapertools.find_single_match(new_data, 'id="input_text">(.*?)</div>') - matches = bloq.split('<br>') - for url in matches: - down_urls.append(url) - except: - pass - video_urls.extend(down_urls) - from core import servertools - itemlist = servertools.find_video_items(data=",".join(video_urls)) - for videoitem in itemlist: - videoitem.contentTitle = item.contentTitle - videoitem.channel = item.channel - videoitem.thumbnail = item.thumbnail - - return itemlist diff --git a/channels/porn/hotmovs.json b/channels/porn/hotmovs.json deleted file mode 100644 index dd056521..00000000 --- a/channels/porn/hotmovs.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "hotmovs", - "name": "hotmovs", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://hotmovs.com/images/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/hotmovs.py b/channels/porn/hotmovs.py deleted file mode 100644 index 37ec2078..00000000 --- a/channels/porn/hotmovs.py +++ /dev/null @@ -1,147 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://hotmovs.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host + "/latest-updates/")) - itemlist.append( Item(channel=item.channel, title="Mas Vistas" , action="lista", url=host + "/most-popular/?sort_by=video_viewed_week")) - itemlist.append( Item(channel=item.channel, title="Mejor valorada" , action="lista", url=host + "/top-rated/?sort_by=rating_week")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="catalogo", url=host + "/channels/?sort_by=cs_viewed")) - itemlist.append( Item(channel=item.channel, title="Pornstars" , action="categorias", url=host + "/models/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/?sort_by=title")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/?q=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a class="thumbnail" href="([^"]+)">.*?' - patron += '<img src="([^"]+)".*?' - patron += '<span class="thumbnail__info__right">\s+([^"]+)\s+</span>.*?' - patron += '<h5>([^"]+)</h5>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,cantidad,scrapedtitle in matches: - scrapedplot = "" - cantidad = cantidad.replace(" ", "") - scrapedtitle = scrapedtitle + " (" + cantidad +")" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail , plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<li class="next"><a href="([^"]+)"') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="catalogo", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a class="thumbnail" href="([^"]+)" title="([^"]+)">.*?' - patron += '<img src="([^"]+)".*?' - patron += '<i class="mdi mdi-video"></i>([^"]+)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,cantidad in matches: - scrapedplot = "" - cantidad = cantidad.replace(" ", "") - scrapedtitle = scrapedtitle + " (" + cantidad +")" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<li class="next"><a href="([^"]+)"') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="categorias", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<article class="item" data-video-id="([^"]+)">.*?src="([^"]+)" alt="([^"]+)".*?<div class="thumbnail__info__right">(.*?)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,scrapedtime in matches: - url = urlparse.urljoin(item.url,"/embed/" + scrapedurl) - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - plot=plot, contentTitle = title)) - next_page = scrapertools.find_single_match(data,'<li class="next"><a href="([^"]+)"') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - video_url = scrapertools.find_single_match(data, 'var video_url="([^"]*)"') - video_url += scrapertools.find_single_match(data, 'video_url\+=\'([^\']+)\'') - partes = video_url.split('||') - video_url = decode_url(partes[0]) - video_url = re.sub('/get_file/\d+/[0-9a-z]{32}/', partes[1], video_url) - video_url += '&' if '?' in video_url else '?' - video_url += 'lip=' + partes[2] + '<=' + partes[3] - itemlist.append(item.clone(action="play", title=item.title, url=video_url)) - return itemlist - - -def decode_url(txt): - _0x52f6x15 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,~' - reto = ''; n = 0 - # En las dos siguientes líneas, ABCEM ocupan 2 bytes cada letra! El replace lo deja en 1 byte. !!!!: АВСЕМ (10 bytes) ABCEM (5 bytes) - txt = re.sub('[^АВСЕМA-Za-z0-9\.\,\~]', '', txt) - txt = txt.replace('А', 'A').replace('В', 'B').replace('С', 'C').replace('Е', 'E').replace('М', 'M') - - while n < len(txt): - a = _0x52f6x15.index(txt[n]) - n += 1 - b = _0x52f6x15.index(txt[n]) - n += 1 - c = _0x52f6x15.index(txt[n]) - n += 1 - d = _0x52f6x15.index(txt[n]) - n += 1 - - a = a << 2 | b >> 4 - b = (b & 15) << 4 | c >> 2 - e = (c & 3) << 6 | d - reto += chr(a) - if c != 64: reto += chr(b) - if d != 64: reto += chr(e) - - return urllib.unquote(reto) - diff --git a/channels/porn/javlin.json b/channels/porn/javlin.json deleted file mode 100644 index 31aa65d0..00000000 --- a/channels/porn/javlin.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "javlin", - "name": "javlin", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://javl.in/wp-content/uploads/2015/07/favicon1.ico", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} diff --git a/channels/porn/javlin.py b/channels/porn/javlin.py deleted file mode 100644 index 6ab1d1f7..00000000 --- a/channels/porn/javlin.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import re -import urlparse - -from core import httptools -from core import scrapertools -from core.item import Item -from platformcode import logger -from platformcode import config - -host = 'http://javl.in' - -# BLOQUEO ANTIVIRUS - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="lista" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar" , action="search")) - return itemlist - - -def search(item, texto): - logger.info("pelisalacarta.gmobi mainlist") - texto = texto.replace(" ", "+") - item.url = host+ "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<option class="level-0" value="([^"]+)">([^"]+)  \((.*?)\)<' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,number in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedtitle = str(scrapedtitle) + " ("+ str(number) + ")" - scrapedurl = "http://javl.in/?cat=" + scrapedurl - thumbnail = urlparse.urljoin(item.url,scrapedthumbnail) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="featured-wrap clearfix">.*?<a href="([^"]+)" title="([^"]+)".*?src="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail in matches: - scrapedplot = "" - itemlist.append( Item(channel=item.channel, action="findvideos", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<span class=\'currenttext\'>.*?href=\'([^\']+)\' class=\'inactive\'') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel , action="lista", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - diff --git a/channels/porn/javtasty.json b/channels/porn/javtasty.json deleted file mode 100644 index 82151579..00000000 --- a/channels/porn/javtasty.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "javtasty", - "name": "JavTasty", - "language": ["*"], - "active": true, - "adult": true, - "thumbnail": "http://i.imgur.com/OTYwbAa.png?1", - "categories": [ - "adult" - ], - "settings": [ - { - "id": "menu_info", - "type": "bool", - "label": "Mostrar menú antes de reproducir con imágenes", - "default": true, - "enabled": true, - "visible": true - } - ] -} \ No newline at end of file diff --git a/channels/porn/javtasty.py b/channels/porn/javtasty.py deleted file mode 100644 index 46c41026..00000000 --- a/channels/porn/javtasty.py +++ /dev/null @@ -1,118 +0,0 @@ -# -*- coding: utf-8 -*- - -import urlparse - -from core import httptools -from core import scrapertools -from platformcode import config, logger - -host = "https://www.javwhores.com" - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(item.clone(action="lista", title="Nuevos Vídeos", url=host + "/latest-updates/")) - itemlist.append(item.clone(action="lista", title="Mejor Valorados", url=host + "/top-rated/")) - itemlist.append(item.clone(action="lista", title="Más Vistos", url=host + "/most-popular/")) - itemlist.append(item.clone(action="categorias", title="Categorías", url=host + "/categories/")) - itemlist.append(item.clone(title="Buscar...", action="search")) - itemlist.append(item.clone(action="configuracion", title="Configurar canal...", text_color="gold", folder=False)) - return itemlist - - -def configuracion(item): - from platformcode import platformtools - ret = platformtools.show_channel_settings() - platformtools.itemlist_refresh() - return ret - - -def search(item, texto): - logger.info() - item.url = "%s/search/%s/" % (host, texto) - item.extra = texto - try: - return lista(item) - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - action = "play" - if config.get_setting("menu_info", "javtasty"): - action = "menu_info" - # PURGA los PRIVATE - patron = 'div class="video-item\s+".*?href="([^"]+)".*?' - patron += 'data-original="([^"]+)" ' - patron += 'alt="([^"]+)"(.*?)fa fa-clock-o"></i>([^<]+)<' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedthumbnail, scrapedtitle, quality, duration in matches: - scrapedurl = urlparse.urljoin(host, scrapedurl) - scrapedtitle = scrapedtitle.strip() - if duration: - scrapedtitle = "%s - %s" % (duration.strip(), scrapedtitle) - if '>HD<' in quality: - scrapedtitle += " [COLOR red][HD][/COLOR]" - itemlist.append(item.clone(action=action, title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail, - fanart=scrapedthumbnail)) - # Extrae la marca de siguiente página - next_page = scrapertools.find_single_match(data, 'next"><a href="([^"]+)') - if next_page: - itemlist.append(item.clone(action="lista", title=">> Página Siguiente", url=host + next_page)) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '(?s)<a class="item" href="([^"]+)".*?' - patron += 'src="([^"]+)" ' - patron += 'alt="([^"]+)"' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedthumbnail, scrapedtitle in matches: - scrapedurl = urlparse.urljoin(host, scrapedurl) - scrapedthumbnail = urlparse.urljoin(host, scrapedthumbnail) - itemlist.append(item.clone(action="lista", title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail, - fanart=scrapedthumbnail)) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - videourl = scrapertools.find_single_match(data, "video_alt_url2:\s*'([^']+)'") - if videourl: - itemlist.append(['.mp4 HD [directo]', videourl]) - videourl = scrapertools.find_single_match(data, "video_alt_url:\s*'([^']+)'") - if videourl: - itemlist.append(['.mp4 HD [directo]', videourl]) - videourl = scrapertools.find_single_match(data, "video_url:\s*'([^']+)'") - if videourl: - itemlist.append(['.mp4 [directo]', videourl]) - if item.extra == "play_menu": - return itemlist, data - return itemlist - - -def menu_info(item): - logger.info() - itemlist = [] - video_urls, data = play(item.clone(extra="play_menu")) - itemlist.append(item.clone(action="play", title="Ver -- %s" % item.title, video_urls=video_urls)) - matches = scrapertools.find_multiple_matches(data, '<a href="([^"]+)" class="item" rel="screenshots"') - for i, img in enumerate(matches): - if i == 0: - continue - title = "Imagen %s" % (str(i)) - itemlist.append(item.clone(action="", title=title, thumbnail=img, fanart=img)) - return itemlist diff --git a/channels/porn/javus.json b/channels/porn/javus.json deleted file mode 100644 index 17595685..00000000 --- a/channels/porn/javus.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "javus", - "name": "javus.net", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://s15.postimg.cc/pzd3h4vy3/javus.png", - "banner": "https://s21.postimg.cc/5pqzedp2f/javus_banner.png", - "categories": [ - "adult" - ], - "settings": [ - ] -} \ No newline at end of file diff --git a/channels/porn/javus.py b/channels/porn/javus.py deleted file mode 100644 index 83979eb7..00000000 --- a/channels/porn/javus.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from core import httptools -from core import scrapertools -from core.item import Item -from platformcode import logger - -host = 'http://javus.net/' - - -def mainlist(item): - if item.url == "": - item.url = host - - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<a href="([^"]+)" title="([^"]+)" rel="nofollow" class="post-image post-image-left".*?\s*<div class="featured-thumbnail"><img width="203" height="150" src="([^"]+)" class="attachment-featured size-featured wp-post-image" alt="" title="" \/><\/div>' - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedurl, scrapedtitle, scrapedthumbnail in matches: - url = scrapedurl - title = scrapedtitle.decode('utf-8') - thumbnail = scrapedthumbnail - fanart = '' - - itemlist.append( - Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumbnail, fanart=thumbnail)) - - # Paginacion - title = '' - siguiente = scrapertools.find_single_match(data, "<a rel='nofollow' href='([^']+)' class='inactive'>Next <") - ultima = scrapertools.find_single_match(data, "<a rel='nofollow' class='inactive' href='([^']+)'>Last <") - if siguiente != ultima: - titlen = 'Pagina Siguiente >>> ' - fanart = '' - itemlist.append(Item(channel=item.channel, action="mainlist", title=titlen, url=siguiente, fanart=fanart)) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = item.url + texto - - if texto != '': - return todas(item) - else: - return [] diff --git a/channels/porn/javwhores.json b/channels/porn/javwhores.json deleted file mode 100644 index 46a2bf11..00000000 --- a/channels/porn/javwhores.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "javwhores", - "name": "javwhores", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://www.javwhores.com/images/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/javwhores.py b/channels/porn/javwhores.py deleted file mode 100644 index 6746f9d9..00000000 --- a/channels/porn/javwhores.py +++ /dev/null @@ -1,103 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - - -host = 'https://www.javwhores.com/' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/latest-updates/")) - itemlist.append( Item(channel=item.channel, title="Mejor valorados" , action="lista", url=host + "/top-rated/")) - itemlist.append( Item(channel=item.channel, title="Mas vistos" , action="lista", url=host + "/most-popular/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/%s/" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<a class="item" href="([^"]+)" title="([^"]+)">.*?' - patron += '<img class="thumb" src="([^"]+)".*?' - patron += '<div class="videos">([^"]+)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle,scrapedthumbnail,cantidad in matches: - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - scrapedplot = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail , plot=scrapedplot) ) - return sorted(itemlist, key=lambda i: i.title) - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="video-item ">.*?' - patron += '<a href="([^"]+)" title="([^"]+)" class="thumb">.*?' - patron += 'data-original="([^"]+)".*?' - patron += '<span class="ico-fav-1(.*?)<p class="inf">' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,duracion in matches: - url = urlparse.urljoin(item.url,scrapedurl) - time = scrapertools.find_single_match(duracion, '<i class="fa fa-clock-o"></i>([^"]+)</div>') - if not 'HD' in duracion : - title = "[COLOR yellow]" + time + "[/COLOR] " + scrapedtitle - else: - title = "[COLOR yellow]" + time + "[/COLOR] " + "[COLOR red]" + "HD" + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - plot=plot, contentTitle = title)) - next_page = scrapertools.find_single_match(data, '<li class="next"><a href="([^"]+)"') - if "#videos" in next_page: - next_page = scrapertools.find_single_match(data, 'data-parameters="sort_by:post_date;from:(\d+)">Next') - next = scrapertools.find_single_match(item.url, '(.*?/)\d+') - next_page = next + "%s/" % next_page - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title= next_page, text_color="blue", url=next_page ) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - scrapedurl = scrapertools.find_single_match(data, 'video_alt_url3: \'([^\']+)\'') - if scrapedurl == "" : - scrapedurl = scrapertools.find_single_match(data, 'video_alt_url2: \'([^\']+)\'') - if scrapedurl == "" : - scrapedurl = scrapertools.find_single_match(data, 'video_alt_url: \'([^\']+)\'') - if scrapedurl == "" : - scrapedurl = scrapertools.find_single_match(data, 'video_url: \'([^\']+)\'') - - itemlist.append(Item(channel=item.channel, action="play", title=scrapedurl, url=scrapedurl, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - return itemlist - - diff --git a/channels/porn/jizzbunker.json b/channels/porn/jizzbunker.json deleted file mode 100644 index 2f764fc9..00000000 --- a/channels/porn/jizzbunker.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "jizzbunker", - "name": "jizzbunker", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://s0.cdn3x.com/jb/i/logo-new.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - - diff --git a/channels/porn/jizzbunker.py b/channels/porn/jizzbunker.py deleted file mode 100644 index d6a22407..00000000 --- a/channels/porn/jizzbunker.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://jizzbunker.com/es' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="peliculas", url=host + "/newest")) - itemlist.append( Item(channel=item.channel, title="Popular" , action="peliculas", url=host + "/popular1")) - itemlist.append( Item(channel=item.channel, title="Tendencia" , action="peliculas", url=host + "/trending")) - itemlist.append( Item(channel=item.channel, title="Longitud" , action="peliculas", url=host + "/longest")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/channels/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search?query=%s/" % texto - try: - return peliculas(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<li><figure>.*?<a href="([^"]+)".*?' - patron += '<img class="lazy" data-original="([^"]+)" alt="([^"]+)".*?' - patron += '<span class="score">(\d+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedthumbnail,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedurl = scrapedurl.replace("channel", "channel30") - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - itemlist.append( Item(channel=item.channel, action="peliculas", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail , plot=scrapedplot) ) - return itemlist - - -def peliculas(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<li><figure>.*?<a href="([^"]+)/([^"]+).html".*?' - patron += '<img class="lazy" data-original="([^"]+)".*?' - patron += '<time datetime=".*?">([^"]+)</time>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,duracion in matches: - url = scrapedurl + "/" + scrapedtitle + ".html" - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - contentTitle = title - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play" , title=title , url=url, thumbnail=thumbnail, - plot=plot, contentTitle = contentTitle)) - next_page_url = scrapertools.find_single_match(data,'<li><a href="([^"]+)" rel="next">→</a>') - if next_page_url!="": - next_page_url = urlparse.urljoin(item.url,next_page_url) - itemlist.append(item.clone(action="peliculas", title="Página Siguiente >>", text_color="blue", url=next_page_url) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = 'type:\'video/mp4\',src:\'([^\']+)\'' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl in matches: - scrapedurl = scrapedurl.replace("https", "http") - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=scrapedurl, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - return itemlist - diff --git a/channels/porn/justporn.json b/channels/porn/justporn.json deleted file mode 100644 index e0b656a5..00000000 --- a/channels/porn/justporn.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "justporn", - "name": "justporn", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://xxx.justporno.tv/images/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/justporn.py b/channels/porn/justporn.py deleted file mode 100644 index 50aa533f..00000000 --- a/channels/porn/justporn.py +++ /dev/null @@ -1,109 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://xxx.justporno.tv' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Ultimos" , action="lista", url=host + "/latest-updates/1/")) - itemlist.append( Item(channel=item.channel, title="Mejor valoradas" , action="lista", url=host + "/top-rated/")) - itemlist.append( Item(channel=item.channel, title="Mas Vistas", action="lista", url=host + "/most-popular/")) - itemlist.append( Item(channel=item.channel, title="Categorias", action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar" , action="search")) - return itemlist - - -def search(item, texto): - logger.info() - item.url = "%s/search/%s/" % (host, texto.replace("+", "-")) - item.extra = texto - try: - return lista(item) - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<a class="item" href="([^"]+)" title="([^"]+)">.*?' - patron += '<div class="videos">(\d+) video.*?</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,numero in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedtitle = scrapedtitle + " (" + numero + ")" - thumbnail = urlparse.urljoin(item.url,scrapedthumbnail) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail , plot=scrapedplot) ) - - return sorted(itemlist, key=lambda i: i.title) - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<a href="http://xxx.justporno.tv/videos/(\d+)/.*?" title="([^"]+)" >.*?' - patron += 'data-original="([^"]+)".*?' - patron += '<div class="duration">(.*?)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,scrapedtime in matches: - scrapedplot = "" - scrapedtitle = "[COLOR yellow]" + (scrapedtime) + "[/COLOR] " + scrapedtitle - scrapedurl = "http://xxx.justporno.tv/embed/" + scrapedurl - itemlist.append( Item(channel=item.channel, action="play", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - - if item.extra: - next_page = scrapertools.find_single_match(data, '<li class="next">.*?from_videos\+from_albums:(.*?)>') - if next_page: - if "from_videos=" in item.url: - next_page = re.sub(r'&from_videos=(\d+)', '&from_videos=%s' % next_page, item.url) - else: - next_page = "%s?mode=async&function=get_block&block_id=list_videos_videos_list_search_result"\ - "&q=%s&category_ids=&sort_by=post_date&from_videos=%s" % (item.url, item.extra, next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page)) - else: - next_page = scrapertools.find_single_match(data,'<li class="next"><a href="([^"]+)"') - if next_page and not next_page.startswith("#"): - next_page = urlparse.urljoin(host, next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page)) - else: - next_page = scrapertools.find_single_match(data, '<li class="next">.*?from:(\d+)') - if next_page: - if "from" in item.url: - next_page = re.sub(r'&from=(\d+)', '&from=%s' % next_page, item.url) - else: - next_page = "%s?mode=async&function=get_block&block_id=list_videos_common_videos_list" \ - "&sort_by=post_date&from=%s" % (item.url, next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page)) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = 'video_url: \'([^\']+)\'' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl in matches: - scrapedplot = "" - itemlist.append(item.clone(channel=item.channel, action="play", title=item.title , url=scrapedurl , plot="" , folder=True) ) - return itemlist - diff --git a/channels/porn/kingsizetits.json b/channels/porn/kingsizetits.json deleted file mode 100755 index 69493b3e..00000000 --- a/channels/porn/kingsizetits.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "kingsizetits", - "name": "Kingsizetits", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://cdn.images.kingsizetits.com/resources/kingsizetits.com/rwd_5/default/images/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/kingsizetits.py b/channels/porn/kingsizetits.py deleted file mode 100755 index c8cdc8a3..00000000 --- a/channels/porn/kingsizetits.py +++ /dev/null @@ -1,95 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://kingsizetits.com' - - -def mainlist(item): - logger.info() - itemlist = [] - - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/most-recent/")) - itemlist.append( Item(channel=item.channel, title="Mas vistos" , action="lista", url=host + "/most-viewed-week/")) - itemlist.append( Item(channel=item.channel, title="Mejor valorada" , action="lista", url=host + "/top-rated/")) - itemlist.append( Item(channel=item.channel, title="Mas largos" , action="lista", url=host + "/longest/")) - - - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/videos/%s/" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<a href="([^"]+)" class="video-box.*?' - patron += 'src=\'([^\']+)\' alt=\'([^\']+)\'.*?' - patron += 'data-video-count="(\d+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - title = scrapedtitle + " (" + cantidad + ")" - itemlist.append( Item(channel=item.channel, action="lista", title=title, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<script>stat.*?' - patron += '<a href="([^"]+)".*?' - patron += 'src="([^"]+)".*?' - patron += '<span class="video-length">([^<]+)</span>.*?' - patron += '<span class="pic-name">([^<]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtime,scrapedtitle in matches: - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, - fanart=thumbnail, thumbnail=thumbnail, plot=plot, contentTitle = scrapedtitle)) - next_page = scrapertools.find_single_match(data, '<a class="btn default-btn page-next page-nav" href="([^"]+)"') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="lista", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - logger.debug(data) - url = scrapertools.find_single_match(data,'label:"\d+", file\:"([^"]+)"') - itemlist.append(item.clone(action="play", server="directo", url=url )) - return itemlist - - diff --git a/channels/porn/mangovideo.json b/channels/porn/mangovideo.json deleted file mode 100755 index af5b8c23..00000000 --- a/channels/porn/mangovideo.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "mangovideo", - "name": "mangovideo", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://mangovideo.pw/images/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/mangovideo.py b/channels/porn/mangovideo.py deleted file mode 100755 index 509d2f93..00000000 --- a/channels/porn/mangovideo.py +++ /dev/null @@ -1,109 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - - -server = {'1': 'https://www.mangovideo.pw/contents/videos', '7' : 'https://server9.mangovideo.pw/contents/videos/', - '8' : 'https://s10.mangovideo.pw/contents/videos/', '9' : 'https://server2.mangovideo.pw/contents/videos/', - '10' : 'https://server217.mangovideo.pw/contents/videos/', '11' : 'https://234.mangovideo.pw/contents/videos/' - } - -host = 'http://mangovideo.pw' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/latest-updates/")) - itemlist.append( Item(channel=item.channel, title="Mas vistos" , action="lista", url=host + "/most-popular/")) - itemlist.append( Item(channel=item.channel, title="Mejor valorada" , action="lista", url=host + "/top-rated/")) - itemlist.append( Item(channel=item.channel, title="Sitios" , action="categorias", url=host + "/sites/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/%s/" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<a class="item" href="([^"]+)" title="([^"]+)".*?' - patron += '<div class="videos">(\d+) videos</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedthumbnail = "" - title = scrapedtitle + " (" + cantidad + ")" - itemlist.append( Item(channel=item.channel, action="lista", title=title, url=scrapedurl, - thumbnail=scrapedthumbnail , plot=scrapedplot) ) - - next_page = scrapertools.find_single_match(data, '<li class="next"><a href="([^"]+)"') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="categorias", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - - - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<div class="item\s+">.*?' - patron += '<a href="([^"]+)" title="([^"]+)".*?' - patron += 'data-original="([^"]+)".*?' - patron += '<div class="duration">([^<]+)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,scrapedtime in matches: - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, - thumbnail=thumbnail, fanart=thumbnail, plot=plot, contentTitle = scrapedtitle)) - next_page = scrapertools.find_single_match(data, '<li class="next"><a href="([^"]+)"') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="lista", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - - -def play(item): - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|amp;|\s{2}| ", "", data) - scrapedtitle = "" - patron = 'video_url: \'function/0/https://mangovideo.pw/get_file/(\d+)/\w+/(.*?)/\'' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedtitle,url in matches: - scrapedtitle = server.get(scrapedtitle, scrapedtitle) - url = scrapedtitle + url - if not scrapedtitle: - url = scrapertools.find_single_match(data, '<div class="embed-wrap".*?<iframe src="([^"]+)\?ref=') - itemlist.append(item.clone(action="play", title="%s", url=url)) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - - return itemlist - diff --git a/channels/porn/mporno.json b/channels/porn/mporno.json deleted file mode 100644 index 76b4cf2c..00000000 --- a/channels/porn/mporno.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "mporno", - "name": "mporno", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://mporno.tv/templates/fluidporn/img/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/mporno.py b/channels/porn/mporno.py deleted file mode 100644 index e568594d..00000000 --- a/channels/porn/mporno.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://mporno.tv' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Novedades" , action="lista", url=host + "/most-recent/")) - itemlist.append( Item(channel=item.channel, title="Mejor valoradas" , action="lista", url=host + "/top-rated/")) - itemlist.append( Item(channel=item.channel, title="Mas vistas" , action="lista", url=host + "/most-viewed/")) - itemlist.append( Item(channel=item.channel, title="Longitud" , action="lista", url=host + "/longest/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/channels/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/videos/%s/page1.html" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<h3><a href="([^"]+)">(.*?)</a> <small>(.*?)</small></h3>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedtitle = scrapedtitle + " " + cantidad - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail , plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<img class="content_image" src="([^"]+).mp4/.*?" alt="([^"]+)".*?this.src="(.*?)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail in matches: - contentTitle = scrapedtitle - title = scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, server= "directo", contentTitle=contentTitle)) - next_page_url = scrapertools.find_single_match(data,'<a href=\'([^\']+)\' class="next">Next >></a>') - if next_page_url!="": - next_page_url = urlparse.urljoin(item.url,next_page_url) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page_url) ) - - return itemlist - - -def play(item): - logger.info() - itemlist = [] - url = item.url.replace("/thumbs/", "/videos/") + ".mp4" - itemlist.append( Item(channel=item.channel, action="play", title= item.title, server= "directo", url=url)) - return itemlist \ No newline at end of file diff --git a/channels/porn/muchoporno.json b/channels/porn/muchoporno.json deleted file mode 100644 index a4c4ea81..00000000 --- a/channels/porn/muchoporno.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "muchoporno", - "name": "muchoporno", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://www.muchoporno.xxx/assets/css/logo/images/sprite-muchoporno.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/muchoporno.py b/channels/porn/muchoporno.py deleted file mode 100644 index 73130718..00000000 --- a/channels/porn/muchoporno.py +++ /dev/null @@ -1,112 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.pornburst.xxx' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host + "/page3.html")) - itemlist.append( Item(channel=item.channel, title="Pornstars" , action="categorias", url=host + "/pornstars/")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="categorias", url=host + "/sites/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/?q=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - if "/sites/" in item.url: - patron = '<div class="muestra-escena muestra-canales">.*?' - patron += 'href="([^"]+)">.*?' - patron += 'data-src="([^"]+)".*?' - patron += '<a title="([^"]+)".*?' - patron += '</span> (\d+) videos</span>' - if "/pornstars/" in item.url: - patron = '<a class="muestra-escena muestra-pornostar" href="([^"]+)">.*?' - patron += 'data-src="([^"]+)".*?' - patron += 'alt="([^"]+)".*?' - patron += '</span> (\d+) videos</span>' - else: - patron = '<a class="muestra-escena muestra-categoria" href="([^"]+)" title="[^"]+">.*?' - patron += 'data-src="([^"]+)".*?' - patron += '</span> ([^"]+) </h2>(.*?)>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,cantidad in matches: - logger.debug(scrapedurl + ' / ' + scrapedthumbnail + ' / ' + cantidad + ' / ' + scrapedtitle) - scrapedplot = "" - cantidad = " (" + cantidad + ")" - if "</a" in cantidad: - cantidad = "" - scrapedtitle = scrapedtitle + cantidad - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail , plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<link rel="next" href="([^"]+)"') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="categorias", title="Página Siguiente >>", text_color="blue", url=next_page) ) - - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a class="muestra-escena"\s*href="([^"]+)".*?' - patron += 'data-stats-video-name="([^"]+)".*?' - patron += '<img src="([^"]+)".*?' - patron += '<span class="ico-minutos sprite" title="Length"></span>([^"]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,duracion in matches: - url = urlparse.urljoin(item.url,scrapedurl) - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - contentTitle = title - thumbnail = scrapedthumbnail - plot = "" - year = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = contentTitle)) - next_page = scrapertools.find_single_match(data,'<link rel="next" href="([^"]+)"') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<source src="([^"]+)" type="video/mp4"' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl in matches: - title = scrapedurl - itemlist.append(item.clone(action="play", title=title, url=scrapedurl)) - return itemlist - diff --git a/channels/porn/nuvid.json b/channels/porn/nuvid.json deleted file mode 100644 index aee728e6..00000000 --- a/channels/porn/nuvid.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "id": "nuvid", - "name": "Nuvid", - "language": ["*"], - "active": true, - "adult": true, - "thumbnail": "http://i.imgur.com/rSbuStX.png", - "banner": "nuvid.png", - "categories": [ - "adult" - ] -} \ No newline at end of file diff --git a/channels/porn/nuvid.py b/channels/porn/nuvid.py deleted file mode 100644 index d87be509..00000000 --- a/channels/porn/nuvid.py +++ /dev/null @@ -1,115 +0,0 @@ -# -*- coding: utf-8 -*- - -import base64 -import hashlib -import urlparse - -from core import httptools -from core import scrapertools -from platformcode import logger - -host = "https://www.nuvid.com" - - -def mainlist(item): - logger.info() - itemlist = [] - - itemlist.append( - item.clone(action="lista", title="Nuevos Vídeos", url="https://www.nuvid.com/search/videos/_empty_/")) - itemlist.append( - item.clone(action="lista", title="Mejor Valorados", url="https://www.nuvid.com/search/videos/_empty_/", - extra="rt")) - itemlist.append( - item.clone(action="lista", title="Solo HD", url="https://www.nuvid.com/search/videos/hd", calidad="1")) - itemlist.append(item.clone(action="categorias", title="Categorías", url=host)) - itemlist.append(item.clone(title="Buscar...", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - item.url = "https://www.nuvid.com/search/videos/" + texto.replace(" ", "%20") - item.extra = "buscar" - return lista(item) - - -def lista(item): - logger.info() - itemlist = [] - - if not item.calidad: - item.calidad = "0" - filter = 'ch=178.1.2.3.4.191.7.8.5.9.10.169.11.12.13.14.15.16.17.18.28.190.20.21.22.27.23.24.25.26.189.30.31.32.181' \ - '.35.36.37.180.176.38.33.34.39.40.41.42.177.44.43.45.47.48.46.49.50.51.52.53.54.55.56.57.58.179.59.60.61.' \ - '62.63.64.65.66.69.68.71.67.70.72.73.74.75.182.183.77.76.78.79.80.81.82.84.85.88.86.188.87.91.90.92.93.94' \ - '&hq=%s&rate=&dur=&added=&sort=%s' % (item.calidad, item.extra) - header = {'X-Requested-With': 'XMLHttpRequest'} - if item.extra != "buscar": - header['Cookie'] = 'area=EU; lang=en; search_filter_new=%s' % filter - # Descarga la pagina - data = httptools.downloadpage(item.url, headers=header, cookies=False).data - - # Extrae las entradas - patron = '<div class="box-tumb related_vid.*?href="([^"]+)" title="([^"]+)".*?src="([^"]+)"(.*?)<i class="time">([^<]+)<' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedtitle, scrapedthumbnail, quality, duration in matches: - scrapedurl = urlparse.urljoin(host, scrapedurl) - if duration: - scrapedtitle = "%s - %s" % (duration, scrapedtitle) - if item.calidad == "0" and 'class="hd"' in quality: - scrapedtitle += " [COLOR red][HD][/COLOR]" - itemlist.append( - item.clone(action="play", title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail, folder=False)) - - # Extrae la marca de siguiente página - next_page = scrapertools.find_single_match(data, '<li class="next1">.*?href="([^"]+)"') - if next_page: - next_page = urlparse.urljoin(host, next_page) - itemlist.append(item.clone(action="lista", title=">> Página Siguiente", url=next_page)) - - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - - # Descarga la pagina - data = httptools.downloadpage("https://www.nuvid.com/categories").data - - # Extrae las entradas (carpetas) - bloques = scrapertools.find_multiple_matches(data, '<h2 class="c-mt-output title2">.*?>([^<]+)</h2>(.*?)</div>') - for cat, b in bloques: - cat = cat.replace("Straight", "Hetero") - itemlist.append(item.clone(action="", title=cat, text_color="gold")) - matches = scrapertools.find_multiple_matches(b, '<li>.*?href="([^"]+)" >(.*?)</span>') - for scrapedurl, scrapedtitle in matches: - scrapedtitle = " " + scrapedtitle.replace("<span>", "") - scrapedurl = urlparse.urljoin(host, scrapedurl) - itemlist.append(item.clone(action="lista", title=scrapedtitle, url=scrapedurl)) - - return itemlist - - -def play(item): - logger.info() - itemlist = [] - - data = httptools.downloadpage(item.url, cookies=False).data - h = scrapertools.find_single_match(data, "params\s*\+=\s*'h=([^']+)'") - t = scrapertools.find_single_match(data, "params\s*\+=\s*'%26t=([^']+)'") - vkey = scrapertools.find_single_match(data, "params\s*\+=\s*'%26vkey='.*?'([^']+)'") - pkey = hashlib.md5(vkey + base64.b64decode("aHlyMTRUaTFBYVB0OHhS")).hexdigest() - - url = 'https://www.nuvid.com/player_config/?h=%s&check_speed=1&t=%s&vkey=%s&pkey=%s&aid=&domain_id=' % ( - h, t, vkey, pkey) - data = httptools.downloadpage(url, cookies=False).data - videourl = scrapertools.find_single_match(data, '<video_file>.*?(http.*?)\]') - if videourl: - itemlist.append(['.mp4 [directo]', videourl]) - videourl = scrapertools.find_single_match(data, '<hq_video_file>.*?(http.*?)\]') - if videourl: - itemlist.append(['.mp4 HD [directo]', videourl]) - - return itemlist diff --git a/channels/porn/pandamovie.json b/channels/porn/pandamovie.json deleted file mode 100644 index ce411a6f..00000000 --- a/channels/porn/pandamovie.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "pandamovie", - "name": "pandamovie", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.pandamovies.com/templates/pandamovies/images/logo.png?v1482157699", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/pandamovie.py b/channels/porn/pandamovie.py deleted file mode 100644 index e7961206..00000000 --- a/channels/porn/pandamovie.py +++ /dev/null @@ -1,110 +0,0 @@ -# -*- coding: utf-8 -*- -# ------------------------------------------------------------ -import urlparse -import re -import base64 - -from platformcode import config, logger -from core import scrapertools -from core import servertools -from core.item import Item -from core import httptools - -host = 'https://pandamovies.pw' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(Item(channel=item.channel, title="Peliculas", action="lista", url=host + "/movies")) - itemlist.append(Item(channel=item.channel, title="Categorias", action="categorias", url=host + "/movies")) - itemlist.append(Item(channel=item.channel, title="Canal", action="categorias", url=host + "/movies")) - itemlist.append(Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - itemlist = [] - data = httptools.downloadpage(item.url).data - if item.title == "Categorias": - data = scrapertools.find_single_match(data, '<a href="#">Genres</a>(.*?)</ul>') - else: - data = scrapertools.find_single_match(data, '<a href="#">Studios</a>(.*?)</ul>') - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a href="([^"]+)">([^<]+)</a>' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedurl = scrapedurl.replace("https:", "") - scrapedurl = "https:" + scrapedurl - itemlist.append(Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot)) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div data-movie-id="\d+".*?' - patron += '<a href="([^"]+)".*?oldtitle="([^"]+)".*?' - patron += '<img data-original="([^"]+)".*?' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedtitle, scrapedthumbnail in matches: - url = urlparse.urljoin(item.url, scrapedurl) - title = scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle=title)) - next_page = scrapertools.find_single_match(data, '<li class=\'active\'>.*?href=\'([^\']+)\'>') - if next_page == "": - next_page = scrapertools.find_single_match(data, '<a.*?href="([^"]+)" >Next »</a>') - if next_page != "": - next_page = urlparse.urljoin(item.url, next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page)) - return itemlist - - -def findvideos(item): - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|amp;|\s{2}| ", "", data) - patron = '- on ([^"]+)" href="([^"]+)"' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedtitle,url in matches: - if 'aHR0' in url: - n = 3 - while n > 0: - url= url.replace("https://vshares.tk/goto/", "").replace("https://waaws.tk/goto/", "").replace("https://openloads.tk/goto/", "") - logger.debug (url) - url = base64.b64decode(url) - n -= 1 - if "mangovideo" in url: #Aparece como directo - data = httptools.downloadpage(url).data - patron = 'video_url: \'function/0/https://mangovideo.pw/get_file/(\d+)/\w+/(.*?)/\?embed=true\'' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedtitle,url in matches: - if scrapedtitle =="1": scrapedtitle= "https://www.mangovideo.pw/contents/videos/" - if scrapedtitle =="7": scrapedtitle= "https://server9.mangovideo.pw/contents/videos/" - if scrapedtitle =="8": scrapedtitle= "https://s10.mangovideo.pw/contents/videos/" - if scrapedtitle =="10": scrapedtitle= "https://server217.mangovideo.pw/contents/videos/" - if scrapedtitle =="11": scrapedtitle= "https://234.mangovideo.pw/contents/videos/" - url = scrapedtitle + url - itemlist.append( Item(channel=item.channel, action="play", title = "%s", url=url )) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - return itemlist - diff --git a/channels/porn/peliculaseroticas.json b/channels/porn/peliculaseroticas.json deleted file mode 100644 index 51e679b4..00000000 --- a/channels/porn/peliculaseroticas.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "id": "peliculaseroticas", - "name": "PeliculasEroticas", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "peliculaseroticas.png", - "banner": "peliculaseroticas.png", - "categories": [ - "adult" - ] -} \ No newline at end of file diff --git a/channels/porn/peliculaseroticas.py b/channels/porn/peliculaseroticas.py deleted file mode 100644 index 300cb786..00000000 --- a/channels/porn/peliculaseroticas.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -import urlparse - -from core import httptools -from core import scrapertools -from core.item import Item -from platformcode import logger -from platformcode import config - - -def mainlist(item): - logger.info() - itemlist = [] - if item.url == "": - item.url = "http://www.peliculaseroticas.net/" - data = httptools.downloadpage(item.url).data - patron = '<div class="post">.*?' - patron += '<a href="([^"]+)">([^<]+)</a>.*?' - patron += '<img src="([^"]+)"' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedtitle, scrapedthumbnail in matches: - url = urlparse.urljoin(item.url, scrapedurl) - title = scrapedtitle.strip() - thumbnail = urlparse.urljoin(item.url, scrapedthumbnail) - plot = "" - itemlist.append( Item(channel=item.channel, action="findvideos", title=title, fulltitle=title, url=url, - fanart=thumbnail, thumbnail=thumbnail, plot=plot, viewmode="movie")) - # Extrae la marca de siguiente página - if item.url == "http://www.peliculaseroticas.net/": - next_page_url = "http://www.peliculaseroticas.net/cine-erotico/2.html" - else: - current_page = scrapertools.find_single_match(item.url, "(\d+)") - next_page = int(current_page) + 1 - next_page_url = "http://www.peliculaseroticas.net/cine-erotico/" + str(next_page) + ".html" - itemlist.append( Item(channel=item.channel, action="mainlist", title=">> Página siguiente", url=next_page_url)) - return itemlist - diff --git a/channels/porn/pelisxporno.json b/channels/porn/pelisxporno.json deleted file mode 100644 index e01fb74e..00000000 --- a/channels/porn/pelisxporno.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "pelisxporno", - "name": "Pelisxporno", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://i.imgur.com/ywMHwat.png", - "banner": "pelisxporno.png", - "categories": [ - "adult" - ], - "settings": [ - ] -} \ No newline at end of file diff --git a/channels/porn/pelisxporno.py b/channels/porn/pelisxporno.py deleted file mode 100644 index f8920727..00000000 --- a/channels/porn/pelisxporno.py +++ /dev/null @@ -1,85 +0,0 @@ -# -*- coding: utf-8 -*- -import urlparse -import re - -from platformcode import config, logger -from core import httptools -from core import scrapertools -from core import servertools - - -host = 'http://www.pelisxporno.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(item.clone(action="lista", title="Novedades", url= host + "/?order=date")) - itemlist.append(item.clone(action="categorias", title="Categorías", url=host + "/categorias/")) - itemlist.append(item.clone(action="search", title="Buscar")) - return itemlist - -def search(item, texto): - logger.info("") - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - -def search(item, texto): - logger.info() - item.url = item.url % texto - return lista(item) - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<li class="cat-item cat-item-.*?"><a href="(.*?)".*?>(.*?)<' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedtitle in matches: - itemlist.append(item.clone(action="lista", title=scrapedtitle, url=scrapedurl)) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="video.".*?<a href="(.*?)" title="(.*?)">.*?<img src="(.*?)".*?\/>.*?duration.*?>(.*?)<' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedtitle, scrapedthumbnail, duration in matches: - if duration: - scrapedtitle = "[COLOR yellow]" + duration + "[/COLOR] " + scrapedtitle - itemlist.append(item.clone(action="findvideos", title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail, - fanart=scrapedthumbnail)) - next_page = scrapertools.find_single_match(data, '<a class="nextpostslink" rel="next" href="([^"]+)"') - if next_page: - itemlist.append(item.clone(action="lista", title=">> Página Siguiente", url=next_page)) - return itemlist - - -def findvideos(item): - itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data, '<div class="video_code">(.*?)<h3') - patron = '(?:src|SRC)="([^"]+)"' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl in matches: - if not 'mixdrop' in scrapedurl: #el base64 es netu.tv - url = "https://hqq.tv/player/embed_player.php?vid=RODE5Z2Hx3hO&autoplay=none" - else: - url = "https:" + scrapedurl - headers = {'Referer': item.url} - data = httptools.downloadpage(url, headers=headers).data - url = scrapertools.find_single_match(data, 'vsrc = "([^"]+)"') - url= "https:" + url - itemlist.append(item.clone(action="play", title = "%s", url=url )) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - return itemlist - diff --git a/channels/porn/perfectgirls.json b/channels/porn/perfectgirls.json deleted file mode 100644 index 0ef5b75b..00000000 --- a/channels/porn/perfectgirls.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "perfectgirls", - "name": "perfectgirls", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.perfectgirls.net/images/no-sprite/perfect-girl-regular.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/perfectgirls.py b/channels/porn/perfectgirls.py deleted file mode 100644 index 43503f3c..00000000 --- a/channels/porn/perfectgirls.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://www.perfectgirls.net' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Ultimos" , action="peliculas", url=host)) - itemlist.append( Item(channel=item.channel, title="Top" , action="peliculas", url=host + "/top/3days/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/%s/" % texto - try: - return peliculas(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<li class="additional_list__item"><a href="([^"]+)">([^"]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - url = urlparse.urljoin(item.url,scrapedurl) + "/1" - itemlist.append( Item(channel=item.channel, action="peliculas", title=scrapedtitle, url=url, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def peliculas(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="list__item_link"><a href="([^"]+)" title="([^"]+)">.*?' - patron += 'data-original="([^"]+)".*?' - patron += '<time>(.*?)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle,scrapedthumbnail,duracion in matches: - plot = "" - time = scrapertools.find_single_match(duracion, '([^"]+)</time>') - if not 'HD' in duracion : - title = "[COLOR yellow]" + time + "[/COLOR] " + scrapedtitle - else: - title = "[COLOR yellow]" + time + "[/COLOR] " + "[COLOR red]" + "HD" + "[/COLOR] " + scrapedtitle - scrapedthumbnail = "http:" + scrapedthumbnail - url = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=scrapedthumbnail, - fanart=scrapedthumbnail, plot=plot, contentTitle = title)) - next_page = scrapertools.find_single_match(data, '<a class="btn_wrapper__btn" href="([^"]+)">Next</a></li>') - if next_page: - next_page = urlparse.urljoin(item.url, next_page) - itemlist.append(item.clone(action="peliculas", title="Página Siguiente >>", text_color="blue", url=next_page )) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<source src="([^"]+)" res="\d+" label="([^"]+)" type="video/mp4" default/>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - itemlist.append(item.clone(action="play", title=scrapedtitle, url=scrapedurl)) - return itemlist - diff --git a/channels/porn/playpornx.json b/channels/porn/playpornx.json deleted file mode 100644 index d7582a98..00000000 --- a/channels/porn/playpornx.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "playpornx", - "name": "PlayPornX", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://s3.postimg.cc/3rkfrnypv/playpornx.png", - "banner": "https://s3.postimg.cc/it5qa1gyb/playpornx-banner.png", - "categories": [ - "adult" - ], - "settings": [ - ] -} \ No newline at end of file diff --git a/channels/porn/playpornx.py b/channels/porn/playpornx.py deleted file mode 100644 index c39822b1..00000000 --- a/channels/porn/playpornx.py +++ /dev/null @@ -1,100 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urlparse - -from core import httptools -from core import servertools -from core import scrapertools -from core.item import Item -from platformcode import logger -import base64 - -host = "https://watchfreexxx.net/" - -def mainlist(item): - itemlist = [] - - itemlist.append(Item(channel=item.channel, title="Peliculas", action="lista", - url = urlparse.urljoin(host, "category/porn-movies/"))) - - itemlist.append(Item(channel=item.channel, title="Escenas", action="lista", - url = urlparse.urljoin(host, "category/xxx-scenes/"))) - - itemlist.append(Item(channel=item.channel, title="Buscar", action="search", url=host+'?s=', - thumbnail='https://s30.postimg.cc/pei7txpa9/buscar.png', - fanart='https://s30.postimg.cc/pei7txpa9/buscar.png')) - - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = item.url + texto - try: - if texto != '': - item.extra = 'Buscar' - return lista(item) - else: - return [] - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def lista(item): - logger.info() - itemlist = [] - if item.url == '': item.url = host - data = httptools.downloadpage(item.url).data - data = re.sub(r'\n|\r|\t| |<br>|\s{2,}', "", data) - patron = '<article id=.*?<a href="([^"]+)".*?<img data-src="([^"]+)" alt="([^"]+)"' - matches = re.compile(patron, re.DOTALL).findall(data) - for data_1, data_2, data_3 in matches: - url = data_1 - thumbnail = data_2 - title = data_3 - itemlist.append(Item(channel=item.channel, action='findvideos', title=title, url=url, thumbnail=thumbnail)) - #Paginacion - if itemlist != []: - actual_page_url = item.url - next_page = scrapertools.find_single_match(data, '<a href="([^"]+)">Next</a>') - if next_page != '': - itemlist.append(Item(channel=item.channel, action="lista", title='Siguiente >>>', url=next_page, - thumbnail='https://s16.postimg.cc/9okdu7hhx/siguiente.png', extra=item.extra)) - return itemlist - - -def findvideos(item): - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|amp;|\s{2}| ", "", data) - patron = '- on ([^"]+)" href="([^"]+)"' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedtitle,url in matches: - if "tk/goto/" in url: - n = 3 - while n > 0: - url= url.replace("https://vshares.tk/goto/", "").replace("https://waaws.tk/goto/", "").replace("https://openloads.tk/goto/", "") - logger.debug (url) - url = base64.b64decode(url) - n -= 1 - if "mangovideo" in url: #Aparece como directo - data = httptools.downloadpage(url).data - patron = 'video_url: \'function/0/https://mangovideo.pw/get_file/(\d+)/\w+/(.*?)/\?embed=true\'' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedtitle,url in matches: - if scrapedtitle =="1": scrapedtitle= "https://www.mangovideo.pw/contents/videos/" - if scrapedtitle =="7": scrapedtitle= "https://server9.mangovideo.pw/contents/videos/" - if scrapedtitle =="8": scrapedtitle= "https://s10.mangovideo.pw/contents/videos/" - if scrapedtitle =="10": scrapedtitle= "https://server217.mangovideo.pw/contents/videos/" - if scrapedtitle =="11": scrapedtitle= "https://234.mangovideo.pw/contents/videos/" - url = scrapedtitle + url - itemlist.append(item.clone(action="play", title = "%s", url=url )) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - return itemlist - - diff --git a/channels/porn/porn300.json b/channels/porn/porn300.json deleted file mode 100644 index 7af7d643..00000000 --- a/channels/porn/porn300.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "porn300", - "name": "porn300", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://www.porn300.com/android-icon-192x192.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/porn300.py b/channels/porn/porn300.py deleted file mode 100644 index c84840a0..00000000 --- a/channels/porn/porn300.py +++ /dev/null @@ -1,107 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.porn300.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host + "/en_US/ajax/page/list_videos/?page=1")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="categorias", url=host + "/channels/?page=1")) - itemlist.append( Item(channel=item.channel, title="Pornstars" , action="categorias", url=host + "/pornstars/?page=1")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/?page=1")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist -# view-source:https://www.porn300.com/en_US/ajax/page/show_search?q=big+tit&page=1 -# https://www.porn300.com/en_US/ajax/page/show_search?page=2 -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/en_US/ajax/page/show_search?q=%s&?page=1" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a itemprop="url" href="/([^"]+)".*?' - patron += 'data-src="([^"]+)" alt=.*?' - patron += 'itemprop="name">([^<]+)</h3>.*?' - patron += '</svg>([^<]+)<' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,cantidad in matches: - scrapedplot = "" - cantidad = re.compile("\s+", re.DOTALL).sub(" ", cantidad) - scrapedtitle = scrapedtitle + " (" + cantidad +")" - scrapedurl = scrapedurl.replace("channel/", "producer/") - scrapedurl = "/en_US/ajax/page/show_" + scrapedurl + "?page=1" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<link rel="next" href="([^"]+)" />') - if next_page=="": - if "/?page=1" in item.url: - next_page=urlparse.urljoin(item.url,"/?page=2") - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="categorias", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a itemprop="url" href="([^"]+)".*?' - patron += 'data-src="([^"]+)".*?' - patron += 'itemprop="name">([^<]+)<.*?' - patron += '</svg>([^<]+)<' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,scrapedtime in matches: - url = urlparse.urljoin(item.url,scrapedurl) - scrapedtime = scrapedtime.strip() - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - contentTitle = title - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play" , title=title , url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = contentTitle) ) - prev_page = scrapertools.find_single_match(item.url,"(.*?)page=\d+") - num= int(scrapertools.find_single_match(item.url,".*?page=(\d+)")) - num += 1 - num_page = "?page=" + str(num) - if num_page!="": - next_page = urlparse.urljoin(item.url,num_page) - if "show_search" in next_page: - next_page = prev_page + num_page - next_page = next_page.replace("&?", "&") - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<source src="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for url in matches: - itemlist.append(item.clone(action="play", title=url, url=url)) - return itemlist - diff --git a/channels/porn/pornboss.json b/channels/porn/pornboss.json deleted file mode 100644 index c9815e6e..00000000 --- a/channels/porn/pornboss.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "pornboss", - "name": "pornboss", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://pornboss.org/wp-content/uploads/2018/10/cropped-bottom-180x180.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/pornboss.py b/channels/porn/pornboss.py deleted file mode 100644 index ebe0f22b..00000000 --- a/channels/porn/pornboss.py +++ /dev/null @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import jsontools as json -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://pornboss.org' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url=host + "/category/movies/")) - itemlist.append( Item(channel=item.channel, title="Videos" , action="lista", url=host + "/category/clips/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - data = scrapertools.find_single_match(data,'<div class="uk-panel uk-panel-box widget_nav_menu">(.*?)</ul>') - patron = '<li><a href=(.*?) class>([^<]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<article id=item-\d+.*?' - patron += '<img class=.*?src=(.*?) alt="([^"]+)".*?' - patron += 'Duration:</strong>(.*?) / <strong>.*?' - patron += '>SHOW<.*?href=([^"]+) target=' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedthumbnail,scrapedtitle,duration,scrapedurl in matches: - scrapedplot = "" - title = "[COLOR yellow]" + duration + "[/COLOR] " + scrapedtitle - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<li><a href=([^<]+)><i class=uk-icon-angle-double-right>') - next_page = next_page.replace('"', '') - if next_page!="": - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - -def play(item): - logger.info() - itemlist = [] - if "streamcloud" in item.url: - itemlist.append(item.clone(action="play", url=item.url )) - else: - data = httptools.downloadpage(item.url).data - url=scrapertools.find_single_match(data,'<span class="bottext">Streamcloud.eu</span>.*?href="([^"]+)"') - url= "https://tolink.to" + url - data = httptools.downloadpage(url).data - patron = '<input type="hidden" name="id" value="([^"]+)">.*?' - patron += '<input type="hidden" name="fname" value="([^"]+)">' - matches = re.compile(patron,re.DOTALL).findall(data) - for id, url in matches: - url= "http://streamcloud.eu/" + id - itemlist.append(item.clone(action="play", url=url )) - itemlist = servertools.get_servers_itemlist(itemlist) - return itemlist - - diff --git a/channels/porn/porndish.json b/channels/porn/porndish.json deleted file mode 100755 index c6089759..00000000 --- a/channels/porn/porndish.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "porndish", - "name": "porndish", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://www.porndish.com/wp-content/uploads/2015/09/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/porndish.py b/channels/porn/porndish.py deleted file mode 100755 index 0a5508aa..00000000 --- a/channels/porn/porndish.py +++ /dev/null @@ -1,78 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.porndish.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Canal" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<li id="menu-item-\d+".*?' - patron += '<a href="([^"]+)">([^<]+)<' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail , plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - data = scrapertools.find_single_match(data, 'archive-body">(.*?)<div class="g1-row g1-row-layout-page g1-prefooter">') - patron = '<article class=.*?' - patron += 'src="([^"]+)".*?' - patron += 'title="([^"]+)".*?' - patron += '<a href="([^"]+)" rel="bookmark">' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedthumbnail,scrapedtitle,scrapedurl in matches: - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="findvideos", title=scrapedtitle, url=scrapedurl, - fanart=thumbnail, thumbnail=thumbnail, plot=plot, contentTitle = scrapedtitle)) - next_page = scrapertools.find_single_match(data, '<a class="g1-delta g1-delta-1st next" href="([^"]+)">Next</a>') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="lista", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - - - - diff --git a/channels/porn/porneq.json b/channels/porn/porneq.json deleted file mode 100644 index 4416272a..00000000 --- a/channels/porn/porneq.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "porneq", - "name": "porneq", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://porneq.com/uploads/porneq-logo-home-png554cf1a970e6d.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/porneq.py b/channels/porn/porneq.py deleted file mode 100644 index 044346eb..00000000 --- a/channels/porn/porneq.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- -# ------------------------------------------------------------ -import urlparse -import urllib2 -import urllib -import re -import os -import sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://porneq.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(Item(channel=item.channel, title="Ultimos", action="lista", url=host + "/videos/browse/")) - itemlist.append(Item(channel=item.channel, title="Mas Vistos", action="lista", url=host + "/videos/most-viewed/")) - itemlist.append(Item(channel=item.channel, title="Mas Votado", action="lista", url=host + "/videos/most-liked/")) - itemlist.append(Item(channel=item.channel, title="Big Tits", action="lista", url=host + "/show/big+tit")) - itemlist.append(Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/show/%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a class="clip-link" data-id="\d+" title="([^"]+)" href="([^"]+)">.*?' - patron += '<img src="([^"]+)".*?' - patron += '<span class="timer">(.*?)</span></div>' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedtitle, scrapedurl, scrapedthumbnail, scrapedtime in matches: - scrapedplot = "" - scrapedthumbnail = scrapedthumbnail.replace("https:", "http:") - scrapedtitle = "[COLOR yellow]" + (scrapedtime) + "[/COLOR] " + scrapedtitle - itemlist.append(Item(channel=item.channel, action="play", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot)) - next_page = scrapertools.find_single_match(data, '<nav id="page_nav"><a href="(.*?)"') - if next_page != "": - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page)) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - scrapedurl = scrapertools.find_single_match(data, '<source src="([^"]+)"') - scrapedurl = scrapedurl.replace("X20", "-") - itemlist.append( - Item(channel=item.channel, action="play", title=item.title, url=scrapedurl, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - return itemlist diff --git a/channels/porn/pornhive.json b/channels/porn/pornhive.json deleted file mode 100644 index f884f1f0..00000000 --- a/channels/porn/pornhive.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "pornhive", - "name": "pornhive", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.pornhive.tv/assets/images/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/pornhive.py b/channels/porn/pornhive.py deleted file mode 100644 index f34ce0f6..00000000 --- a/channels/porn/pornhive.py +++ /dev/null @@ -1,94 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -import base64 - -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://www.pornhive.tv/en' - -# Algunos link caidos - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Canal" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search?keyword=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - if item.title == "Categorias" : - data = scrapertools.find_single_match(data,'Categories(.*?)Channels') - else: - data = scrapertools.find_single_match(data,'Channels(.*?)</ul>') - patron = '<li><a href="([^"]+)" title="[^"]+">(.*?)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="col-lg-3 col-md-3 col-sm-4 col-xs-6 col-thumb panel-video-\d+">.*?' - patron += '<a href="([^"]+)".*?' - patron += 'data-src="([^"]+)".*?' - patron += 'alt="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - title = scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="findvideos" , title=title, url=scrapedurl, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle=title)) - next_page = scrapertools.find_single_match(data,'<li><a href="([^"]+)" data-ci-pagination-page="\d+" rel="next">Next ›') - if next_page != "" : - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def findvideos(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = ';extra_urls\[\d+\]=\'([^\']+)\'' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl in matches: - scrapedurl = base64.b64decode(scrapedurl) - itemlist.append(item.clone(action="play", title="%s", url=scrapedurl)) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - return itemlist - - diff --git a/channels/porn/pornhub.json b/channels/porn/pornhub.json deleted file mode 100644 index 4a719116..00000000 --- a/channels/porn/pornhub.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "pornhub", - "name": "PornHub", - "active": true, - "adult": true, - "language": ["*"], - "fanart": "http://i.imgur.com/PwFvoss.jpg", - "thumbnail": "http://s22.postimg.cc/5lzcocfqp/pornhub_logo.jpg", - "banner": "pornhub.png", - "categories": [ - "adult" - ], - "settings": [ - ] -} diff --git a/channels/porn/pornhub.py b/channels/porn/pornhub.py deleted file mode 100644 index c485be51..00000000 --- a/channels/porn/pornhub.py +++ /dev/null @@ -1,93 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urlparse -from core import httptools -from core import servertools -from core import scrapertools -from core.item import Item -from platformcode import logger - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(Item(channel=item.channel, action="lista", title="Novedades", fanart=item.fanart, - url="http://es.pornhub.com/video?o=cm")) - itemlist.append(Item(channel=item.channel, action="categorias", title="Categorias", fanart=item.fanart, - url="http://es.pornhub.com/categories")) - itemlist.append(Item(channel=item.channel, action="search", title="Buscar", fanart=item.fanart, - url="http://es.pornhub.com/video/search?search=%s&o=mr")) - return itemlist - - -def search(item, texto): - logger.info() - - item.url = item.url % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<li class="cat_pic" data-category=".*?' - patron += '<a href="([^"]+)".*?' - patron += 'data-thumb_url="(.*?)".*?' - patron += 'alt="([^"]+)".*?' - patron += '<var>(.*?)</var>' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedthumbnail, scrapedtitle, cantidad in matches: - if "?" in scrapedurl: - url = urlparse.urljoin(item.url, scrapedurl + "&o=cm") - else: - url = urlparse.urljoin(item.url, scrapedurl + "?o=cm") - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - itemlist.append(Item(channel=item.channel, action="lista", title=scrapedtitle, url=url, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail)) - itemlist.sort(key=lambda x: x.title) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - videodata = scrapertools.find_single_match(data, 'videos search-video-thumbs">(.*?)<div class="reset"></div>') - patron = '<div class="phimage">.*?' - patron += '<a href="([^"]+)" title="([^"]+).*?' - patron += 'data-mediumthumb="([^"]+)".*?' - patron += '<var class="duration">([^<]+)</var>(.*?)</div>' - matches = re.compile(patron, re.DOTALL).findall(videodata) - for url, scrapedtitle, thumbnail, duration, scrapedhd in matches: - scrapedhd = scrapertools.find_single_match(scrapedhd, '<span class="hd-thumbnail">(.*?)</span>') - if scrapedhd == 'HD': - title = "[COLOR yellow]" +duration+ "[/COLOR] " + "[COLOR red]" +scrapedhd+ "[/COLOR] "+scrapedtitle - else: - title = "[COLOR yellow]" + duration + "[/COLOR] " + scrapedtitle - url = urlparse.urljoin(item.url, url) - itemlist.append( - Item(channel=item.channel, action="play", title=title, url=url, fanart=thumbnail, thumbnail=thumbnail)) - if itemlist: - # Paginador - patron = '<li class="page_next"><a href="([^"]+)"' - matches = re.compile(patron, re.DOTALL).findall(data) - if matches: - url = urlparse.urljoin(item.url, matches[0].replace('&', '&')) - itemlist.append( - Item(channel=item.channel, action="lista", title=">> Página siguiente", fanart=item.fanart, - url=url)) - return itemlist - -def play(item): - logger.info(item) - itemlist = servertools.find_video_items(item.clone(url = item.url)) - return itemlist - diff --git a/channels/porn/pornohdmega.json b/channels/porn/pornohdmega.json deleted file mode 100755 index c8cc0622..00000000 --- a/channels/porn/pornohdmega.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "pornohdmega", - "name": "pornohdmega", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://www.pornohdmega.com/wp-content/uploads/2018/11/dftyu.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/pornohdmega.py b/channels/porn/pornohdmega.py deleted file mode 100755 index 862a37f1..00000000 --- a/channels/porn/pornohdmega.py +++ /dev/null @@ -1,108 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.pornohdmega.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/?order=recent")) - itemlist.append( Item(channel=item.channel, title="Mejor valorados" , action="lista", url=host + "/?order=top-rated")) - itemlist.append( Item(channel=item.channel, title="Mas vistos" , action="lista", url=host + "/?order=most-viewed")) - - itemlist.append( Item(channel=item.channel, title="Canal" , action="catalogo", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<li><a href=\'([^\']+)\' title=\'([^\']+) Tag\'>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - if not "tag" in scrapedurl: - scrapedurl = "" - thumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=thumbnail , plot=scrapedplot) ) - return itemlist - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<h2><a href="([^"]+)">([^<]+)</a></h2>.*?' - patron += '<strong>(\d+) Videos</strong>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedtitle = "%s (%s)" % (scrapedtitle,cantidad) - thumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=thumbnail , plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<figure class="video-preview"><a href="([^"]+)".*?' - patron += '<img src="([^"]+)".*?' - patron += 'title="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - title = scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, thumbnail=thumbnail, - fanart=thumbnail, plot=plot,)) - next_page = scrapertools.find_single_match(data, '<a class="nextpostslink" rel="next" href="([^"]+)"') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="lista", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<iframe src="([^"]+)"' - matches = scrapertools.find_multiple_matches(data, patron) - for url in matches: - itemlist.append(item.clone(action="play", title= "%s", url=url)) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - return itemlist - diff --git a/channels/porn/pornrewind.json b/channels/porn/pornrewind.json deleted file mode 100644 index 8e2ed488..00000000 --- a/channels/porn/pornrewind.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "pornrewind", - "name": "pornrewind", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://www.pornrewind.com/static/images/logo-light-pink.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/pornrewind.py b/channels/porn/pornrewind.py deleted file mode 100644 index 55d415e8..00000000 --- a/channels/porn/pornrewind.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.pornrewind.com' - -# hacer funcionar conector Kt player - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/videos/?sort_by=post_date")) - itemlist.append( Item(channel=item.channel, title="Mejor valorados" , action="lista", url=host + "/videos/?sort_by=rating")) - itemlist.append( Item(channel=item.channel, title="Mas vistos" , action="lista", url=host + "/videos/?sort_by=video_viewed")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/%s/" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<a class="thumb-categories" href="([^"]+)" title="([^"]+)">.*?' - patron += '<img class="lazyload" data-src="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle,scrapedthumbnail in matches: - scrapedplot = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<a class="thumb" href="([^"]+)" title="([^"]+)".*?' - patron += '<img class="lazyload" data-src="([^"]+)".*?' - patron += '<span>(.*?)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,scrapedtime in matches: - url = urlparse.urljoin(item.url,scrapedurl) - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = title)) - next_page = scrapertools.find_single_match(data, '<li class="direction"><a href="([^"]+)" data-ajax="pagination">') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page ) ) - return itemlist - diff --git a/channels/porn/porntrex.json b/channels/porn/porntrex.json deleted file mode 100644 index 1976283d..00000000 --- a/channels/porn/porntrex.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "porntrex", - "name": "Porntrex", - "language": ["*"], - "active": true, - "adult": true, - "thumbnail": "http://i.imgur.com/n8SUCE9.png?1", - "categories": [ - "adult" - ], - "settings": [ - { - "id": "menu_info", - "type": "bool", - "label": "Mostrar menú antes de reproducir con imágenes", - "default": true, - "enabled": true, - "visible": true - } - ] -} \ No newline at end of file diff --git a/channels/porn/porntrex.py b/channels/porn/porntrex.py deleted file mode 100644 index 70dbca6f..00000000 --- a/channels/porn/porntrex.py +++ /dev/null @@ -1,327 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urllib -import urlparse - -from core import httptools -from core import scrapertools -from core.item import Item -from platformcode import config, logger - -host = "https://www.porntrex.com" -perpage = 20 - - -def mainlist(item): - logger.info() - itemlist = [] - - config.set_setting("url_error", False, "porntrex") - itemlist.append(item.clone(action="lista", title="Nuevos Vídeos", url=host + "/latest-updates/")) - itemlist.append(item.clone(action="lista", title="Mejor Valorados", url=host + "/top-rated/")) - itemlist.append(item.clone(action="lista", title="Más Vistos", url=host + "/most-popular/")) - itemlist.append(item.clone(action="categorias", title="Categorías", url=host + "/categories/")) - itemlist.append(item.clone(action="categorias", title="Modelos", - url=host + "/models/?mode=async&function=get_block&block_id=list_models_models" \ - "_list&sort_by=total_videos")) - itemlist.append(item.clone(action="categorias", title="Canal", url=host + "/channels/")) - itemlist.append(item.clone(action="playlists", title="Listas", url=host + "/playlists/")) - itemlist.append(item.clone(action="tags", title="Tags", url=host + "/tags/")) - itemlist.append(item.clone(title="Buscar...", action="search")) - itemlist.append(item.clone(action="configuracion", title="Configurar canal...", text_color="gold", folder=False)) - - return itemlist - - -def configuracion(item): - from platformcode import platformtools - ret = platformtools.show_channel_settings() - platformtools.itemlist_refresh() - return ret - - -def search(item, texto): - logger.info() - item.url = "%s/search/%s/" % (host, texto.replace("+", "-")) - item.extra = texto - try: - return lista(item) - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def lista(item): - logger.info() - itemlist = [] - # Descarga la pagina - data = get_data(item.url) - action = "play" - if config.get_setting("menu_info", "porntrex"): - action = "menu_info" - # Quita las entradas, que no son private <div class="video-preview-screen video-item thumb-item private " - patron = '<div class="video-preview-screen video-item thumb-item ".*?' - patron += '<a href="([^"]+)".*?' - patron += 'data-src="([^"]+)".*?' - patron += 'alt="([^"]+)".*?' - patron += '<span class="quality">(.*?)<.*?' - patron += '</i>([^<]+)<' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedthumbnail, scrapedtitle, quality, duration in matches: - if "go.php?" in scrapedurl: - scrapedurl = urllib.unquote(scrapedurl.split("/go.php?u=")[1].split("&")[0]) - if not scrapedthumbnail.startswith("https"): - scrapedthumbnail = "https:%s" % scrapedthumbnail - else: - scrapedurl = urlparse.urljoin(host, scrapedurl) - if not scrapedthumbnail.startswith("https"): - scrapedthumbnail = "https:%s" % scrapedthumbnail - scrapedtitle = "%s - [COLOR red]%s[/COLOR] %s" % (duration, quality, scrapedtitle) - scrapedthumbnail += "|Referer=https://www.porntrex.com/" - itemlist.append(item.clone(action=action, title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail, - contentThumbnail=scrapedthumbnail, fanart=scrapedthumbnail)) - # Extrae la marca de siguiente página - if item.extra: - next_page = scrapertools.find_single_match(data, '<li class="next">.*?from_videos\+from_albums:(\d+)') - if next_page: - if "from_videos=" in item.url: - next_page = re.sub(r'&from_videos=(\d+)', '&from_videos=%s' % next_page, item.url) - else: - next_page = "%s?mode=async&function=get_block&block_id=list_videos_videos" \ - "&q=%s&category_ids=&sort_by=post_date&from_videos=%s" % (item.url, item.extra, next_page) - itemlist.append(item.clone(action="lista", title=">> Página Siguiente", url=next_page)) - else: - next_page = scrapertools.find_single_match(data, '<li class="next">.*?href="([^"]*)"') - if next_page and not next_page.startswith("#"): - if "go.php?" in next_page: - next_page = urllib.unquote(next_page.split("/go.php?u=")[1].split("&")[0]) - else: - next_page = urlparse.urljoin(host, next_page) - itemlist.append(item.clone(action="lista", title=">> Página Siguiente", url=next_page)) - else: - next_page = scrapertools.find_single_match(data, '<li class="next">.*?from4:(\d+)') - if next_page: - if "from4" in item.url: - next_page = re.sub(r'&from4=(\d+)', '&from4=%s' % next_page, item.url) - else: - next_page = "%s?mode=async&function=get_block&block_id=list_videos_common_videos_list_norm" \ - "&sort_by=post_date&from4=%s" % ( - item.url, next_page) - itemlist.append(item.clone(action="lista", title=">> Página Siguiente", url=next_page)) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = get_data(item.url) - - # Extrae las entradas - if "/channels/" in item.url: - patron = '<div class="video-item ">.*?<a href="([^"]+)" title="([^"]+)".*?src="([^"]+)".*?<li>([^<]+)<' - else: - patron = '<a class="item" href="([^"]+)" title="([^"]+)".*?src="([^"]+)".*?<div class="videos">([^<]+)<' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedtitle, scrapedthumbnail, videos in matches: - if "go.php?" in scrapedurl: - scrapedurl = urllib.unquote(scrapedurl.split("/go.php?u=")[1].split("&")[0]) - scrapedthumbnail = urllib.unquote(scrapedthumbnail.split("/go.php?u=")[1].split("&")[0]) - scrapedthumbnail += "|Referer=https://www.porntrex.com/" - else: - scrapedurl = urlparse.urljoin(host, scrapedurl) - if not scrapedthumbnail.startswith("https"): - scrapedthumbnail = "https:%s" % scrapedthumbnail - scrapedthumbnail += "|Referer=https://www.porntrex.com/" - scrapedthumbnail = scrapedthumbnail.replace(" " , "%20") - if videos: - scrapedtitle = "%s (%s)" % (scrapedtitle, videos) - itemlist.append(item.clone(action="lista", title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail, - fanart=scrapedthumbnail)) - - # Extrae la marca de siguiente página - next_page = scrapertools.find_single_match(data, '<li class="next">.*?from:(\d+)') - if next_page: - if "from=" in item.url: - next_page = re.sub(r'&from=(\d+)', '&from=%s' % next_page, item.url) - else: - next_page = "%s&from=%s" % (item.url, next_page) - itemlist.append(item.clone(action="categorias", title=">> Página Siguiente", url=next_page)) - - return itemlist - - -def playlists(item): - logger.info() - itemlist = [] - # Descarga la pagina - data = get_data(item.url) - # Extrae las entradas - patron = '<div class="item.*?' - patron += 'href="([^"]+)" title="([^"]+)".*?' - patron += 'data-original="([^"]+)".*?' - patron += '<div class="totalplaylist">([^<]+)<' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedtitle, scrapedthumbnail, videos in matches: - if "go.php?" in scrapedurl: - scrapedurl = urllib.unquote(scrapedurl.split("/go.php?u=")[1].split("&")[0]) - scrapedthumbnail = urlparse.urljoin(host, scrapedthumbnail) - else: - scrapedurl = urlparse.urljoin(host, scrapedurl) - if not scrapedthumbnail.startswith("https"): - scrapedthumbnail = "https:%s" % scrapedthumbnail - scrapedthumbnail += "|Referer=https://www.porntrex.com/" - scrapedthumbnail = scrapedthumbnail.replace(" " , "%20") - if videos: - scrapedtitle = "%s [COLOR red](%s)[/COLOR]" % (scrapedtitle, videos) - itemlist.append(item.clone(action="videos", title=scrapedtitle, url=scrapedurl, thumbnail=scrapedthumbnail, - fanart=scrapedthumbnail)) - #Extrae la marca de siguiente página - next_page = scrapertools.find_single_match(data, '<li class="next">.*?href="([^"]+)"') - if next_page: - if "go.php?" in next_page: - next_page = urllib.unquote(next_page.split("/go.php?u=")[1].split("&")[0]) - else: - next_page = urlparse.urljoin(host, next_page) - itemlist.append(item.clone(action="playlists", title=">> Página Siguiente", url=next_page)) - - return itemlist - - -def videos(item): - logger.info() - if not item.indexp: - item.indexp = 1 - itemlist = [] - # Descarga la pagina - data = get_data(item.url) - action = "play" - if config.get_setting("menu_info", "porntrex"): - action = "menu_info" - # Extrae las entradas - # Quita las entradas, que no son private <div class="video-item private "> - patron = '<div class="video-item ".*?' - patron += 'href="([^"]+)".*?' - patron += 'title="([^"]+)".*?' - patron += 'src="([^"]+)"(.*?)<div class="durations">.*?' - patron += '</i>([^<]+)</div>' - matches = scrapertools.find_multiple_matches(data, patron) - count = 0 - for scrapedurl, scrapedtitle, scrapedthumbnail, quality, duration in matches: - count += 1 - if count < item.indexp: - continue - if "go.php?" in scrapedurl: - scrapedurl = urllib.unquote(scrapedurl.split("/go.php?u=")[1].split("&")[0]) - scrapedthumbnail = urlparse.urljoin(host, scrapedthumbnail) - else: - scrapedurl = urlparse.urljoin(host, scrapedurl) - if not scrapedthumbnail.startswith("https"): - scrapedthumbnail = "https:%s" % scrapedthumbnail - scrapedthumbnail += "|Referer=https://www.porntrex.com/" - scrapedthumbnail = scrapedthumbnail.replace(" " , "%20") - if 'k4"' in quality: - quality = "4K" - scrapedtitle = "%s - [COLOR yellow]%s[/COLOR] %s" % (duration, quality, scrapedtitle) - else: - quality = scrapertools.find_single_match(quality, '<span class="quality">(.*?)<.*?') - scrapedtitle = "%s - [COLOR red]%s[/COLOR] %s" % (duration, quality, scrapedtitle) - if len(itemlist) >= perpage: - break; - itemlist.append(item.clone(action=action, title=scrapedtitle, url=scrapedurl, contentThumbnail=scrapedthumbnail, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail)) - #Extrae la marca de siguiente página - if item.channel and len(itemlist) >= perpage: - itemlist.append( item.clone(title = "Página siguiente >>>", indexp = count + 1) ) - return itemlist - -def play(item): - logger.info() - itemlist = [] - data = get_data(item.url) - patron = '(?:video_url|video_alt_url[0-9]*):\s*\'([^\']+)\'.*?' - patron += '(?:video_url_text|video_alt_url[0-9]*_text):\s*\'([^\']+)\'' - matches = scrapertools.find_multiple_matches(data, patron) - scrapertools.printMatches(matches) - for url, quality in matches: - quality = quality.replace(" HD" , "").replace(" 4k", "") - itemlist.append(['.mp4 %s [directo]' % quality, url]) - if item.extra == "play_menu": - return itemlist, data - return itemlist - - -def menu_info(item): - logger.info() - itemlist = [] - video_urls, data = play(item.clone(extra="play_menu")) - itemlist.append(item.clone(action="play", title="Ver -- %s" % item.title, video_urls=video_urls)) - matches = scrapertools.find_multiple_matches(data, '<img class="thumb lazy-load" src="([^"]+)"') - for i, img in enumerate(matches): - if i == 0: - continue - img = "https:" + img + "|Referer=https://www.porntrex.com/" - title = "Imagen %s" % (str(i)) - itemlist.append(item.clone(action="", title=title, thumbnail=img, fanart=img)) - return itemlist - - -def tags(item): - logger.info() - itemlist = [] - data = get_data(item.url) - - if item.title == "Tags": - letras = [] - matches = scrapertools.find_multiple_matches(data, '<strong class="title".*?>\s*(.*?)</strong>') - for title in matches: - title = title.strip() - if title not in letras: - letras.append(title) - itemlist.append(Item(channel=item.channel, action="tags", url=item.url, title=title, extra=title)) - else: - if not item.length: - item.length = 0 - - bloque = scrapertools.find_single_match(data, - '>%s</strong>(.*?)(?:(?!%s)(?!#)[A-Z#]{1}</strong>|<div class="footer-margin">)' % ( - item.extra, item.extra)) - matches = scrapertools.find_multiple_matches(bloque, '<a href="([^"]+)">\s*(.*?)</a>') - for url, title in matches[item.length:item.length + 100]: - if "go.php?" in url: - url = urllib.unquote(url.split("/go.php?u=")[1].split("&")[0]) - itemlist.append(Item(channel=item.channel, action="lista", url=url, title=title)) - - if len(itemlist) >= 100: - itemlist.append(Item(channel=item.channel, action="tags", url=item.url, title=">> Página siguiente", - length=item.length + 100, extra=item.extra)) - - return itemlist - - -def get_data(url_orig): - try: - if config.get_setting("url_error", "porntrex"): - raise Exception - response = httptools.downloadpage(url_orig) - if not response.data or "urlopen error [Errno 1]" in str(response.code): - raise Exception - except: - config.set_setting("url_error", True, "porntrex") - import random - server_random = ['nl', 'de', 'us'] - server = server_random[random.randint(0, 2)] - url = "https://%s.hideproxy.me/includes/process.php?action=update" % server - post = "u=%s&proxy_formdata_server=%s&allowCookies=1&encodeURL=0&encodePage=0&stripObjects=0&stripJS=0&go=" \ - % (urllib.quote(url_orig), server) - while True: - response = httptools.downloadpage(url, post, follow_redirects=False) - if response.headers.get("location"): - url = response.headers["location"] - post = "" - else: - break - return response.data diff --git a/channels/porn/porntv.json b/channels/porn/porntv.json deleted file mode 100755 index d65c8cb8..00000000 --- a/channels/porn/porntv.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "porntv", - "name": "porntv", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://www.porntv.com/images/dart/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/porntv.py b/channels/porn/porntv.py deleted file mode 100755 index c2a9a31e..00000000 --- a/channels/porn/porntv.py +++ /dev/null @@ -1,104 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.porntv.com' - - -def mainlist(item): - logger.info() - itemlist = [] - - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/videos/straight/all-recent.html")) - itemlist.append( Item(channel=item.channel, title="Mas vistos" , action="lista", url=host + "/videos/straight/all-view.html")) - itemlist.append( Item(channel=item.channel, title="Mejor valorada" , action="lista", url=host + "/videos/straight/all-rate.html")) - itemlist.append( Item(channel=item.channel, title="Mas popular" , action="lista", url=host + "/videos/straight/all-popular.html")) - itemlist.append( Item(channel=item.channel, title="Mas largos" , action="lista", url=host + "/videos/straight/all-length.html")) - - - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "") - item.url = host + "/videos/straight/%s-recent.html" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - data = scrapertools.find_single_match(data, '<h1>Popular Categories</h1>(.*?)<h1>Community</h1>') - patron = '<h2><a href="([^"]+)">([^<]+)</a>.*?' - patron += 'src="([^"]+)".*?' - patron += '<span class="contentquantity">([^<]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,cantidad in matches: - scrapedplot = "" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - title = scrapedtitle + " " + cantidad - itemlist.append( Item(channel=item.channel, action="lista", title=title, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail , plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<div class="item" style="width: 320px">.*?' - patron += '<a href="([^"]+)".*?' - patron += '<img src="([^"]+)".*?' - patron += '>(.*?)<div class="trailer".*?' - patron += 'title="([^"]+)".*?' - patron += 'clock"></use></svg>([^<]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,quality,scrapedtitle,scrapedtime in matches: - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - if "flag-hd" in quality: - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + "[COLOR red]" + "HD" + "[/COLOR] " + scrapedtitle - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, - fanart=thumbnail, thumbnail=thumbnail, plot=plot, contentTitle = scrapedtitle)) - - next_page = scrapertools.find_single_match(data, '<a href="([^"]+)" class="next"') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="lista", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - data = scrapertools.find_single_match(data, 'sources: \[(.*?)\]') - patron = 'file: "([^"]+)",.*?label: "([^"]+)",' - matches = re.compile(patron,re.DOTALL).findall(data) - for url,quality in matches: - itemlist.append(["%s %s [directo]" % (quality, url), url]) - return itemlist - - diff --git a/channels/porn/qwertty.json b/channels/porn/qwertty.json deleted file mode 100644 index 0d618542..00000000 --- a/channels/porn/qwertty.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "qwertty", - "name": "qwertty", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://qwertty.net/wp-content/uploads/2019/07/favicon.ico", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} diff --git a/channels/porn/qwertty.py b/channels/porn/qwertty.py deleted file mode 100644 index 7daedcbe..00000000 --- a/channels/porn/qwertty.py +++ /dev/null @@ -1,116 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools -from channels import pornhub, xvideos,youporn - -host = 'http://qwertty.net' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Recientes" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Mas Vistas" , action="lista", url=host + "/?filter=most-viewed")) - itemlist.append( Item(channel=item.channel, title="Mas popular" , action="lista", url=host + "/?filter=popular")) - itemlist.append( Item(channel=item.channel, title="Mejor valoradas" , action="lista", url=host + "/?filter=random")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<li><a href="([^<]+)">(.*?)</a></li>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedurl = host + scrapedurl - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<article id="post-\d+".*?' - patron += '<a href="([^"]+)" title="([^"]+)">.*?' - patron += '<div class="post-thumbnail(.*?)<span class="views">.*?' - patron += '<span class="duration"><i class="fa fa-clock-o"></i>([^<]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,duracion in matches: - scrapedplot = "" - thumbnail = scrapertools.find_single_match(scrapedthumbnail, 'poster="([^"]+)"') - if thumbnail == "": - thumbnail = scrapertools.find_single_match(scrapedthumbnail, "data-thumbs='(.*?jpg)") - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, - fanart=thumbnail, thumbnail=thumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<li><a href="([^"]+)">Next</a>') - if next_page=="": - next_page = scrapertools.find_single_match(data,'<li><a class="current">.*?<li><a href="([^"]+)" class="inactive">') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - url1 = scrapertools.find_single_match(data,'<meta itemprop="embedURL" content="([^"]+)"') - if "spankwire" in url1: - data = httptools.downloadpage(item.url).data - data = scrapertools.get_match(data,'Copy Embed Code(.*?)For Desktop') - patron = '<div class="shareDownload_container__item__dropdown">.*?<a href="([^"]+)"' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl in matches: - url = scrapedurl - if url=="#": - url = scrapertools.find_single_match(data,'playerData.cdnPath480 = \'([^\']+)\'') - itemlist.append(item.clone(action="play", title=url, contentTitle = url, url=url)) - elif "xvideos1" in url1: - item1 = item.clone(url=url1) - itemlist = xvideos.play(item1) - return itemlist - elif "pornhub" in url1 : - url = url1 - elif "txx" in url1:# Falta conector - url = "" - elif "youporn" in url1: - item1 = item.clone(url=url1) - itemlist = youporn.play(item1) - return itemlist - else: - data = httptools.downloadpage(url1).data - url = scrapertools.find_single_match(data,'"quality":"\d+","videoUrl":"([^"]+)"') - url = url.replace("\/", "/") - - itemlist.append(item.clone(action="play", title= "%s " + url1, contentTitle = item.title, url=url)) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - return itemlist - diff --git a/channels/porn/redtube.json b/channels/porn/redtube.json deleted file mode 100644 index 4d1f69f1..00000000 --- a/channels/porn/redtube.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "redtube", - "name": "redtube", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://thumbs-cdn.redtube.com/www-static/cdn_files/redtube/images/pc/logo/redtube_logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} diff --git a/channels/porn/redtube.py b/channels/porn/redtube.py deleted file mode 100644 index 91c511a0..00000000 --- a/channels/porn/redtube.py +++ /dev/null @@ -1,119 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ - -import re -import urlparse -from core import httptools -from core import scrapertools -from core.item import Item -from platformcode import logger - -host = 'https://es.redtube.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="peliculas", url=host + "/newest")) - itemlist.append( Item(channel=item.channel, title="Mas Vistas" , action="peliculas", url=host + "/mostviewed")) - itemlist.append( Item(channel=item.channel, title="Mejor valorada" , action="peliculas", url=host + "/top")) - itemlist.append( Item(channel=item.channel, title="Pornstars" , action="catalogo", url=host + "/pornstar")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?search=%s" % texto - try: - return peliculas(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a class="pornstar_link js_mpop js-pop" href="([^"]+)".*?"([^"]+)"\s+title="([^"]+)".*?<div class="ps_info_count">\s+([^"]+)\s+Videos' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle + " [COLOR yellow]" + cantidad + "[/COLOR] " - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="peliculas", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - next_page_url = scrapertools.find_single_match(data,'<a id="wp_navNext" class="js_pop_page" href="([^"]+)">') - if next_page_url!="": - next_page_url = urlparse.urljoin(item.url,next_page_url) - itemlist.append(item.clone(action="catalogo", title="Página Siguiente >>", text_color="blue", url=next_page_url) ) - return itemlist - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="category_item_wrapper">.*?' - patron += '<a href="([^"]+)".*?' - patron += 'data-src="([^"]+)".*?' - patron += 'alt="([^"]+)".*?' - patron += '<span class="category_count">([^"]+) Videos' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,cantidad in matches: - scrapedplot = "" - cantidad = cantidad.strip() - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="peliculas", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def peliculas(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<img id="img_.*?data-path="([^"]+)".*?' - patron += '<span class="duration">(.*?)</a>.*?' - patron += '<a title="([^"]+)" href="([^"]+)">' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedthumbnail,duration,scrapedtitle,scrapedurl in matches: - url = urlparse.urljoin(item.url,scrapedurl) - scrapedhd = scrapertools.find_single_match(duration, '<span class="hd-video-text">(.*?)</span>') - if scrapedhd == 'HD': - duration = scrapertools.find_single_match(duration, 'HD</span>(.*?)</span>') - title = "[COLOR yellow]" + duration + "[/COLOR] " + "[COLOR red]" + scrapedhd + "[/COLOR] " + scrapedtitle - else: - duration = duration.replace("<span class=\"vr-video\">VR</span>", "") - title = "[COLOR yellow]" + duration + "[/COLOR] " + scrapedtitle - title = title.replace(" </span>", "").replace(" ", "") - scrapedthumbnail = scrapedthumbnail.replace("{index}.", "1.") - plot = "" - if not "/premium/" in url: - itemlist.append( Item(channel=item.channel, action="play" , title=title , url=url, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=plot, contentTitle = title) ) - next_page_url = scrapertools.find_single_match(data,'<a id="wp_navNext" class="js_pop_page" href="([^"]+)">') - if next_page_url!="": - next_page_url = urlparse.urljoin(item.url,next_page_url) - itemlist.append(item.clone(action="peliculas", title="Página Siguiente >>", text_color="blue", url=next_page_url) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '"defaultQuality":true,"format":"",.*?"videoUrl"\:"([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl in matches: - url = scrapedurl.replace("\/", "/") - itemlist.append(item.clone(action="play", title=url, url=url)) - return itemlist - diff --git a/channels/porn/serviporno.json b/channels/porn/serviporno.json deleted file mode 100644 index 5b72fb31..00000000 --- a/channels/porn/serviporno.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "serviporno", - "name": "Serviporno", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "serviporno.png", - "banner": "serviporno.png", - "categories": [ - "adult" - ], - "settings": [ - ] -} diff --git a/channels/porn/serviporno.py b/channels/porn/serviporno.py deleted file mode 100644 index 67096e09..00000000 --- a/channels/porn/serviporno.py +++ /dev/null @@ -1,149 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urlparse - -from core import httptools -from core import scrapertools -from core.item import Item -from platformcode import logger - -host = "https://www.serviporno.com" - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(Item(channel=item.channel, action="videos", title="Útimos videos", - url=host + "/ajax/homepage/?page=1", last= host)) - itemlist.append(Item(channel=item.channel, action="videos", title="Más vistos", - url=host + "/ajax/most_viewed/?page=1", last= host + "/mas-vistos/")) - itemlist.append(Item(channel=item.channel, action="videos", title="Más votados", - url=host + "/ajax/best_rated/?page=1", last= host + "/mas-votados/")) - itemlist.append(Item(channel=item.channel, action="categorias", title="Canal", - url=host + "/ajax/list_producers/?page=1", last= host + "/sitios/")) - itemlist.append(Item(channel=item.channel, action="categorias", title="Categorias", url= host + "/categorias/")) - itemlist.append(Item(channel=item.channel, action="chicas", title="Chicas", - url=host + "/ajax/list_pornstars/?page=1", last= host + "/pornstars/")) - itemlist.append(Item(channel=item.channel, action="search", title="Buscar", last="")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + '/ajax/new_search/?q=%s&page=1' % texto - try: - return videos(item) - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def get_last_page(url): - logger.info() - data = httptools.downloadpage(url).data - last_page= scrapertools.find_single_match(data,'data-ajax-last-page="(\d+)"') - if last_page: - last_page= int(last_page) - return last_page - - -def videos(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '(?s)<div class="wrap-box-escena">.*?' - patron += '<div class="box-escena">.*?' - patron += '<a\s*href="([^"]+)".*?' - patron += 'data-stats-video-name="([^"]+)".*?' - patron += 'data-src="([^"]+)".*?' - patron += '<div class="duracion">([^"]+) min</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for url, title, thumbnail,duration in matches: - title = "[COLOR yellow]" + duration + "[/COLOR] " + title - url = urlparse.urljoin(item.url, url) - itemlist.append(Item(channel=item.channel, action='play', title=title, url=url, thumbnail=thumbnail, fanart=thumbnail)) - # Paginador "Página Siguiente >>" - current_page = int(scrapertools.find_single_match(item.url, "/?page=(\d+)")) - if not item.last_page: - last_page = get_last_page(item.last) - else: - last_page = int(item.last_page) - if current_page < last_page: - next_page = "?page=" + str(current_page + 1) - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(Item(channel=item.channel, action="videos", title="Página Siguiente >>", text_color="blue", - url=next_page, thumbnail="", last_page=last_page)) - return itemlist - - -def chicas(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="box-chica">.*?' - patron += '<a href="([^"]+)" title="">.*?' - patron += '<img class="img" src=\'([^"]+)\' width="175" height="150" border=\'0\' alt="[^"]+" />.*?' - patron += '<h4><a href="[^"]+" title="">([^"]+)</a></h4>.*?' - patron += '<a class="total-videos" href="[^"]+" title="">([^<]+)</a>' - matches = re.compile(patron, re.DOTALL).findall(data) - for url, thumbnail, title, videos in matches: - last = urlparse.urljoin(item.url, url) - url= last.replace("/pornstar", "/ajax/show_pornstar") + "?page=1" - title = title + " (" + videos + ")" - itemlist.append(Item(channel=item.channel, action='videos', title=title, url=url, last=last, thumbnail=thumbnail, fanart=thumbnail)) - # Paginador "Página Siguiente >>" - current_page = int(scrapertools.find_single_match(item.url, "/?page=(\d+)")) - if not item.last_page: - last_page = get_last_page(item.last) - else: - last_page = int(item.last_page) - if current_page < last_page: - next_page = "?page=" + str(current_page + 1) - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(Item(channel=item.channel, action="chicas", title="Página Siguiente >>", text_color="blue", - url=next_page, thumbnail="", last_page=last_page)) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="wrap-box-escena.*?' - patron += '<img src="([^"]+)".*?' - patron += '<h4.*?<a href="([^"]+)">([^<]+)<' - matches = re.compile(patron, re.DOTALL).findall(data) - for thumbnail, url, title in matches: - last = urlparse.urljoin(item.url, url) - url= last.replace("/videos-porno", "/ajax/show_category").replace("/sitio","/ajax/show_producer") + "?page=1" - itemlist.append(Item(channel=item.channel, action='videos', title=title, url=url, last=last, thumbnail=thumbnail, plot="")) - # Paginador "Página Siguiente >>" - current_page = scrapertools.find_single_match(item.url, "/?page=(\d+)") - if current_page: - current_page = int(current_page) - if not item.last_page: - last_page = get_last_page(item.last) - else: - last_page = int(item.last_page) - if current_page < last_page: - next_page = "?page=" + str(current_page + 1) - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(Item(channel=item.channel, action="categorias", title="Página Siguiente >>", text_color="blue", - url=next_page, thumbnail="", last_page=last_page)) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - url = scrapertools.find_single_match(data, "sendCdnInfo.'([^']+)") - itemlist.append( - Item(channel=item.channel, action="play", server="directo", title=item.title, url=url, thumbnail=item.thumbnail, - plot=item.plot, folder=False)) - return itemlist - diff --git a/channels/porn/sexgalaxy.json b/channels/porn/sexgalaxy.json deleted file mode 100644 index 36fadfbd..00000000 --- a/channels/porn/sexgalaxy.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "sexgalaxy", - "name": "sexgalaxy", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://sexgalaxy.net/wp-content/themes/redwaves-lite/images/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/sexgalaxy.py b/channels/porn/sexgalaxy.py deleted file mode 100644 index 506bd45a..00000000 --- a/channels/porn/sexgalaxy.py +++ /dev/null @@ -1,89 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urlparse -from core import httptools -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import logger - -host = 'http://sexgalaxy.net' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(Item(channel=item.channel, title="Peliculas", action="lista", url=host + "/full-movies/")) - itemlist.append(Item(channel=item.channel, title="Videos", action="lista", url=host + "/new-releases/")) - itemlist.append(Item(channel=item.channel, title="Canales", action="canales", url=host)) - itemlist.append(Item(channel=item.channel, title="Categorias", action="categorias", url=host)) - itemlist.append(Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def canales(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(host).data - data = scrapertools.find_single_match(data, '>TopSites</a>(.*?)</ul>') - patron = '<li id=.*?<a href="(.*?)">(.*?)</a></li>' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedtitle = str(scrapedtitle) - thumbnail = urlparse.urljoin(item.url, scrapedthumbnail) - itemlist.append(Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot)) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data, '>Popular Categories<(.*?)</p>') - patron = '<a href="(.*?)">(.*?)</a>' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedtitle = str(scrapedtitle) - thumbnail = urlparse.urljoin(item.url, scrapedthumbnail) - itemlist.append(Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot)) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="post-img small-post-img">.*?<a href="(.*?)" title="(.*?)">.*?<img src="(.*?)"' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedtitle, scrapedthumbnail in matches: - scrapedplot = "" - calidad = scrapertools.find_single_match(scrapedtitle, '\(.*?/(\w+)\)') - if calidad: - scrapedtitle = "[COLOR red]" + calidad + "[/COLOR] " + scrapedtitle - itemlist.append(Item(channel=item.channel, action="findvideos", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot)) - next_page = scrapertools.find_single_match(data, '<a class="next page-numbers" href="([^"]+)"') - if next_page != "": - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page)) - return itemlist - - diff --git a/channels/porn/sexkino.json b/channels/porn/sexkino.json deleted file mode 100644 index 12ffb7a7..00000000 --- a/channels/porn/sexkino.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "sexkino", - "name": "sexkino", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://sexkino.to/wp-content/uploads/2016/12/sexkino.to_.jpg", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/sexkino.py b/channels/porn/sexkino.py deleted file mode 100644 index c530c2b2..00000000 --- a/channels/porn/sexkino.py +++ /dev/null @@ -1,137 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urlparse -from core import httptools -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import logger - -host = 'http://sexkino.to' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="New" , action="lista", url= host + "/movies/")) - itemlist.append( Item(channel=item.channel, title="Año" , action="anual", url= host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url= host)) - - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info("pelisalacarta.gmobi mainlist") - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<li class="cat-item cat-item-.*?<a href="(.*?)" >(.*?)</a> <i>(.*?)</i>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedtitle = scrapedtitle + " ("+cantidad+")" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - -def anual(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<li><a href="([^<]+)">([^<]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="poster">.*?' - patron += '<img src="([^"]+)" alt="([^"]+)">.*?' - patron += '<span class="quality">([^"]+)</span>.*?' - patron += '<a href="([^"]+)">' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedthumbnail,scrapedtitle,calidad,scrapedurl in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle + " (" + calidad + ")" - itemlist.append( Item(channel=item.channel, action="findvideos", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, fanart=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'resppages.*?<a href="([^"]+)" ><span class="icon-chevron-right">') - if next_page != "": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Next page >>", text_color="blue", url=next_page) ) - return itemlist - - -def findvideos(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - - # <th>Watch online</th><th>Quality</th><th>Language</th><th>Added</th></tr></thead> - # <tbody> - # <tr id='link-3848'><td><img src='https://s2.googleusercontent.com/s2/favicons?domain=vidzella.me'> <a href='http://sexkino.to/links/69321-5/' target='_blank'>Watch online</a></td> - # <td><strong class='quality'>DVDRip</strong></td><td>German</td><td>2 years</td></tr> - # <tr id='link-3847'><td><img src='https://s2.googleusercontent.com/s2/favicons?domain=flashx.tv'> <a href='http://sexkino.to/links/69321-4/' target='_blank'>Watch online</a></td> - # <td><strong class='quality'>DVDRip</strong></td><td>German</td><td>2 years</td></tr> - # <tr id='link-3844'><td><img src='https://s2.googleusercontent.com/s2/favicons?domain=openload.co'> <a href='http://sexkino.to/links/69321-3/' target='_blank'>Watch online</a></td> - # <td><strong class='quality'>DVDRip</strong></td><td>German</td><td>2 years</td></tr> - # <tr id='link-3843'><td><img src='https://s2.googleusercontent.com/s2/favicons?domain=vidoza.net'> <a href='http://sexkino.to/links/69321-2/' target='_blank'>Watch online</a></td> - # <td><strong class='quality'>DVDRip</strong></td><td>German</td><td>2 years</td></tr> - # <tr id='link-3842'><td><img src='https://s2.googleusercontent.com/s2/favicons?domain=rapidvideo.ws'> <a href='http://sexkino.to/links/69321/' target='_blank'>Watch online</a></td> - # <td><strong class='quality'>DVDRip</strong></td><td>German</td><td>2 years</td></tr> - # </tbody></table></div></div></div></div> - - - - patron = '<tr id=(.*?)</tr>' - matches = re.compile(patron,re.DOTALL).findall(data) - for match in matches: - url = scrapertools.find_single_match(match,'href="([^"]+)" target') - title = scrapertools.find_single_match(match,'<td><img src=.*?> (.*?)</td>') - itemlist.append(item.clone(action="play", title=title, url=url)) - - # <a id="link" href="https://vidzella.me/play#GS7D" class="btn" style="background-color:#1e73be">Continue</a> - - patron = '<iframe class="metaframe rptss" src="([^"]+)".*?<li><a class="options" href="#option-\d+">\s+(.*?)\s+<' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - url = scrapedurl - title = scrapedtitle - itemlist.append(item.clone(action="play", title=title, url=url)) - return itemlist - - -def play(item): - logger.info() - data = httptools.downloadpage(item.url).data - itemlist = servertools.find_video_items(data=data) - for videoitem in itemlist: - videoitem.title = item.title - videoitem.thumbnail = item.thumbnail - videoitem.channel = item.channel - return itemlist - diff --git a/channels/porn/sexofilm.json b/channels/porn/sexofilm.json deleted file mode 100644 index fc013872..00000000 --- a/channels/porn/sexofilm.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "sexofilm", - "name": "sexofilm", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://i0.wp.com/sexofilm.com/xbox/wp-content/uploads/2016/06/SexoFilm-Logo-230x54-LOGO-MOBILE.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/sexofilm.py b/channels/porn/sexofilm.py deleted file mode 100644 index d71a7d3e..00000000 --- a/channels/porn/sexofilm.py +++ /dev/null @@ -1,102 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://sexofilm.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url=host + "/xtreme-adult-wing/adult-dvds/")) - itemlist.append( Item(channel=item.channel, title="Parody" , action="lista", url=host + "/xtreme-adult-wing/porn-parodies/")) - itemlist.append( Item(channel=item.channel, title="Videos" , action="lista", url=host + "/xtreme-adult-wing/porn-clips-movie-scene/")) - itemlist.append( Item(channel=item.channel, title="SexMUSIC" , action="lista", url=host + "/topics/sexo-music-videos/")) - itemlist.append( Item(channel=item.channel, title="Xshows" , action="lista", url=host + "/xshows/")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="categorias", url=host)) - # itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url =host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - if item.title == "Canal" : - data = scrapertools.find_single_match(data,'>Best Porn Studios</a>(.*?)</ul>') - else: - data = scrapertools.find_single_match(data,'<div class="nav-wrap">(.*?)<ul class="sub-menu">') - itemlist.append( Item(channel=item.channel, action="lista", title="Big tit", url="https://sexofilm.com/?s=big+tits")) - patron = '<a href="([^<]+)">([^<]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl) ) - return itemlist - - -def anual(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<li><a href="([^<]+)">([^<]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<article id="post-\d+".*?' - patron += '<a href="([^"]+)".*?' - patron += 'data-src="([^"]+)".*?' - patron += '<h2 class="post-title.*?title="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - plot = "" - title = scrapedtitle.replace(" Porn DVD", "").replace("Permalink to ", "").replace(" Porn Movie", "") - itemlist.append(item.clone(action="play", title=title, url=scrapedurl, thumbnail=scrapedthumbnail, - fanart=scrapedthumbnail, plot=plot) ) - next_page = scrapertools.find_single_match(data,'<a class="nextpostslink" rel="next" href="([^"]+)">') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - url = scrapertools.find_single_match(data,'<div class="entry-inner">.*?<source src="([^"]+)"') - if not url: - url = scrapertools.find_single_match(data,'<div class="entry-inner">.*?<source src=\'([^\']+)\'') - itemlist = servertools.find_video_items(item.clone(url = item.url)) - if url: - itemlist.append(item.clone(action="play", title=url, url=url)) - return itemlist - - diff --git a/channels/porn/shameless.json b/channels/porn/shameless.json deleted file mode 100755 index f8016a10..00000000 --- a/channels/porn/shameless.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "shameless", - "name": "Shameless", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://www.shameless.com/favicon/apple-touch-icon.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} diff --git a/channels/porn/shameless.py b/channels/porn/shameless.py deleted file mode 100755 index 2d7ca4ab..00000000 --- a/channels/porn/shameless.py +++ /dev/null @@ -1,95 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.shameless.com' - - -def mainlist(item): - logger.info() - itemlist = [] - - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/videos/1/")) - itemlist.append( Item(channel=item.channel, title="Mas popular" , action="lista", url=host + "/videos/popular/week/")) - itemlist.append( Item(channel=item.channel, title="Mejor valorada" , action="lista", url=host + "/videos/rated/week/")) - - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/?q=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<a href="(https://www.shameless.com/categories/[^"]+)".*?' - patron += '<span itemprop="name">(.*?)</span> <sup>(.*?)</sup>.*?' - patron += 'src="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,cantidad,scrapedthumbnail in matches: - scrapedplot = "" - title = scrapedtitle + " " + cantidad - itemlist.append( Item(channel=item.channel, action="lista", title=title, url=scrapedurl, - thumbnail=scrapedthumbnail , plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<div class="icnt.*?' - patron += '<a href="([^"]+)".*?' - patron += 'data-src="([^"]+)" alt="([^"]+)".*?' - patron += '<div class="bg"></div>([^<]+)</time>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,scrapedtime in matches: - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail + "|Referer=https://www.shameless.com/" - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, - fanart=thumbnail, thumbnail=thumbnail, plot=plot, contentTitle = scrapedtitle)) - next_page = scrapertools.find_single_match(data, 'class="active">.*?<a href="([^"]+)"') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="lista", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '(?:video_url|video_alt_url[0-9]*):\s*\'([^\']+)\'.*?' - patron += '(?:video_url_text|video_alt_url[0-9]*_text):\s*\'([^\']+)\'' - matches = scrapertools.find_multiple_matches(data, patron) - for url, quality in matches: - headers = {'Referer': item.url} - url = httptools.downloadpage(url, headers=headers , follow_redirects=False, only_headers=True).headers.get("location", "") - itemlist.append(["%s %s [directo]" % (quality, url), url]) - return itemlist - - diff --git a/channels/porn/siska.json b/channels/porn/siska.json deleted file mode 100644 index e4ebb2c4..00000000 --- a/channels/porn/siska.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "siska", - "name": "siska", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.siska.tv/images/siska.png?50", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/siska.py b/channels/porn/siska.py deleted file mode 100644 index 2ef0d1a2..00000000 --- a/channels/porn/siska.py +++ /dev/null @@ -1,89 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://www.siska.tv/' - - -def mainlist(item): - logger.info() - itemlist = [] - - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "newVideo.php?language=en")) - itemlist.append( Item(channel=item.channel, title="Mas vistos" , action="lista", url=host + "MostViewed.php?views=month&language=en")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="categorias", url=host + "Channel.php?language=en")) - - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "index.php?category=1&language=en")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "search.php?q=%s&language=en&search=Search" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - data = scrapertools.find_single_match(data,'<div id="content">(.*?)<div class="maincat">') - patron = '<a href="(.*?)".*?' - patron += '<img src="(.*?)".*?alt="(.*?)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle.replace("Watch Channel ", "") - url = urlparse.urljoin(item.url,scrapedurl) - thumbnail = urlparse.urljoin(item.url,scrapedthumbnail) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=url, - thumbnail=thumbnail , plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - if "catID=" in item.url: - patron = '<li><h3><a href="([^"]+)">.*?' - patron += '<img src="([^"]+)" class="imgt" alt="([^"]+)".*?' - patron += '<div class="time">(.*?)</div>' - else: - patron = '<li><h3><a href=\'([^\']+)\'>.*?' - patron += '<img src=\'([^\']+)\' class=\'imgt\' alt=\'(.*?)\'.*?' - patron += '<div class=\'time\'>(.*?)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,scrapedtime in matches: - scrapedtime = scrapedtime.replace("Duration: ", "").replace(" : ", ":") - url = urlparse.urljoin(item.url,scrapedurl) - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - thumbnail = urlparse.urljoin(item.url,scrapedthumbnail) - plot = "" - itemlist.append( Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumbnail, plot=plot, - contentTitle = scrapedtitle)) - next_page = scrapertools.find_single_match(data, '<a href="([^"]+)"><span>Next') - if next_page == "": - next_page = scrapertools.find_single_match(data, '<a href=\'([^\']+)\' title=\'Next Page\'>') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="lista", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - diff --git a/channels/porn/sleazemovies.json b/channels/porn/sleazemovies.json deleted file mode 100644 index 1be75fce..00000000 --- a/channels/porn/sleazemovies.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "sleazemovies", - "name": "SleazeMovies", - "active": true, - "adult": true, - "language": [], - "thumbnail": "https://i.imgur.com/x0tzGxQ.jpg", - "banner": "https://i.imgur.com/d8LsUNf.png", - "fanart": "https://i.imgur.com/NRdQvFW.jpg", - "categories": [ - "movie", - "vos" - ] -} diff --git a/channels/porn/sleazemovies.py b/channels/porn/sleazemovies.py deleted file mode 100644 index 10b81e6f..00000000 --- a/channels/porn/sleazemovies.py +++ /dev/null @@ -1,109 +0,0 @@ -# -*- coding: utf-8 -*- -# -*- Channel SleazeMovies -*- -# -*- Created for Alfa-addon -*- -# -*- By Sculkurt -*- - -import re -from channelselector import get_thumb -from core import httptools -from core import scrapertools -from core import servertools -from core import tmdb -from core.item import Item -from platformcode import config, logger - -host = 'http://www.eroti.ga/' - - -def mainlist(item): - logger.info() - - itemlist = list() - itemlist.append(item.clone(title="Todas", action="list_all", url=host, thumbnail=get_thumb('all', auto=True))) - itemlist.append(item.clone(title="Generos", action="genero", url=host, thumbnail=get_thumb('genres', auto=True))) - itemlist.append(item.clone(title="Buscar", action="search", thumbnail=get_thumb('search', auto=True))) - - return itemlist - -def genero(item): - logger.info() - itemlist = list() - data = httptools.downloadpage(host).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - patron = '<li class="cat-item.*?<a href="([^"]+)".*?>([^<]+)</a>' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedtitle in matches: - - itemlist.append(item.clone(action='list_all', title=scrapedtitle, url=scrapedurl)) - return itemlist - - -def list_all(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) # Eliminamos tabuladores, dobles espacios saltos de linea, etc... - - patron = '<div class="featured-thumb"><a href="([^"]+)"><img.*?src="([^?]+).*?data-image-title="([^\(]+).*?\(([^\)]+)' - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedurl, img, scrapedtitle, year in matches: - itemlist.append(Item(channel = item.channel, - title = scrapedtitle, - url = scrapedurl, - action = "findvideos", - thumbnail = img, - contentTitle = scrapedtitle, - contentType = "movie", - infoLabels = {'year': year})) - tmdb.set_infoLabels_itemlist(itemlist, seekTmdb = True) - - # Extrae la marca de siguiente página - next_page = scrapertools.find_single_match(data, '<a class="next page-numbers" href="([^"]+)">Next</a></div>') - if next_page != "": - itemlist.append(Item(channel=item.channel, action="list_all", title=">> Página siguiente", url=next_page, folder=True)) - return itemlist - - - -def search(item, texto): - logger.info() - if texto != "": - texto = texto.replace(" ", "+") - item.url = host + "?s=" + texto - item.extra = "busqueda" - try: - return list_all(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def findvideos(item): - logger.info() - - itemlist = [] - - data = httptools.downloadpage(item.url).data - logger.debug('codigo = ' + data) - - itemlist.extend(servertools.find_video_items(data=data)) - - for video in itemlist: - - video.channel = item.channel - video.contentTitle = item.contentTitle - - if config.get_videolibrary_support() and len(itemlist) > 0 and item.extra != 'findvideos': - itemlist.append(Item(channel = item.channel, - title = '[COLOR yellow]Añadir esta pelicula a la videoteca[/COLOR]', - url = item.url, - action = "add_pelicula_to_library", - extra = "findvideos", - contentTitle = item.contentTitle, - thumbnail = item.thumbnail - )) - - return itemlist diff --git a/channels/porn/spankbang.json b/channels/porn/spankbang.json deleted file mode 100644 index 40cdeee4..00000000 --- a/channels/porn/spankbang.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "spankbang", - "name": "spankbang", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://static.spankbang.com/static_desktop/Images/logo_desktop@2xv2.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - - diff --git a/channels/porn/spankbang.py b/channels/porn/spankbang.py deleted file mode 100644 index 538eabe8..00000000 --- a/channels/porn/spankbang.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://es.spankbang.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos", action="lista", url= host + "/new_videos/")) - itemlist.append( Item(channel=item.channel, title="Mas valorados", action="lista", url=host + "/trending_videos/")) - itemlist.append( Item(channel=item.channel, title="Mas vistos", action="lista", url= host + "/most_popular/")) - itemlist.append( Item(channel=item.channel, title="Mas largos", action="lista", url= host + "/longest_videos/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/s/%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<a href="([^"]+)/?order=trending"><img src="([^"]+)"><span>([^"]+)</span></a>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - scrapedplot = "" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - scrapedthumbnail = urlparse.urljoin(item.url,scrapedthumbnail) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle , url=scrapedurl , - thumbnail=scrapedthumbnail, fanart=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="video-item" data-id="\d+">.*?' - patron += '<a href="([^"]+)" class="thumb ">.*?' - patron += 'data-src="([^"]+)" alt="([^"]+)".*?' - patron += '</span>(.*?)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,scrapedtime in matches: - url = urlparse.urljoin(item.url,scrapedurl) - scrapedhd = scrapertools.find_single_match(scrapedtime, '<span class="i-hd">(.*?)</span>') - duration = scrapertools.find_single_match(scrapedtime, '<i class="fa fa-clock-o"></i>(.*?)</span>') - if scrapedhd != '': - title = "[COLOR yellow]" + duration + " min[/COLOR] " + "[COLOR red]" +scrapedhd+ "[/COLOR] "+scrapedtitle - else: - title = "[COLOR yellow]" + duration + " min[/COLOR] " + scrapedtitle - thumbnail = "http:" + scrapedthumbnail - plot = "" - year = "" - itemlist.append( Item(channel=item.channel, action="play" , title=title , url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle=title) ) - next_page = scrapertools.find_single_match(data, '<li class="next"><a href="([^"]+)">') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="lista", title="Página Siguiente >>" , text_color="blue", - url=next_page ) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - scrapedurl = scrapertools.find_single_match(data, 'var stream_url_1080p = \'([^\']+)\';') - if scrapedurl == "": - scrapedurl = scrapertools.find_single_match(data, 'var stream_url_720p = \'([^\']+)\';') - if scrapedurl == "": - scrapedurl = scrapertools.find_single_match(data, 'var stream_url_480p = \'([^\']+)\';') - scrapedurl = scrapedurl.replace("amp;", "") - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=scrapedurl, thumbnail=item.thumbnail, - plot=item.plot, show=item.title, server="directo")) - return itemlist - diff --git a/channels/porn/spankwire.json b/channels/porn/spankwire.json deleted file mode 100644 index bb80d7a9..00000000 --- a/channels/porn/spankwire.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "spankwire", - "name": "spankwire", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://cdn1-static-spankwire.spankcdn.net/apple-touch-icon-precomposed.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/spankwire.py b/channels/porn/spankwire.py deleted file mode 100644 index bd0856c8..00000000 --- a/channels/porn/spankwire.py +++ /dev/null @@ -1,133 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re - -from core import jsontools as json -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.spankwire.com' - -url_api = host + "/api/video/list.json?segment=Straight&limit=33&sortby=" - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=url_api + "recent&page=1")) - itemlist.append( Item(channel=item.channel, title="Mas Vistas" , action="lista", url=url_api + "views&period=Month&page=1")) - itemlist.append( Item(channel=item.channel, title="Mejor valorada" , action="lista", url=url_api + "rating&period=Month&page=1")) - itemlist.append( Item(channel=item.channel, title="Longitud" , action="lista", url=url_api + "duration&period=Month&page=1")) - itemlist.append( Item(channel=item.channel, title="Pornstar" , action="catalogo", url=host + "/api/pornstars?limit=48&sort=popular&page=1")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/api/categories/list.json?segmentId=0&limit=100&sort=abc&page=1")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/api/video/search.json?segment=Straight&limit=33&query=%s&page=1" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - JSONData = json.load(data) - for Video in JSONData["items"]: - title = Video["name"] - id = Video["id"] - cantidad = Video["videosNumber"] - thumbnail = Video["image"] - title = "%s (%s)" % (title,cantidad) - thumbnail = thumbnail.replace("\/", "/").replace(".webp", ".jpg") - url = url_api + "recent&category=%s&page=1" % id - plot = "" - itemlist.append( Item(channel=item.channel, action="lista", title=title, url=url, - fanart=thumbnail, thumbnail=thumbnail, plot=plot) ) - Actual = int(scrapertools.find_single_match(item.url, '&page=([0-9]+)')) - if JSONData["pages"] - 1 > Actual: - scrapedurl = item.url.replace("&page=" + str(Actual), "&page=" + str(Actual + 1)) - itemlist.append(item.clone(action="categorias", title="Página Siguiente >>", text_color="blue", url=scrapedurl)) - return itemlist - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - JSONData = json.load(data) - for Video in JSONData["items"]: - title = Video["name"] - id = Video["id"] - cantidad = Video["videos"] - thumbnail = Video["thumb"] - title = "%s (%s)" % (title,cantidad) - thumbnail = thumbnail.replace("\/", "/").replace(".webp", ".jpg") - url = host + "/api/video/list.json?pornstarId=%s&limit=25&sortby=recent&page=1" % id - plot = "" - itemlist.append( Item(channel=item.channel, action="lista", title=title, url=url, - fanart=thumbnail, thumbnail=thumbnail, plot=plot) ) - Actual = int(scrapertools.find_single_match(item.url, '&page=([0-9]+)')) - if JSONData["pages"] - 1 > Actual: - scrapedurl = item.url.replace("&page=" + str(Actual), "&page=" + str(Actual + 1)) - itemlist.append(item.clone(action="catalogo", title="Página Siguiente >>", text_color="blue", url=scrapedurl)) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - JSONData = json.load(data) - for Video in JSONData["items"]: - segundos = Video["duration"] - horas=int(segundos/3600) - segundos-=horas*3600 - minutos=int(segundos/60) - segundos-=minutos*60 - if segundos < 10: - segundos = "0%s" %segundos - if minutos < 10: - minutos = "0%s" %minutos - if horas == 00: - duration = "%s:%s" % (minutos,segundos) - else: - duration = "%s:%s:%s" % (horas,minutos,segundos) - title = Video["title"] - thumbnail = Video["flipBookPath"] - url = host + Video["url"] - title = "[COLOR yellow]" + duration + "[/COLOR] " + title - thumbnail = thumbnail.replace("\/", "/").replace("{index}", "2") - url = url.replace("\/", "/") - plot = "" - itemlist.append( Item(channel=item.channel, action="play" , title=title , url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot)) - Actual = int(scrapertools.find_single_match(item.url, '&page=([0-9]+)')) - if JSONData["pages"] - 1 > Actual: - scrapedurl = item.url.replace("&page=" + str(Actual), "&page=" + str(Actual + 1)) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=scrapedurl)) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - scrapedurl = scrapertools.find_single_match(data,'<div class="shareDownload_container__item__dropdown">.*?<a href="([^"]+)"') - itemlist.append(item.clone(action="play", server = "directo", url=scrapedurl)) - return itemlist - diff --git a/channels/porn/streamingporn.json b/channels/porn/streamingporn.json deleted file mode 100644 index 0f7929a5..00000000 --- a/channels/porn/streamingporn.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "streamingporn", - "name": "streamingporn", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://streamingporn.xyz/wp-content/uploads/2017/06/streamingporn.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - - diff --git a/channels/porn/streamingporn.py b/channels/porn/streamingporn.py deleted file mode 100644 index 383bedae..00000000 --- a/channels/porn/streamingporn.py +++ /dev/null @@ -1,99 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://streamingporn.xyz' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url=host + "/category/movies/")) - itemlist.append( Item(channel=item.channel, title="Videos" , action="lista", url=host + "/category/stream/")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="catalogo", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data,'PaySites(.*?)<li id="menu-item-28040"') - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<li id="menu-item-\d+".*?<a href="([^"]+)">([^"]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle , url=scrapedurl , - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data,'<a href="#">Categories</a>(.*?)</ul>') - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<li id="menu-item-\d+".*?<a href="([^"]+)">([^"]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedtitle = scrapedtitle - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle , url=scrapedurl , - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="entry-featuredImg">.*?<a href="([^"]+)">.*?<img src="([^"]+)" alt="([^"]+)">' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - url = scrapedurl - title = scrapedtitle - if 'HD' in scrapedtitle : - calidad = scrapertools.find_single_match(scrapedtitle, '(\d+)p') - title = "[COLOR red]" + "HD" +"[/COLOR] "+ scrapedtitle - if calidad : - title = "[COLOR red]" + "HD" + calidad +" [/COLOR] "+ scrapedtitle - contentTitle = title - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="findvideos" , title=title , url=url, thumbnail=thumbnail, - fanart=scrapedthumbnail, plot=plot, contentTitle = contentTitle) ) - next_page_url = scrapertools.find_single_match(data,'<div class="loadMoreInfinite"><a href="(.*?)" >Load More') - if next_page_url!="": - next_page_url = urlparse.urljoin(item.url,next_page_url) - itemlist.append( Item(channel=item.channel , action="lista" , title="Página Siguiente >>" , - text_color="blue", url=next_page_url) ) - return itemlist - diff --git a/channels/porn/streamporno.json b/channels/porn/streamporno.json deleted file mode 100644 index 437adbbe..00000000 --- a/channels/porn/streamporno.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "streamporno", - "name": "streamporno", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://pornstreams.eu/wp-content/uploads/2015/12/faviiconeporn.png", - "banner": "", - "categories": [ - "adult" - - ], - "settings": [ - - ] -} - diff --git a/channels/porn/streamporno.py b/channels/porn/streamporno.py deleted file mode 100644 index 0634b825..00000000 --- a/channels/porn/streamporno.py +++ /dev/null @@ -1,77 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://streamporno.eu' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Canal" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<li id="menu-item-.*?<a href="([^"]+)">([^"]+)</a>' - if item.title == "Categorias": - itemlist.append( Item(channel=item.channel, title="Big Tits" , action="lista", url=host + "/?s=big+tits")) - patron = '<li class="cat-item.*?<a href="([^"]+)">([^"]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedtitle = scrapedtitle - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<article id=.*?<a href="([^"]+)" title="([^"]+)">.*?src="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail in matches: - url = urlparse.urljoin(item.url,scrapedurl) - title = scrapedtitle - contentTitle = title - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="findvideos" , title=title , url=url, - thumbnail=thumbnail, fanart=thumbnail, plot=plot, contentTitle = contentTitle)) - next_page = scrapertools.find_single_match(data,'<a class="nextpostslink" rel="next" href="([^"]+)">»</a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - diff --git a/channels/porn/submityouflicks.json b/channels/porn/submityouflicks.json deleted file mode 100644 index 42bdf281..00000000 --- a/channels/porn/submityouflicks.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "submityouflicks", - "name": "Submit Your Flicks", - "active": true, - "adult": true, - "language": ["*"], - "banner": "submityouflicks.png", - "thumbnail": "submityouflicks.png", - "categories": [ - "adult" - ], - "settings": [ - ] -} diff --git a/channels/porn/submityouflicks.py b/channels/porn/submityouflicks.py deleted file mode 100644 index 4d726fb8..00000000 --- a/channels/porn/submityouflicks.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urlparse - -from core import httptools -from core import scrapertools -from core.item import Item -from platformcode import logger - -host = 'http://www.submityourflicks.com' - -def mainlist(item): - logger.info() - itemlist = [] - - itemlist.append(Item(channel=item.channel, action="videos", title="Útimos videos", url= host)) - itemlist.append(Item(channel=item.channel, action="videos", title="Mas vistos", url= host + "/most-viewed/")) - itemlist.append(Item(channel=item.channel, action="videos", title="Mejor valorados", url= host + "/top-rated/")) - itemlist.append(Item(channel=item.channel, action="search", title="Buscar", url= host)) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "-") - item.url = host + "/search/%s/" % texto - try: - return videos(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def videos(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="item-block item-normal col".*?' - patron += '<a href="([^"]+)" title="([^"]+)">.*?' - patron += 'data-src="([^"]+)".*?' - patron += '</span> ([^"]+)<' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedtitle, scrapedthumbnail, scrapedtime in matches: - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - url = scrapedurl - thumbnail = scrapedthumbnail.replace(" ", "%20") - itemlist.append(Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail)) - next_page = scrapertools.find_single_match(data, "<a href='([^']+)' class=\"next\">NEXT</a>") - if next_page != "": - url = urlparse.urljoin(item.url, next_page) - itemlist.append(Item(channel=item.channel, action="videos", title=">> Página siguiente", url=url)) - return itemlist - - -def play(item): - logger.info() - data = httptools.downloadpage(item.url).data - media_url = "https:" + scrapertools.find_single_match(data, 'source src="([^"]+)"') - itemlist = [] - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=media_url, - thumbnail=item.thumbnail, show=item.title, server="directo", folder=False)) - return itemlist - diff --git a/channels/porn/sunporno.json b/channels/porn/sunporno.json deleted file mode 100644 index dff98bb7..00000000 --- a/channels/porn/sunporno.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "sunporno", - "name": "sunporno", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://sunstatic.fuckandcdn.com/sun/sunstatic/v31/common/sunporno/img/logo_top.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/sunporno.py b/channels/porn/sunporno.py deleted file mode 100644 index e9a0259f..00000000 --- a/channels/porn/sunporno.py +++ /dev/null @@ -1,119 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.sunporno.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host +"/most-recent/")) - itemlist.append( Item(channel=item.channel, title="Popular" , action="lista", url=host + "/most-viewed/date-last-week/")) - itemlist.append( Item(channel=item.channel, title="Mejor valorada" , action="lista", url=host + "/top-rated/date-last-week/")) - itemlist.append( Item(channel=item.channel, title="Mas largas" , action="lista", url=host + "/long-movies/date-last-month/")) - itemlist.append( Item(channel=item.channel, title="PornStars" , action="catalogo", url=host + "/pornstars/most-viewed/1/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/channels/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/%s/" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="thumb-container with-title moviec.*?' - patron += '<a href="([^"]+)".*?' - patron += 'src="([^"]+)".*?' - patron += '<a title="([^"]+)".*?' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - scrapedplot = "" - scrapedurl = scrapedurl + "/most-recent/" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="starec">.*?' - patron += '<a href="([^"]+)".*?' - patron += '<img class="thumb" src="([^"]+)" alt="([^"]+)".*?' - patron += '<p class="videos">(\d+)</p>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl, scrapedthumbnail, scrapedtitle, cantidad in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<li><a class="pag-next" href="(.*?)">Next ></a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel , action="catalogo", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - data = scrapertools.find_single_match(data,'class="thumbs-container">(.*?)<div class="clearfix">') - patron = '<p class="btime">([^"]+)</p>.*?' - patron += '>(.*?)<img width=.*?' - patron += '="([^"]+)" class="thumb.*?' - patron += 'title="([^"]+)".*?' - patron += 'href="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for duracion,calidad,scrapedthumbnail,scrapedtitle,scrapedurl in matches: - url = scrapedurl - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - if ">HD<" in calidad: - title = "[COLOR yellow]" + duracion + "[/COLOR] " + "[COLOR red]" + "HD" + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play" , title=title , url=url, thumbnail=thumbnail, - fanart=scrapedthumbnail, plot=plot, contentTitle = scrapedtitle)) - next_page = scrapertools.find_single_match(data,'<li><a class="pag-next" href="(.*?)">Next ></a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel , action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<video src="([^"]+)"' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl in matches: - scrapedurl = scrapedurl.replace("https:", "http:") - scrapedurl += "|Referer=%s" % host - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=scrapedurl, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - return itemlist - diff --git a/channels/porn/sxyprn.json b/channels/porn/sxyprn.json deleted file mode 100755 index 55157b53..00000000 --- a/channels/porn/sxyprn.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "sxyprn", - "name": "sxyprn", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://www.sxyprn.com/favicon.ico", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/sxyprn.py b/channels/porn/sxyprn.py deleted file mode 100755 index 8f68519b..00000000 --- a/channels/porn/sxyprn.py +++ /dev/null @@ -1,99 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,re -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.sxyprn.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/blog/all/0.html?fl=all&sm=latest")) - itemlist.append( Item(channel=item.channel, title="Mas vistos" , action="lista", url=host + "/popular/top-viewed.html")) - itemlist.append( Item(channel=item.channel, title="Mejor valorada" , action="lista", url=host + "/popular/top-rated.html")) - itemlist.append( Item(channel=item.channel, title="Sitios" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "-") - item.url = host + "/%s.html" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - if "Sitios" in item.title: - patron = "<a href='([^']+)' target='_blank'><div class='top_sub_el top_sub_el_sc'>.*?" - patron += "<span class='top_sub_el_key_sc'>([^<]+)</span>" - patron += "<span class='top_sub_el_count'>(\d+)</span>" - else: - patron = "<a class='tdn' href='([^']+)'.*?" - patron += "<span class='htag_el_tag'>([^<]+)</span>" - patron += "<span class='htag_el_count'>(\d+) videos</span>" - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - title = scrapedtitle + " (" + cantidad + ")" - itemlist.append( Item(channel=item.channel, action="lista", title=title, url=scrapedurl, - thumbnail=scrapedthumbnail , plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = "<img class=.*?" - patron += " src='([^']+)'.*?" - patron += "<span class='duration_small'.*?'>([^<]+)<.*?" - patron += "<span class='shd_small'.*?>([^<]+)<.*?" - patron += "post_time' href='([^']+)' title='([^']+)'" - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedthumbnail,scrapedtime,quality,scrapedurl,scrapedtitle in matches: - title = "[COLOR yellow]%s[/COLOR] [COLOR red]%s[/COLOR] %s" % (scrapedtime,quality,scrapedtitle) - thumbnail = "https:" + scrapedthumbnail - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - plot = "" - itemlist.append( Item(channel=item.channel, action="findvideos", title=title, url=scrapedurl, - thumbnail=thumbnail, fanart=thumbnail, plot=plot, contentTitle = scrapedtitle)) - # - next_page = scrapertools.find_single_match(data, "<div class='ctrl_el ctrl_sel'>.*?<a href='([^']+)'") - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="lista", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - - -def findvideos(item): - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|amp;|\s{2}| ", "", data) - url = scrapertools.find_single_match(data, 'data-vnfo=.*?":"([^"]+)"') - url = url.replace("\/", "/").replace("/cdn/", "/cdn7/") - url = urlparse.urljoin(item.url,url) - itemlist.append( Item(channel=item.channel, action="play", title = "%s " + url, url=url)) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - return itemlist - diff --git a/channels/porn/tabooshare.json b/channels/porn/tabooshare.json deleted file mode 100644 index 568b6953..00000000 --- a/channels/porn/tabooshare.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "tabooshare", - "name": "tabooshare", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://tabooshare.com/wp-content/uploads/2017/06/cropped-TSa-180x180.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/tabooshare.py b/channels/porn/tabooshare.py deleted file mode 100644 index e2bdd1c7..00000000 --- a/channels/porn/tabooshare.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import re - -from core import httptools -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import logger -from platformcode import config - -host = 'http://tabooshare.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Ultimos" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data,'<h3>Categories</h3>(.*?)</ul>') - patron = '<li class="cat-item cat-item-\d+"><a href="(.*?)" >(.*?)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedtitle = str(scrapedtitle) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, fanart=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="post" id="post-\d+">.*?<a href="([^"]+)" title="(.*?)"><img src="(.*?)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle.replace(" – Free Porn Download", "") - itemlist.append( Item(channel=item.channel, action="play", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, fanart=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<span class="current">.*?<a href="(.*?)"') - if next_page=="http://NaughtyPorn.net/": - next_page = scrapertools.find_single_match(data,'<span class="current">.*?<a href=\'(.*?)\'') - if next_page!="": - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - data = httptools.downloadpage(item.url).data - itemlist = servertools.find_video_items(data=data) - for videoitem in itemlist: - videoitem.title = item.title - videoitem.fulltitle = item.fulltitle - videoitem.thumbnail = item.thumbnail - videoitem.channel = item.channel - return itemlist - diff --git a/channels/porn/thumbzilla.json b/channels/porn/thumbzilla.json deleted file mode 100644 index fcce22f8..00000000 --- a/channels/porn/thumbzilla.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "id": "thumbzilla", - "name": "ThumbZilla", - "active": true, - "adult": true, - "language": "en", - "fanart": "https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/adults/xthearebg.jpg", - "thumbnail": "https://ci.phncdn.com/www-static/thumbzilla/images/pc/logo.png?cache=2018110203", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - { - "id": "modo_grafico", - "type": "bool", - "label": "Buscar información extra", - "default": true, - "enabled": true, - "visible": true - }, - { - "id": "perfil", - "type": "list", - "label": "Perfil de color", - "default": 3, - "enabled": true, - "visible": true, - "lvalues": [ - "Sin color", - "Perfil 3", - "Perfil 2", - "Perfil 1" - ] - } - ] -} diff --git a/channels/porn/thumbzilla.py b/channels/porn/thumbzilla.py deleted file mode 100644 index aab21aee..00000000 --- a/channels/porn/thumbzilla.py +++ /dev/null @@ -1,175 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urlparse - -from core import channeltools -from core import httptools -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from channelselector import get_thumb - -__channel__ = "thumbzilla" - -host = 'https://www.thumbzilla.com' -try: - __modo_grafico__ = config.get_setting('modo_grafico', __channel__) - __perfil__ = int(config.get_setting('perfil', __channel__)) -except: - __modo_grafico__ = True - __perfil__ = 0 - -# Fijar perfil de color -perfil = [['0xFF6E2802', '0xFFFAA171', '0xFFE9D7940'], - ['0xFFA5F6AF', '0xFF5FDA6D', '0xFF11811E'], - ['0xFF58D3F7', '0xFF2E64FE', '0xFF0404B4']] - -if __perfil__ - 1 >= 0: - color1, color2, color3 = perfil[__perfil__ - 1] -else: - color1 = color2 = color3 = "" - -headers = [['User-Agent', 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'], - ['Referer', host]] - -parameters = channeltools.get_channel_parameters(__channel__) -fanart_host = parameters['fanart'] -thumbnail_host = parameters['thumbnail'] -thumbnail = 'https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/adults/%s.png' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(Item(channel=__channel__, action="videos", title="Más Calientes", url=host, - viewmode="movie", thumbnail=get_thumb("adult.png"))) - - itemlist.append(Item(channel=__channel__, title="Nuevas", url=host + '/newest', - action="videos", viewmode="movie_with_plot", viewcontent='movies', - thumbnail=get_thumb("adult.png"))) - - itemlist.append(Item(channel=__channel__, title="Tendencias", url=host + '/tending', - action="videos", viewmode="movie_with_plot", viewcontent='movies', - thumbnail=get_thumb("adult.png"))) - - itemlist.append(Item(channel=__channel__, title="Mejores Videos", url=host + '/top', - action="videos", viewmode="movie_with_plot", viewcontent='movies', - thumbnail=get_thumb("adult.png"))) - - itemlist.append(Item(channel=__channel__, title="Populares", url=host + '/popular', - action="videos", viewmode="movie_with_plot", viewcontent='movies', - thumbnail=get_thumb("adult.png"))) - - itemlist.append(Item(channel=__channel__, title="Videos en HD", url=host + '/hd', - action="videos", viewmode="movie_with_plot", viewcontent='movies', - thumbnail=get_thumb("adult.png"))) - - itemlist.append(Item(channel=__channel__, title="Caseros", url=host + '/hd', - action="videos", viewmode="movie_with_plot", viewcontent='homemade', - thumbnail=get_thumb("adult.png"))) - - itemlist.append(Item(channel=__channel__, title="PornStar", action="catalogo", - url=host + '/pornstars/', viewmode="movie_with_plot", viewcontent='movies', - thumbnail=get_thumb("adult.png"))) - - itemlist.append(Item(channel=__channel__, title="Categorías", action="categorias", - url=host + '/categories/', viewmode="movie_with_plot", viewcontent='movies', - thumbnail=get_thumb("adult.png"))) - - itemlist.append(Item(channel=__channel__, title="Buscador", action="search", url=host, - thumbnail=get_thumb("adult.png"), extra="buscar")) - return itemlist - - -# REALMENTE PASA LA DIRECCION DE BUSQUEDA - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = urlparse.urljoin(item.url, "video/search?q={0}".format(texto)) - # item.url = item.url % tecleado - item.extra = "buscar" - try: - return videos(item) - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("{0}".format(line)) - return [] - - -def videos(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}| ", "", data) - patron = '<a class="[^"]+" href="([^"]+)">' # url - patron += '<img id="[^"]+".*?src="([^"]+)".*?' # img - patron += '<span class="title">([^<]+)</span>.*?' # title - patron += '<span class="duration"(.*?)</a>' # time - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl, scrapedthumbnail, scrapedtitle, scrapedtime in matches: - time = scrapertools.find_single_match(scrapedtime, '>([^<]+)</span>') - title = "[%s] %s" % (time, scrapedtitle) - if ">HD<" in scrapedtime: - title = "[COLOR yellow]" + time + "[/COLOR] " + "[COLOR red]" + "HD" + "[/COLOR] " + scrapedtitle - itemlist.append(Item(channel=item.channel, action='play', title=title, thumbnail=scrapedthumbnail, - url=host + scrapedurl, contentTile=scrapedtitle, fanart=scrapedthumbnail)) - paginacion = scrapertools.find_single_match(data, '<link rel="next" href="([^"]+)" />').replace('amp;', '') - if paginacion: - itemlist.append(Item(channel=item.channel, action="videos", - thumbnail=thumbnail % 'rarrow', - title="\xc2\xbb Siguiente \xc2\xbb", url=paginacion)) - return itemlist - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<li class="pornstars">.*?<a href="([^"]+)".*?' - patron += '<img src="([^"]+)" alt="([^"]+)"' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedthumbnail, scrapedtitle in matches: - url = urlparse.urljoin(item.url, scrapedurl) - itemlist.append(Item(channel=item.channel, action="videos", url=url, title=scrapedtitle, fanart=scrapedthumbnail, - thumbnail=scrapedthumbnail, viewmode="movie_with_plot")) - paginacion = scrapertools.find_single_match(data, '<link rel="next" href="([^"]+)" />').replace('amp;', '') - if paginacion: - itemlist.append(Item(channel=item.channel, action="catalogo", - thumbnail=thumbnail % 'rarrow', - title="\xc2\xbb Siguiente \xc2\xbb", url=paginacion)) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - # logger.info(data) - patron = 'class="checkHomepage"><a href="([^"]+)".*?' # url - patron += '<span class="count">([^<]+)</span>' # title, vids - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, vids in matches: - scrapedtitle = scrapedurl.replace('/categories/', '').replace('-', ' ').title() - title = "%s (%s)" % (scrapedtitle, vids.title()) - thumbnail = item.thumbnail - url = urlparse.urljoin(item.url, scrapedurl) - itemlist.append(Item(channel=item.channel, action="videos", fanart=thumbnail, - title=title, url=url, thumbnail=thumbnail, - viewmode="movie_with_plot", folder=True)) - return itemlist - - -def play(item): - itemlist = [] - data = httptools.downloadpage(item.url).data - url = scrapertools.find_single_match(data, '"quality":"[^"]+","videoUrl":"([^"]+)"').replace('\\', '') - itemlist.append(item.clone(url=url, title=item.contentTile)) - return itemlist - diff --git a/channels/porn/titsbox.json b/channels/porn/titsbox.json deleted file mode 100755 index 1262153a..00000000 --- a/channels/porn/titsbox.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "titsbox", - "name": "titsbox", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://titsbox.com/android-chrome-192x192.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/titsbox.py b/channels/porn/titsbox.py deleted file mode 100755 index d34d1f47..00000000 --- a/channels/porn/titsbox.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re - -from core import jsontools as json -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://titsbox.com' #titbox vivud zmovs - -url_api = host + "/?ajax=1&type=" - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=url_api + "most-recent&page=1")) - itemlist.append( Item(channel=item.channel, title="Mejor valorados" , action="lista", url=url_api + "top-rated&page=1")) - itemlist.append( Item(channel=item.channel, title="Mas vistos" , action="lista", url=url_api + "long&page=1")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data, '<ul class="sidebar-nav">(.*?)</ul>') - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<a class="category-item" href="([^"]+)">([^"]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - url = host + scrapedurl + "?ajax=1&type=most-recent&page=1" - scrapedplot = "" - thumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=url, - thumbnail=thumbnail , plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - JSONData = json.load(data) - for Video in JSONData["data"]: - duration = Video["duration"] - title = Video["videoTitle"] - title = "[COLOR yellow]%s[/COLOR] %s" % (duration,title) - src= Video["src"] - domain="" - thumbnail = src.get('domain', domain) + src.get('pathMedium', domain)+"1.jpg" - url= Video["urls_CDN"] - url= url.get('480', domain) - url = url.replace("/\n/", "/") - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot,)) - Actual = int(scrapertools.find_single_match(item.url, '&page=([0-9]+)')) - if JSONData["pagesLeft"] - 1 > Actual: - scrapedurl = item.url.replace("&page=" + str(Actual), "&page=" + str(Actual + 1)) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=scrapedurl)) - return itemlist - - -def findvideos(item): - return - diff --git a/channels/porn/tnaflix.json b/channels/porn/tnaflix.json deleted file mode 100644 index 94f6956e..00000000 --- a/channels/porn/tnaflix.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "tnaflix", - "name": "tnaflix", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://www.tnaflix.com/images/favicons/tnaflix/android-icon-192x192.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - - diff --git a/channels/porn/tnaflix.py b/channels/porn/tnaflix.py deleted file mode 100644 index 0df37291..00000000 --- a/channels/porn/tnaflix.py +++ /dev/null @@ -1,138 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools -from core import tmdb -from core import jsontools - -host = 'https://www.tnaflix.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="peliculas", url=host + "/new/?d=all&period=all")) - itemlist.append( Item(channel=item.channel, title="Popular" , action="peliculas", url=host + "/popular/?d=all&period=all")) - itemlist.append( Item(channel=item.channel, title="Mejor valorado" , action="peliculas", url=host + "/toprated/?d=all&period=month")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="catalogo", url=host + "/channels/all/top-rated/1/all")) - itemlist.append( Item(channel=item.channel, title="PornStars" , action="categorias", url=host + "/pornstars")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search.php?what=%s&tab=" % texto - try: - return peliculas(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="vidcountSp">(\d+)</div>.*?<a class="categoryTitle channelTitle" href="([^"]+)" title="([^"]+)">.*?data-original="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for cantidad,scrapedurl,scrapedtitle,scrapedthumbnail in matches: - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - title = scrapedtitle + " (" + cantidad + ")" - scrapedplot = "" - itemlist.append( Item(channel=item.channel, action="peliculas", title=title , url=scrapedurl , thumbnail=scrapedthumbnail , plot=scrapedplot , folder=True) ) - next_page_url = scrapertools.find_single_match(data,'<a class="llNav" href="([^"]+)">') - if next_page_url!="": - next_page_url = urlparse.urljoin(item.url,next_page_url) - itemlist.append( Item(channel=item.channel , action="catalogo" , title="Página Siguiente >>" , text_color="blue", url=next_page_url , folder=True) ) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - if item.title=="PornStars" : - data = scrapertools.find_single_match(data,'</i> Hall Of Fame Pornstars</h1>(.*?)</section>') - patron = '<a class="thumb" href="([^"]+)">.*?<img src="([^"]+)".*?<div class="vidcountSp">(.*?)</div>.*?<a class="categoryTitle".*?>([^"]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,cantidad,scrapedtitle in matches: - scrapedplot = "" - if item.title=="Categorias" : - scrapedthumbnail = "http:" + scrapedthumbnail - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - if item.title=="PornStars" : - scrapedurl = urlparse.urljoin(item.url,scrapedurl) + "?section=videos" - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - itemlist.append( Item(channel=item.channel, action="peliculas", title=scrapedtitle , url=scrapedurl , thumbnail=scrapedthumbnail , plot=scrapedplot , folder=True) ) - next_page_url = scrapertools.find_single_match(data,'<a class="llNav" href="([^"]+)">') - if next_page_url!="": - next_page_url = urlparse.urljoin(item.url,next_page_url) - itemlist.append( Item(channel=item.channel , action="categorias" , title="Página Siguiente >>" , text_color="blue", url=next_page_url , folder=True) ) - return itemlist - - -def peliculas(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a class=\'thumb no_ajax\' href=\'(.*?)\'.*?' - patron += 'data-original=\'(.*?)\' alt="([^"]+)"><div class=\'videoDuration\'>([^<]+)</div>(.*?)<div class=\'watchedInfo' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,duracion,quality in matches: - url = urlparse.urljoin(item.url,scrapedurl) - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - if quality: - quality= scrapertools.find_single_match(quality, '>(\d+p)<') - title = "[COLOR yellow]" + duracion + "[/COLOR] " + "[COLOR red]" + quality + "[/COLOR] " + scrapedtitle - contentTitle = title - thumbnail = scrapedthumbnail - plot = "" - itemlist.append(Item(channel=item.channel, action="play" , title=title , url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = contentTitle)) - next_page_url = scrapertools.find_single_match(data,'<a class="llNav" href="([^"]+)">') - if next_page_url!="": - next_page_url = urlparse.urljoin(item.url,next_page_url) - itemlist.append(item.clone(action="peliculas", title="Página Siguiente >>", text_color="blue", url=next_page_url) ) - return itemlist - - -def ref(url): - logger.info() - itemlist = [] - data = httptools.downloadpage(url).data - VID = scrapertools.find_single_match(data,'id="VID" type="hidden" value="([^"]+)"') - vkey = scrapertools.find_single_match(data,'id="vkey" type="hidden" value="([^"]+)"') - thumb = scrapertools.find_single_match(data,'id="thumb" type="hidden" value="([^"]+)"') - nkey= scrapertools.find_single_match(data,'id="nkey" type="hidden" value="([^"]+)"') - url = "https://cdn-fck.tnaflix.com/tnaflix/%s.fid?key=%s&VID=%s&nomp4=1&catID=0&rollover=1&startThumb=%s" % (vkey, nkey, VID, thumb) - url += "&embed=0&utm_source=0&multiview=0&premium=1&country=0user=0&vip=1&cd=0&ref=0&alpha" - return url - - -def play(item): - logger.info() - itemlist = [] - url= ref(item.url) - headers = {'Referer': item.url} - data = httptools.downloadpage(url, headers=headers).data - patron = '<res>(.*?)</res>.*?' - patron += '<videoLink><([^<]+)></videoLink>' - matches = scrapertools.find_multiple_matches(data, patron) - for title, url in matches: - url= url.replace("![CDATA[", "http:").replace("]]", "") - itemlist.append(["%s %s [directo]" % (title, url), url]) - itemlist.reverse() - return itemlist - - diff --git a/channels/porn/tryboobs.json b/channels/porn/tryboobs.json deleted file mode 100644 index 9fe3080f..00000000 --- a/channels/porn/tryboobs.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "tryboobs", - "name": "tryboobs", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://tb3.fuckandcdn.com/tb/tbstatic/v30/common/tryboobs/img/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/tryboobs.py b/channels/porn/tryboobs.py deleted file mode 100644 index 333751d3..00000000 --- a/channels/porn/tryboobs.py +++ /dev/null @@ -1,96 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://www.tryboobs.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Popular" , action="lista", url=host + "/most-popular/week/")) - itemlist.append( Item(channel=item.channel, title="Mejor Valorado" , action="lista", url=host + "/top-rated/week/")) - itemlist.append( Item(channel=item.channel, title="Modelos" , action="categorias", url=host + "/models/model-viewed/1/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/?q=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a href="([^"]+)" class="th-[^"]+">.*?' - patron += 'src="([^"]+)".*?' - patron += '<span>(\d+)</span>.*?' - patron += '<span class="title">([^"]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,cantidad,scrapedtitle in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<li><a class="pag-next" href="([^"]+)"><ins>Next</ins></a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="categorias", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = 'href="([^"]+)"\s*class="th-video.*?' - patron += '<img src="([^"]+)".*?' - patron += '<span class="time">([^"]+)</span>.*?' - patron += '<span class="title">([^"]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,duracion,scrapedtitle in matches: - url = scrapedurl - contentTitle = scrapedtitle - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play" , title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = contentTitle)) - next_page = scrapertools.find_single_match(data,'<li><a class="pag-next" href="([^"]+)"><ins>Next</ins></a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<video src="([^"]+)"' - matches = scrapertools.find_multiple_matches(data, patron) - for url in matches: - url += "|Referer=%s" % host - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=url, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - return itemlist - diff --git a/channels/porn/tubedupe.json b/channels/porn/tubedupe.json deleted file mode 100644 index 37fa768b..00000000 --- a/channels/porn/tubedupe.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "tubedupe", - "name": "tubedupe", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://tubedupe.com/apple-touch-icon-180x180-precomposed.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - - diff --git a/channels/porn/tubedupe.py b/channels/porn/tubedupe.py deleted file mode 100644 index 0897c8bb..00000000 --- a/channels/porn/tubedupe.py +++ /dev/null @@ -1,106 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://tubedupe.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/latest-updates/")) - itemlist.append( Item(channel=item.channel, title="Mejor valorados" , action="lista", url=host + "/top-rated/")) - itemlist.append( Item(channel=item.channel, title="Mas vistos" , action="lista", url=host + "/most-popular/")) - itemlist.append( Item(channel=item.channel, title="Modelos" , action="categorias", url=host + "/models/?sort_by=model_viewed")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="categorias", url=host + "/channels/?sort_by=cs_viewed")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/?sort_by=avg_videos_popularity")) - # itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/?q=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="block-[^"]+">.*?' - patron += '<a href="([^"]+)".*?title="([^"]+)".*?' - patron += 'src="([^"]+)".*?' - if '/models/' in item.url: - patron += '<span class="strong">Videos</span>(.*?)</div>' - else: - patron += '<var class="duree">([^"]+) </var>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle,scrapedthumbnail,cantidad in matches: - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - cantidad = cantidad.strip() - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - scrapedplot = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail,fanart=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data, '<li class="active">.*?<a href="([^"]+)" title="Page') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="categorias", title="Página Siguiente >>", text_color="blue", url=next_page ) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="block-video">.*?' - patron += '<a href="([^"]+)" class="[^"]+" title="([^"]+)">.*?' - patron += '<img src="([^"]+)".*?' - patron += '<var class="duree">(.*?)</var>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,scrapedtime in matches: - url = urlparse.urljoin(item.url,scrapedurl) - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail,plot=plot, contentTitle = title)) - next_page = scrapertools.find_single_match(data, '<li class="active">.*?<a href="([^"]+)" title="Page') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page ) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - scrapedurl = scrapertools.find_single_match(data, 'video_alt_url3: \'([^\']+)\'') - if scrapedurl == "" : - scrapedurl = scrapertools.find_single_match(data, 'video_alt_url2: \'([^\']+)\'') - if scrapedurl == "" : - scrapedurl = scrapertools.find_single_match(data, 'video_alt_url: \'([^\']+)\'') - if scrapedurl == "" : - scrapedurl = scrapertools.find_single_match(data, 'video_url: \'([^\']+)\'') - - itemlist.append(Item(channel=item.channel, action="play", title=scrapedurl, url=scrapedurl, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - return itemlist - - diff --git a/channels/porn/tubehentai.json b/channels/porn/tubehentai.json deleted file mode 100644 index 57321cbf..00000000 --- a/channels/porn/tubehentai.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "tubehentai", - "name": "tubehentai", - "active": true, - "adult": true, - "language": ["*"], - "banner": "tubehentai.png", - "thumbnail": "tubehentai.png", - "categories": [ - "adult" - ], - "settings": [ - ] -} \ No newline at end of file diff --git a/channels/porn/tubehentai.py b/channels/porn/tubehentai.py deleted file mode 100644 index 6352c943..00000000 --- a/channels/porn/tubehentai.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urlparse - -from core import httptools -from core import scrapertools -from core.item import Item -from platformcode import logger - -host = 'http://tubehentai.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(Item(channel=item.channel, title="Novedades", action="lista", url=host + "/most-recent/")) - itemlist.append(Item(channel=item.channel, title="Mas visto", action="lista", url=host + "/most-viewed/")) - itemlist.append(Item(channel=item.channel, title="Mejor valorado", action="lista", url=host + "/top-rated/")) - - itemlist.append(Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "%20") - item.url = host + "/search/%s/" % texto - try: - return lista(item) - # Se captura la excepciÛn, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<a href="((?:http|https)://tubehentai.com/video/[^"]+)" title="([^"]+)".*?' - patron += '<span class="icon -time">.*?<span class="item__stat-label">([^<]+)</span>.*?' - patron += '<img src="([^"]+)"' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,duration,scrapedthumbnail in matches: - title = "[COLOR yellow]" + duration + "[/COLOR] " + scrapedtitle - itemlist.append(Item(channel=item.channel, action="play", title=title, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail)) - next_page = scrapertools.find_single_match(data,'<a rel=\'next\' title=\'Next\' href=\'([^\']+)\'') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - url = scrapertools.find_single_match(data, '<source src="([^"]+\.mp4)"') - server = "Directo" - itemlist.append(Item(channel=item.channel, title="", url=url, server=server, folder=False)) - return itemlist - diff --git a/channels/porn/videosXYZ.json b/channels/porn/videosXYZ.json deleted file mode 100644 index b9726ca3..00000000 --- a/channels/porn/videosXYZ.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "videosXYZ", - "name": "videosXYZ", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://free-porn-videos.xyz/wp-content/uploads/2018/10/cropped-Logo-org-Free-porn-videos.xyz-app-icon-192x192.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/videosXYZ.py b/channels/porn/videosXYZ.py deleted file mode 100644 index 6f645dcf..00000000 --- a/channels/porn/videosXYZ.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://free-porn-videos.xyz' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url=host + "/topics/adult-movie/")) - itemlist.append( Item(channel=item.channel, title="Parody" , action="lista", url=host + "/topics/free-porn-parodies/")) - itemlist.append( Item(channel=item.channel, title="Videos" , action="lista", url=host + "/topics/porn-videos/")) - itemlist.append( Item(channel=item.channel, title="BigTits" , action="lista", url=host + "/?s=big+tit")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<article id="post-\d+".*?<a href="([^"]+)".*?data-src="([^"]+)".*?alt="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle.replace("Permalink to Watch ", "").replace("Porn Online", "").replace("Permalink to ", "") - itemlist.append( Item(channel=item.channel, action="play", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, fanart=scrapedthumbnail, contentTitle=scrapedtitle, plot=scrapedplot) ) - next_page_url = scrapertools.find_single_match(data,'<a class="nextpostslink" rel="next" href="([^"]+)">»</a>') - if next_page_url!="": - next_page_url = urlparse.urljoin(item.url,next_page_url) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page_url) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - scrapedurl = scrapertools.find_single_match(data,'<iframe src="([^"]+)"') - scrapedurl = scrapedurl.replace("%28", "(").replace("%29", ")") - itemlist = servertools.find_video_items(data=data) - for videoitem in itemlist: - videoitem.title = item.title - videoitem.thumbnail = item.thumbnail - videoitem.channel = item.channel - return itemlist - diff --git a/channels/porn/vidz7.json b/channels/porn/vidz7.json deleted file mode 100644 index ab0941f5..00000000 --- a/channels/porn/vidz7.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "vidz7", - "name": "Vidz7", - "active": true, - "adult": true, - "language": ["*"], - "banner": "https://www.dropbox.com/s/182r0wby3ohnxkc/bannermenu.jpg?dl=1", - "thumbnail": "https://www.dropbox.com/s/7z31b4ixve2ge0l/thumbnail.png?dl=1", - "categories": [ - "adult" - ], - "settings": [ - { - "id": "include_in_global_search", - "type": "bool", - "label": "Incluir en busqueda global", - "default": false, - "enabled": true, - "visible": true - } - ] -} \ No newline at end of file diff --git a/channels/porn/vidz7.py b/channels/porn/vidz7.py deleted file mode 100644 index de2cb712..00000000 --- a/channels/porn/vidz7.py +++ /dev/null @@ -1,94 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urlparse - -from core import httptools -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import logger - -host = 'http://www.vidz7.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(Item(channel=item.channel, action="lista", title="Útimos videos", url=host)) - itemlist.append( - Item(channel=item.channel, action="categorias", title="Canal", url=host + "/category/")) - itemlist.append(Item(channel=item.channel, action="search", title="Buscar", url="http://www.vidz7.com")) - return itemlist - - -def search(item, texto): - logger.info() - - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("{0}".format(line)) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}", "", data) - patron = '<li><a href="([^"]+)">([^<]+)</a><span>(\d+) </' - matches = re.compile(patron, re.DOTALL).findall(data) - for url, title, cantidad in matches: - title = title + " (" + cantidad + ")" - itemlist.append(Item(channel=item.channel, action="lista", title=title, url=url)) - - return itemlist - - -def lista(item): - logger.info() - # Descarga la página - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|\s{2}", "", data) - patron = "<a href='.*?.' class='thumb' style='background-image:url\(\"([^\"]+)\"\).*?" - patron += "<div class=\"hd\">(.*?)</div>.*?" - patron += "<div class=\"duration\">(.*?)</div>.*?" - patron += "<h6><a class='hp' href='([^']+)'>(.*?)</a></h6>" - matches = re.compile(patron, re.DOTALL).findall(data) - itemlist = [] - for scrapedthumbnail, scrapedhd, duration, scrapedurl, scrapedtitle in matches: - thumbnail = urlparse.urljoin(item.url, scrapedthumbnail) - url = urlparse.urljoin(item.url, scrapedurl) - scrapedtitle = scrapedtitle.strip() - title = "[COLOR yellow]" + duration + "[/COLOR] " + "[COLOR red]" +scrapedhd+ "[/COLOR] "+scrapedtitle - # Añade al listado - itemlist.append(Item(channel=item.channel, action="play", title=title, thumbnail=thumbnail, fanart=thumbnail, - contentTitle=title, url=url, - viewmode="movie", folder=True)) - paginacion = scrapertools.find_single_match(data,'<a class="active".*?.>\d+</a><a class="inactive" href ="([^"]+)">') - if paginacion: - itemlist.append(Item(channel=item.channel, action="lista", title=">> Página Siguiente", url=paginacion)) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - # Descarga la página - data = httptools.downloadpage(item.url).data - data = scrapertools.unescape(data) - itemlist.extend(servertools.find_video_items(data=data)) - for videoitem in itemlist: - videoitem.thumbnail = item.thumbnail - videoitem.channel = item.channel - videoitem.action = "play" - videoitem.folder = False - videoitem.title = item.title - return itemlist - diff --git a/channels/porn/vintagetube.json b/channels/porn/vintagetube.json deleted file mode 100644 index ddf36990..00000000 --- a/channels/porn/vintagetube.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "vintagetube", - "name": "vintagetube", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.vintagexxxsex.com/images/vintagexxxsex.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/vintagetube.py b/channels/porn/vintagetube.py deleted file mode 100644 index fafe7f37..00000000 --- a/channels/porn/vintagetube.py +++ /dev/null @@ -1,98 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://www.vintagetube.club' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Ultimos" , action="peliculas", url=host + "/tube/last-1/")) - itemlist.append( Item(channel=item.channel, title="Popular" , action="peliculas", url=host + "/tube/popular-1/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/%s" % texto - item.url = item.url + "/popular-1/" - try: - return peliculas(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="prev prev-ct">.*?' - patron += '<a href="([^"]+)">.*?' - patron += '<img src="([^"]+)".*?' - patron += '<span class="prev-tit">([^"]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - scrapedplot = "" - scrapedurl = host + scrapedurl - itemlist.append( Item(channel=item.channel, action="peliculas", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, fanart=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def peliculas(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="prev">.*?' - patron += '<a href="([^"]+)">.*?' - patron += '<img src="([^"]+)">.*?' - patron += '<span class="prev-tit">([^"]+)</span>.*?' - patron += '<div class="prev-dur"><span>([^"]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,scrapedtime in matches: - scrapedplot = "" - scrapedtitle = "[COLOR yellow]" + (scrapedtime) + "[/COLOR] " + str(scrapedtitle) - scrapedurl = scrapedurl.replace("/xxx.php?tube=", "") - scrapedurl = host + scrapedurl - itemlist.append( Item(channel=item.channel, action="play", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, fanart=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<span class="page">.*?<a target="_self" href="([^"]+)"') - - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="peliculas", title="Página Siguiente >>", text_color="blue", url=next_page) ) - - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - scrapedurl = scrapertools.find_single_match(data,'<iframe frameborder=0 scrolling="no" src=\'(.*?)\'') - if scrapedurl == "": - scrapedurl = scrapertools.find_single_match(data,'<iframe src="([^"]+)"') - data = httptools.downloadpage(scrapedurl).data - else: - data = httptools.downloadpage(scrapedurl).data - scrapedurl = scrapertools.find_single_match(data,'<iframe src="([^"]+)"') - data = httptools.downloadpage("https:" + scrapedurl).data - scrapedurl = scrapertools.find_single_match(data,'<source src="([^"]+)"') - itemlist = [] - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=scrapedurl, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - return itemlist - diff --git a/channels/porn/vintagexxxsex.json b/channels/porn/vintagexxxsex.json deleted file mode 100644 index 6c51cae5..00000000 --- a/channels/porn/vintagexxxsex.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "vintagexxxsex", - "name": "vintagexxxsex", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.vintagexxxsex.com/images/vintagexxxsex.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/vintagexxxsex.py b/channels/porn/vintagexxxsex.py deleted file mode 100644 index b7afa813..00000000 --- a/channels/porn/vintagexxxsex.py +++ /dev/null @@ -1,95 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://www.vintagexxxsex.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Top" , action="lista", url=host + "/all-top/1/")) - itemlist.append( Item(channel=item.channel, title="Novedades" , action="lista", url=host + "/all-new/1/")) - itemlist.append( Item(channel=item.channel, title="Longitud" , action="lista", url=host + "/all-longest/1/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<li><a href="([^"]+)"><i class="fa fa-tag"></i>(.*?)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedurl = host + scrapedurl - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="th">.*?' - patron += '<a href="([^"]+)".*?' - patron += '<img src="([^"]+)".*?' - patron += '<span class="th_nm">([^"]+)</span>.*?' - patron += '<i class="fa fa-clock-o"></i>([^"]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,time in matches: - contentTitle = scrapedtitle - title = "[COLOR yellow]" + time + " [/COLOR]" + scrapedtitle - scrapedurl = scrapedurl.replace("/up.php?xxx=", "") - scrapedurl = host + scrapedurl - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play" , title=title , url=scrapedurl, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle=contentTitle)) - next_page = scrapertools.find_single_match(data,'<li><span class="pg_nm">\d+</span></li>.*?href="([^"]+)"') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - scrapedurl = scrapertools.find_single_match(data,'<iframe src="([^"]+)"') - data = httptools.downloadpage(scrapedurl).data - scrapedurl = scrapertools.find_single_match(data,'<source src="([^"]+)"') - if scrapedurl == "": - scrapedurl = "http:" + scrapertools.find_single_match(data,'<iframe src="([^"]+)"') - data = httptools.downloadpage(scrapedurl).data - scrapedurl = scrapertools.find_single_match(data,'file: "([^"]+)"') - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=scrapedurl, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - return itemlist - diff --git a/channels/porn/vivud.json b/channels/porn/vivud.json deleted file mode 100755 index 7b70e238..00000000 --- a/channels/porn/vivud.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "vivud", - "name": "vivud", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://vivud.com/favicon-96x96.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/vivud.py b/channels/porn/vivud.py deleted file mode 100755 index 02d6b015..00000000 --- a/channels/porn/vivud.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re - -from core import jsontools as json -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://vivud.com' #titbox vivud zmovs - -url_api = host + "/?ajax=1&type=" - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=url_api + "most-recent&page=1")) - itemlist.append( Item(channel=item.channel, title="Mejor valorados" , action="lista", url=url_api + "top-rated&page=1")) - itemlist.append( Item(channel=item.channel, title="Longitud" , action="lista", url=url_api + "long&page=1")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data, '<ul class="sidebar-nav">(.*?)</ul>') - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<a class="category-item" href="([^"]+)">([^"]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - url = host + scrapedurl + "?ajax=1&type=most-recent&page=1" - scrapedplot = "" - thumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=url, - thumbnail=thumbnail , plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - JSONData = json.load(data) - for Video in JSONData["data"]: - duration = Video["duration"] - title = Video["videoTitle"] - title = "[COLOR yellow]%s[/COLOR] %s" % (duration,title) - src= Video["src"] - domain="" - thumbnail = src.get('domain', domain) + src.get('pathMedium', domain)+"1.jpg" - url= Video["urls_CDN"] - url= url.get('480', domain) - url = url.replace("/\n/", "/") - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot,)) - Actual = int(scrapertools.find_single_match(item.url, '&page=([0-9]+)')) - if JSONData["pagesLeft"] - 1 > Actual: - scrapedurl = item.url.replace("&page=" + str(Actual), "&page=" + str(Actual + 1)) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=scrapedurl)) - return itemlist - - -def findvideos(item): - return - diff --git a/channels/porn/vporn.json b/channels/porn/vporn.json deleted file mode 100644 index d33ff5f9..00000000 --- a/channels/porn/vporn.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "vporn", - "name": "vporn", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://th-eu1.vporn.com/images/logo-dark-theme.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/vporn.py b/channels/porn/vporn.py deleted file mode 100644 index 65727102..00000000 --- a/channels/porn/vporn.py +++ /dev/null @@ -1,121 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import jsontools as json -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'https://www.vporn.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Novedades" , action="lista", url=host + "/newest/month/")) - itemlist.append( Item(channel=item.channel, title="Mas Vistas" , action="lista", url=host + "/views/month/")) - itemlist.append( Item(channel=item.channel, title="Mejor Valoradas" , action="lista", url=host + "/rating/month/")) - itemlist.append( Item(channel=item.channel, title="Favoritas" , action="lista", url=host + "/favorites/month/")) - itemlist.append( Item(channel=item.channel, title="Mas Votada" , action="lista", url=host + "/votes/month/")) - itemlist.append( Item(channel=item.channel, title="Longitud" , action="lista", url=host + "/longest/month/")) - itemlist.append( Item(channel=item.channel, title="PornStar" , action="catalogo", url=host + "/pornstars/")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search?q=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class=\'star\'>.*?' - patron += '<a href="([^"]+)".*?' - patron += '<img src="([^"]+)" alt="([^"]+)".*?' - patron += '<span> (\d+) Videos' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - scrapedurl = host + scrapedurl - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<a class="next" href="([^"]+)">') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="catalogo", title="Next page >>", text_color="blue", url=next_page) ) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '"name":"([^"]+)".*?' - patron += '"image":"([^"]+)".*?' - patron += '"url":"([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedtitle,scrapedthumbnail,scrapedurl in matches: - scrapedplot = "" - scrapedthumbnail = "https://th-us2.vporn.com" + scrapedthumbnail - scrapedthumbnail= scrapedthumbnail.replace("\/", "/") - scrapedurl = host + scrapedurl - scrapedurl = scrapedurl.replace("\/", "/") - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="video">.*?' - patron += '<a href="([^"]+)".*?' - patron += '<span class="time">(.*?)</span>(.*?)</span>.*?' - patron += '<img src="([^"]+)" alt="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,time,calidad,scrapedthumbnail,scrapedtitle in matches: - scrapedtitle = scrapedtitle.replace(", ", " & ").replace("(", "(").replace(")", ")") - title = "[COLOR yellow]" + time + " [/COLOR]" + scrapedtitle - if "hd-marker is-hd" in calidad: - title = "[COLOR yellow]" + time + " [/COLOR]" + "[COLOR red]" + "HD" + " [/COLOR]" + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play" , title=title , url=scrapedurl, - fanart=thumbnail, thumbnail=thumbnail, plot=plot, contentTitle = title)) - next_page = scrapertools.find_single_match(data,'<a class="next.*?title="Next Page" href="([^"]+)">') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Next page >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<source src="([^"]+)" type="video/mp4" label="([^"]+)"' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl,scrapedtitle in matches: - itemlist.append(item.clone(action="play", title=scrapedtitle, url=scrapedurl)) - return itemlist - diff --git a/channels/porn/watchpornfree.json b/channels/porn/watchpornfree.json deleted file mode 100644 index f5f9b0a9..00000000 --- a/channels/porn/watchpornfree.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "watchpornfree", - "name": "watchpornfree", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://watchpornfree.info/wp-content/uploads/2019/01/favicon.ico", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/watchpornfree.py b/channels/porn/watchpornfree.py deleted file mode 100644 index 73d14f7f..00000000 --- a/channels/porn/watchpornfree.py +++ /dev/null @@ -1,77 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -# https://playpornfree.org/ https://mangoporn.net/ https://watchfreexxx.net/ https://losporn.org/ https://xxxstreams.me/ https://speedporn.net/ - -host = 'https://watchpornfree.info' - -def mainlist(item): - logger.info("") - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Videos" , action="lista", url=host + "/category/clips-scenes")) - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Parodia" , action="lista", url=host + "/category/parodies")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Año" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info("") - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info("") - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - if item.title == "Canal": - data = scrapertools.find_single_match(data,'Scenes</a></li>(.*?)</ul>') - if item.title == "Año": - data = scrapertools.find_single_match(data,'Year</a>(.*?)</ul>') - if item.title == "Categorias": - data = scrapertools.find_single_match(data,'>Categories</div>(.*?)</ul>') - patron = '<a href="([^"]+)".*?>([^"]+)</a></li>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - -def lista(item): - logger.info("") - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<article class="TPost B">.*?<a href="([^"]+)">.*?src="([^"]+)".*?<div class="Title">([^"]+)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle in matches: - scrapedplot = "" - itemlist.append( Item(channel=item.channel, action="findvideos", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<a class="next page-numbers" href="([^"]+)">Next »</a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - diff --git a/channels/porn/webpeliculasporno.json b/channels/porn/webpeliculasporno.json deleted file mode 100644 index a048c974..00000000 --- a/channels/porn/webpeliculasporno.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "webpeliculasporno", - "name": "webpeliculasporno", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://www.webpeliculasporno.com/wp-content/uploads/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/webpeliculasporno.py b/channels/porn/webpeliculasporno.py deleted file mode 100644 index e49a51f6..00000000 --- a/channels/porn/webpeliculasporno.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- -# ------------------------------------------------------------ -import re - -import urlparse - -from core import httptools -from core import scrapertools -from core.item import Item -from platformcode import logger -from platformcode import config - -host = 'http://www.webpeliculasporno.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(Item(channel=item.channel, title="Ultimas", action="lista", url=host)) - itemlist.append( - Item(channel=item.channel, title="Mas vistas", action="lista", url=host + "/?display=tube&filtre=views")) - itemlist.append( - Item(channel=item.channel, title="Mejor valoradas", action="lista", url=host + "/?display=tube&filtre=rate")) - itemlist.append(Item(channel=item.channel, title="Categorias", action="categorias", url=host)) - itemlist.append(Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<li class="cat-item [^>]+><a href="([^"]+)" >([^<]+)' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - itemlist.append(Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot)) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<li class="border-radius-5 box-shadow">.*?' - patron += 'src="([^"]+)".*?' - patron += '<a href="([^"]+)" title="([^"]+)">' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedthumbnail, scrapedurl, scrapedtitle in matches: - url = urlparse.urljoin(item.url, scrapedurl) - title = scrapedtitle - contentTitle = title - thumbnail = scrapedthumbnail - plot = "" - itemlist.append(Item(channel=item.channel, action="findvideos", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle=contentTitle)) - next_page = scrapertools.find_single_match(data, '<li><a class="next page-numbers" href="([^"]+)">Next') - if next_page != "": - next_page = urlparse.urljoin(item.url, next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page)) - return itemlist diff --git a/channels/porn/woodrocket.json b/channels/porn/woodrocket.json deleted file mode 100644 index 02ea74a1..00000000 --- a/channels/porn/woodrocket.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "woodrocket", - "name": "woodrocket", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://woodrocket.com/img//logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/woodrocket.py b/channels/porn/woodrocket.py deleted file mode 100644 index f24640e4..00000000 --- a/channels/porn/woodrocket.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://woodrocket.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Novedades" , action="lista", url=host + "/porn")) - itemlist.append( Item(channel=item.channel, title="Parodias" , action="lista", url=host + "/parodies")) - itemlist.append( Item(channel=item.channel, title="Shows" , action="categorias", url=host + "/series")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories")) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="media-panel-image">.*?<img src="(.*?)".*?<a href="(.*?)">(.*?)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedthumbnail,scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = host + scrapedthumbnail - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="media-panel-image">.*?<a href="([^"]+)".*?title="([^"]+)".*?<img src="([^"]+)"' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail in matches: - plot = "" - contentTitle = scrapedtitle - thumbnail = urlparse.urljoin(item.url,scrapedthumbnail) - title = scrapedtitle - year = "" - itemlist.append( Item(channel=item.channel, action="play" , title=title , url=scrapedurl, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = contentTitle)) - next_page = scrapertools.find_single_match(data,'<li><a href="([^"]+)" rel="next">»</a></li>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - url = scrapertools.find_single_match(data,'<iframe src="([^"]+)"') - itemlist.append(item.clone(action="play", title= "%s", url=url)) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - return itemlist - diff --git a/channels/porn/x18hentai.json b/channels/porn/x18hentai.json deleted file mode 100644 index b23b8dd8..00000000 --- a/channels/porn/x18hentai.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "x18hentai", - "name": "18HentaiOnline", - "active": true, - "adult": true, - "language": ["*"], - "banner": "https://s32.postimg.cc/lafs9vgxh/18hentaionline_banner.png", - "thumbnail": "https://s32.postimg.cc/fui7jdg9x/18hentaionline.png", - "categories": [ - "adult" - ], - "settings": [ - { - "id": "include_in_global_search", - "type": "bool", - "label": "Incluir en busqueda global", - "default": false, - "enabled": false, - "visible": false - } - ] -} \ No newline at end of file diff --git a/channels/porn/x18hentai.py b/channels/porn/x18hentai.py deleted file mode 100644 index db4b37ec..00000000 --- a/channels/porn/x18hentai.py +++ /dev/null @@ -1,151 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from core import httptools -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import logger -from platformcode import config - -host = 'http://www.18hentaionline.net/' -headers = [['User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'], - ['Referer', host]] - - -def mainlist(item): - logger.info() - - itemlist = [] - - itemlist.append(Item(channel=item.channel, title="Todos", action="todas", url=host, thumbnail='', fanart='')) - - itemlist.append( - Item(channel=item.channel, title="Sin Censura", action="todas", url=host + '/tag/sin-censura/', thumbnail='', - fanart='')) - - itemlist.append( - Item(channel=item.channel, title="Estrenos", action="todas", url=host + '/category/estreno/', thumbnail='', - fanart='')) - - itemlist.append( - Item(channel=item.channel, title="Categorias", action="categorias", url=host, thumbnail='', fanart='')) - - return itemlist - - -def todas(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url, headers=headers).data - patron = '<h3><a href="([^"]+)" title="([^"]+)">.*?<\/a><\/h3>.*?' - patron += '<.*?>.*?' - patron += '<a.*?img src="([^"]+)" alt' - - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedtitle, scrapedthumbnail in matches: - url = scrapedurl - title = scrapedtitle.decode('utf-8') - thumbnail = scrapedthumbnail - fanart = '' - itemlist.append( - Item(channel=item.channel, action="episodios", title=title, url=url, thumbnail=thumbnail, fanart=fanart)) - - # Paginacion - title = '' - siguiente = scrapertools.find_single_match(data, - '<a rel="nofollow" class="next page-numbers" href="([^"]+)">Siguiente »<\/a><\/div>') - title = 'Pagina Siguiente >>> ' - fanart = '' - itemlist.append(Item(channel=item.channel, action="todas", title=title, url=siguiente, fanart=fanart)) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = item.url + texto - - if texto != '': - return todas(item) - else: - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url, headers=headers).data - patron = "<a href='([^']+)' class='tag-link-.*? tag-link-position-.*?' title='.*?' style='font-size: 11px;'>([^<]+)<\/a>" - - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedurl, scrapedtitle in matches: - url = scrapedurl - title = scrapedtitle - itemlist.append(Item(channel=item.channel, action="todas", title=title, fulltitle=item.fulltitle, url=url)) - - return itemlist - - -def episodios(item): - censura = {'Si': 'con censura', 'No': 'sin censura'} - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url, headers=headers).data - old_mode = scrapertools.find_single_match(data, '<th>Censura<\/th>') - if old_mode: - patron = '<td>(\d+)<\/td><td>(.*?)<\/td><td>(.*?)<\/td><td>(.*?)<\/td><td><a href="(.*?)".*?>Ver Capitulo<\/a><\/td>' - - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedcap, scrapedaud, scrapedsub, scrapedcen, scrapedurl in matches: - url = scrapedurl - title = 'CAPITULO ' + scrapedcap + ' AUDIO: ' + scrapedaud + ' SUB:' + scrapedsub + ' ' + censura[scrapedcen] - thumbnail = '' - plot = '' - fanart = '' - itemlist.append(Item(channel=item.channel, action="findvideos", title=title, fulltitle=item.fulltitle, url=url, - thumbnail=item.thumbnail, plot=plot)) - else: - patron = '<\/i>.*?(.\d+)<\/td><td style="text-align:center">MP4<\/td><td style="text-align:center">(.*?)<\/td>.*?' - patron +='<a class="dr-button" href="(.*?)" >' - - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedcap, scrapedsub, scrapedurl in matches: - url = scrapedurl - if scrapedsub !='': - subs= scrapedsub - else: - sub = 'No' - title = 'CAPITULO %s SUB %s'%(scrapedcap, subs) - thumbnail = '' - plot = '' - fanart = '' - itemlist.append(Item(channel=item.channel, action="findvideos", title=title, fulltitle=item.fulltitle, url=url, - thumbnail=item.thumbnail, plot=plot)) - - return itemlist - -def findvideos(item): - logger.info() - - itemlist = [] - data = httptools.downloadpage(item.url).data - gvideo = scrapertools.find_single_match(data,'<li rel="(http:\/\/www\.18hentaionline\.net\/ramus\/phar\.php\?vid=.*?)">') - headers = {'Host':'www.18hentaionline.net', 'Referer':item.url} - gvideo_data = httptools.downloadpage(gvideo, headers = headers).data - gvideo_url = scrapertools.find_single_match(gvideo_data, 'file: "(.*?)"') - server = 'directo' - new_item = (item.clone(url=gvideo_url, server=server)) - itemlist.append(new_item) - itemlist.extend(servertools.find_video_items(data=data)) - for videoitem in itemlist: - videoitem.channel = item.channel - videoitem.title = item.title+' (%s)'%videoitem.server - videoitem.action = 'play' - return itemlist - - diff --git a/channels/porn/xhamster.json b/channels/porn/xhamster.json deleted file mode 100644 index 54d9f88c..00000000 --- a/channels/porn/xhamster.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "xhamster", - "name": "xhamster", - "active": true, - "adult": true, - "language": ["*"], - "banner": "xhamster.png", - "thumbnail": "xhamster.png", - "categories": [ - "adult" - ], - "settings": [ - { - "id": "include_in_global_search", - "type": "bool", - "label": "Incluir en busqueda global", - "default": true, - "enabled": true, - "visible": true - } - ] -} \ No newline at end of file diff --git a/channels/porn/xhamster.py b/channels/porn/xhamster.py deleted file mode 100644 index c9020a97..00000000 --- a/channels/porn/xhamster.py +++ /dev/null @@ -1,155 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import sys -import urlparse - -from platformcode import logger -from core import scrapertools, httptools -from core.item import Item - -HOST = "http://es.xhamster.com/" - - -def mainlist(item): - logger.info() - - itemlist = [] - itemlist.append(Item(channel=item.channel, action="videos", title="Útimos videos", url=HOST, viewmode="movie")) - itemlist.append(Item(channel=item.channel, action="categorias", title="Categorías", url=HOST)) - itemlist.append(Item(channel=item.channel, action="votados", title="Lo mejor")) - itemlist.append(Item(channel=item.channel, action="vistos", title="Los mas vistos")) - itemlist.append(Item(channel=item.channel, action="videos", title="Recomendados", - url=urlparse.urljoin(HOST, "/videos/recommended"))) - itemlist.append( - Item(channel=item.channel, action="search", title="Buscar", url=urlparse.urljoin(HOST, "/search?q=%s"))) - - return itemlist - - -# REALMENTE PASA LA DIRECCION DE BUSQUEDA - - -def search(item, texto): - logger.info() - tecleado = texto.replace(" ", "+") - item.url = item.url % tecleado - item.extra = "buscar" - try: - return videos(item) - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -# SECCION ENCARGADA DE BUSCAR - - -def videos(item): - logger.info() - data = httptools.downloadpage(item.url).data - itemlist = [] - - data = scrapertools.find_single_match(data, '<article.+?>(.*?)</article>') - - # Patron - patron = '(?s)<div class="thumb-list__item.*?href="([^"]+)".*?src="([^"]+)".*?alt="([^"]+)">.*?' - patron += '<div class="thumb-image-container__duration">(.+?)</div>' - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedurl, scrapedthumbnail, scrapedtitle, duration in matches: - # logger.debug("title=["+scrapedtitle+"], url=["+scrapedurl+"], thumbnail=["+scrapedthumbnail+"]") - contentTitle = scrapedtitle.strip() + " [" + duration + "]" - itemlist.append( - Item(channel=item.channel, action="play", title=contentTitle, url=scrapedurl, thumbnail=scrapedthumbnail, - folder=True)) - - # Paginador - patron = '(?s)<div class="pager-container".*?<li class="next">.*?href="([^"]+)"' - matches = re.compile(patron, re.DOTALL).findall(data) - if len(matches) > 0: - itemlist.append( - Item(channel=item.channel, action="videos", title="Página Siguiente", url=matches[0], thumbnail="", - folder=True, viewmode="movie")) - - return itemlist - - -# SECCION ENCARGADA DE VOLCAR EL LISTADO DE CATEGORIAS CON EL LINK CORRESPONDIENTE A CADA PAGINA - - -def categorias(item): - logger.info() - itemlist = [] - - data = httptools.downloadpage(item.url).data - - data = scrapertools.find_single_match(data, '(?s)<div class="all-categories">(.*?)</aside>') - - patron = '(?s)<li>.*?<a href="([^"]+)".*?>([^<]+).*?</a></li>' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedtitle in matches: - contentTitle = scrapedtitle.strip() - itemlist.append(Item(channel=item.channel, action="videos", title=contentTitle, url=scrapedurl)) - - return itemlist - - -def votados(item): - logger.info() - itemlist = [] - - itemlist.append(Item(channel=item.channel, action="videos", title="Día", url=urlparse.urljoin(HOST, "/best/daily"), - viewmode="movie")) - itemlist.append( - Item(channel=item.channel, action="videos", title="Semana", url=urlparse.urljoin(HOST, "/best/weekly"), - viewmode="movie")) - itemlist.append( - Item(channel=item.channel, action="videos", title="Mes", url=urlparse.urljoin(HOST, "/best/monthly"), - viewmode="movie")) - itemlist.append( - Item(channel=item.channel, action="videos", title="De siempre", url=urlparse.urljoin(HOST, "/best/"), - viewmode="movie")) - return itemlist - - -def vistos(item): - logger.info() - itemlist = [] - - itemlist.append( - Item(channel=item.channel, action="videos", title="Día", url=urlparse.urljoin(HOST, "/most-viewed/daily"), - viewmode="movie")) - itemlist.append( - Item(channel=item.channel, action="videos", title="Semana", url=urlparse.urljoin(HOST, "/most-viewed/weekly"), - viewmode="movie")) - itemlist.append( - Item(channel=item.channel, action="videos", title="Mes", url=urlparse.urljoin(HOST, "/most-viewed/monthly"), - viewmode="movie")) - itemlist.append( - Item(channel=item.channel, action="videos", title="De siempre", url=urlparse.urljoin(HOST, "/most-viewed/"), - viewmode="movie")) - - return itemlist - - -# OBTIENE LOS ENLACES SEGUN LOS PATRONES DEL VIDEO Y LOS UNE CON EL SERVIDOR -def play(item): - logger.info() - itemlist = [] - - data = httptools.downloadpage(item.url).data - logger.debug(data) - - patron = '"([0-9]+p)":"([^"]+)"' - matches = re.compile(patron, re.DOTALL).findall(data) - - for res, url in matches: - url = url.replace("\\", "") - logger.debug("url=" + url) - itemlist.append(["%s %s [directo]" % (res, scrapertools.get_filename_from_url(url)[-4:]), url]) - - return itemlist diff --git a/channels/porn/xms.json b/channels/porn/xms.json deleted file mode 100644 index 64e505cd..00000000 --- a/channels/porn/xms.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "id": "xms", - "name": "XMS", - "active": true, - "adult": true, - "language": ["*"], - "fanart": "https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/adults/xthearebg.jpg", - "thumbnail": "https://i.postimg.cc/wB0NsMTX/xms.png", - "banner": "https://i.postimg.cc/c6yh5C3K/xmsbn.png", - "categories": [ - "adult" - ], - "settings": [ - { - "id": "modo_grafico", - "type": "bool", - "label": "Buscar información extra", - "default": true, - "enabled": true, - "visible": true - }, - { - "id": "perfil", - "type": "list", - "label": "Perfil de color", - "default": 3, - "enabled": true, - "visible": true, - "lvalues": [ - "Sin color", - "Perfil 3", - "Perfil 2", - "Perfil 1" - ] - } - ] -} diff --git a/channels/porn/xms.py b/channels/porn/xms.py deleted file mode 100644 index 7fa51198..00000000 --- a/channels/porn/xms.py +++ /dev/null @@ -1,246 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import urlparse -import base64 - -from core import channeltools -from core import httptools -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger - -__channel__ = "xms" - -host = 'https://xtheatre.org/' -host1 = 'https://www.cam4.com/' -try: - __modo_grafico__ = config.get_setting('modo_grafico', __channel__) - __perfil__ = int(config.get_setting('perfil', __channel__)) -except: - __modo_grafico__ = True - __perfil__ = 0 - -# Fijar perfil de color -perfil = [['0xFF6E2802', '0xFFFAA171', '0xFFE9D7940'], - ['0xFFA5F6AF', '0xFF5FDA6D', '0xFF11811E'], - ['0xFF58D3F7', '0xFF2E64FE', '0xFF0404B4']] - -if __perfil__ - 1 >= 0: - color1, color2, color3 = perfil[__perfil__ - 1] -else: - color1 = color2 = color3 = "" - -headers = [['User-Agent', 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'], - ['Referer', host]] - -parameters = channeltools.get_channel_parameters(__channel__) -fanart_host = parameters['fanart'] -thumbnail_host = parameters['thumbnail'] -thumbnail = 'https://raw.githubusercontent.com/Inter95/tvguia/master/thumbnails/adults/%s.png' - - -def mainlist(item): - logger.info() - itemlist = [] - - itemlist.append(Item(channel=__channel__, title="Últimas", url=host + '?filtre=date&cat=0', - action="peliculas", viewmode="movie_with_plot", viewcontent='movies', - thumbnail=thumbnail % '1')) - - itemlist.append(Item(channel=__channel__, title="Más Vistas", url=host + '?display=extract&filtre=views', - action="peliculas", viewmode="movie_with_plot", viewcontent='movies', - thumbnail=thumbnail % '2')) - - itemlist.append(Item(channel=__channel__, title="Mejor Valoradas", url=host + '?display=extract&filtre=rate', - action="peliculas", viewmode="movie_with_plot", viewcontent='movies', - thumbnail=thumbnail % '3')) - - itemlist.append(Item(channel=__channel__, title="Categorías", action="categorias", - url=host + 'categories/', viewmode="movie_with_plot", viewcontent='movies', - thumbnail=thumbnail % '4')) - - itemlist.append(Item(channel=__channel__, title="WebCam", action="webcamenu", - viewmode="movie_with_plot", viewcontent='movies', - thumbnail='https://ae01.alicdn.com/kf/HTB1LDoiaHsrBKNjSZFpq6AXhFXa9/-.jpg')) - - itemlist.append(Item(channel=__channel__, title="Buscador", action="search", url=host, thumbnail=thumbnail % '5')) - - return itemlist - - -def webcamenu(item): - logger.info() - itemlist = [item.clone(title="Trending Cams", action="webcam", text_blod=True, url=host1, - viewcontent='movies', viewmode="movie_with_plot"), - item.clone(title="Females", action="webcam", text_blod=True, - viewcontent='movies', url=host1 + 'female', viewmode="movie_with_plot"), - item.clone(title="Males", action="webcam", text_blod=True, - viewcontent='movies', url=host1 + 'male', viewmode="movie_with_plot"), - item.clone(title="Couples", action="webcam", text_blod=True, - viewcontent='movies', url=host1 + 'couple', viewmode="movie_with_plot"), - item.clone(title="Trans", action="webcam", text_blod=True, extra="Películas Por año", - viewcontent='movies', url=host1 + 'transgender', viewmode="movie_with_plot")] - return itemlist - - -def peliculas(item): - logger.info() - itemlist = [] - - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|#038;", "", data) - patron = 'src="([^"]+)" class="attachment-thumb_site.*?' # img - patron += '<a href="([^"]+)" title="([^"]+)".*?' # url, title - patron += '<div class="right"><p>([^<]+)</p>' # plot - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedthumbnail, scrapedurl, scrapedtitle, plot in matches: - plot = scrapertools.decodeHtmlentities(plot) - - itemlist.append(item.clone(channel=__channel__, action="play", title=scrapedtitle.capitalize(), - url=scrapedurl, thumbnail=scrapedthumbnail, infoLabels={"plot": plot}, - fanart=scrapedthumbnail,viewmode="movie_with_plot", - folder=True, contentTitle=scrapedtitle)) - # Extrae el paginador - paginacion = scrapertools.find_single_match(data, '<a href="([^"]+)">Next ›</a></li><li>') - paginacion = urlparse.urljoin(item.url, paginacion) - - if paginacion: - itemlist.append(Item(channel=__channel__, action="peliculas", - thumbnail=thumbnail % 'rarrow', - title="\xc2\xbb Siguiente \xc2\xbb", url=paginacion)) - - return itemlist - - -def webcam(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|#038;", "", data) - patron = '<div class="profileBox">.*?<a href="/([^"]+)".*?' # url - patron += 'data-hls-preview-url="([^"]+)">.*?' # video_url - patron += 'data-username="([^"]+)".*?' # username - patron += 'title="([^"]+)".*?' # title - patron += 'data-profile="([^"]+)"' # img - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedurl, video_url, username, scrapedtitle, scrapedthumbnail in matches: - scrapedtitle = scrapedtitle.replace(' Chat gratis con webcam.', '') - - itemlist.append(item.clone(channel=__channel__, action="play", title=username, - url=video_url, thumbnail=scrapedthumbnail, fanart=scrapedthumbnail, - viewmode="movie_with_plot", folder=True, contentTitle=scrapedtitle)) - # Extrae el paginador - paginacion = scrapertools.find_single_match(data, '<span id="pagerSpan">\d+</span> <a href="([^"]+)"') - paginacion = urlparse.urljoin(item.url, paginacion) - - if paginacion: - itemlist.append(Item(channel=__channel__, action="webcam", - thumbnail=thumbnail % 'rarrow', - title="\xc2\xbb Siguiente \xc2\xbb", url=paginacion)) - - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = 'data-lazy-src="([^"]+)".*?' - patron += '<a href="([^"]+)".*?' - patron += '<span>([^<]+)</span></a>.*?' - patron += '<span class="nb_cat border-radius-5">([^<]+)</span>' - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedthumbnail, scrapedurl, scrapedtitle, vids in matches: - title = "%s (%s)" % (scrapedtitle, vids.title()) - itemlist.append(item.clone(channel=__channel__, action="peliculas", fanart=scrapedthumbnail, - title=title, url=scrapedurl, thumbnail=scrapedthumbnail, - viewmode="movie_with_plot", folder=True)) - - return itemlist - - -def search(item, texto): - logger.info() - - texto = texto.replace(" ", "+") - item.url = urlparse.urljoin(item.url, "?s={0}".format(texto)) - - try: - return sub_search(item) - - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("{0}".format(line)) - return [] - - -def sub_search(item): - logger.info() - - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = 'data-lazy-src="([^"]+)".*?' # img - patron += 'title="([^"]+)" />.*?' # title - patron += '</noscript><a href="([^"]+)".*?' # url - patron += '<div class="right"><p>([^<]+)</p>' # plot - matches = re.compile(patron, re.DOTALL).findall(data) - - for scrapedthumbnail, scrapedtitle, scrapedurl, plot in matches: - itemlist.append(item.clone(title=scrapedtitle, url=scrapedurl, plot=plot, fanart=scrapedthumbnail, - action="play", thumbnail=scrapedthumbnail)) - - paginacion = scrapertools.find_single_match( - data, "<a href='([^']+)' class=\"inactive\">\d+</a>") - - if paginacion: - itemlist.append(item.clone(channel=__channel__, action="sub_search", - title="\xc2\xbb Siguiente \xc2\xbb", url=paginacion)) - - return itemlist - - -def play(item): - itemlist = [] - if "playlist.m3u8" in item.url: - url = item.url - else: - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|amp;|\s{2}| ", "", data) - patron = 'src="([^"]+)" allowfullscreen="true">' - matches = scrapertools.find_multiple_matches(data, patron) - for url in matches: - if "strdef" in url: - url = decode_url(url) - if "strdef" in url: - url = httptools.downloadpage(url).url - itemlist.append(item.clone(action="play", title= "%s", url=url)) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - return itemlist - - -def decode_url(txt): - logger.info() - itemlist = [] - data = httptools.downloadpage(txt).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - rep = True - while rep == True: - b64_data = scrapertools.find_single_match(data, '\(dhYas638H\("([^"]+)"\)') - if b64_data: - b64_url = base64.b64decode(b64_data + "=") - b64_url = base64.b64decode(b64_url + "==") - data = b64_url - else: - rep = False - url = scrapertools.find_single_match(b64_url, '<iframe src="([^"]+)"') - logger.debug (url) - return url \ No newline at end of file diff --git a/channels/porn/xozilla.json b/channels/porn/xozilla.json deleted file mode 100644 index aae90940..00000000 --- a/channels/porn/xozilla.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "xozilla", - "name": "xozilla", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://www.xozilla.com/images/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/xozilla.py b/channels/porn/xozilla.py deleted file mode 100644 index 4b0b3d46..00000000 --- a/channels/porn/xozilla.py +++ /dev/null @@ -1,114 +0,0 @@ -# -*- coding: utf-8 -*- -# ------------------------------------------------------------ -import urlparse -import urllib2 -import urllib -import re -import os -import sys - -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.xozilla.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(Item(channel=item.channel, title="Nuevas", action="lista", url=host + "/latest-updates/")) - itemlist.append(Item(channel=item.channel, title="Popular", action="lista", url=host + "/most-popular/")) - itemlist.append(Item(channel=item.channel, title="Mejor valorada", action="lista", url=host + "/top-rated/")) - - itemlist.append(Item(channel=item.channel, title="PornStar", action="categorias", url=host + "/models/")) - itemlist.append(Item(channel=item.channel, title="Canal", action="categorias", url=host + "/channels/")) - itemlist.append(Item(channel=item.channel, title="Categorias", action="categorias", url=host + "/categories/")) - itemlist.append(Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/%s/" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a class="item" href="([^"]+)" title="([^"]+)">.*?' - patron += '<img class="thumb" src="([^"]+)".*?' - patron += '(.*?)</a>' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedtitle, scrapedthumbnail, cantidad in matches: - scrapedplot = "" - cantidad = scrapertools.find_single_match(cantidad, '(\d+) videos</div>') - if cantidad: - scrapedtitle += " (" + cantidad + ")" - itemlist.append(Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, fanart=scrapedthumbnail, plot=scrapedplot)) - if "Categorias" in item.title: - itemlist.sort(key=lambda x: x.title) - next_page = scrapertools.find_single_match(data, '<li class="next"><a href="([^"]+)"') - if next_page != "#videos": - next_page = urlparse.urljoin(item.url, next_page) - itemlist.append(item.clone(action="categorias", title="Página Siguiente >>", text_color="blue", url=next_page)) - if next_page == "#videos": - next_page = scrapertools.find_single_match(data, 'from:(\d+)">Next</a>') - next_page = urlparse.urljoin(item.url, next_page) + "/" - itemlist.append(item.clone(action="categorias", title="Página Siguiente >>", text_color="blue", url=next_page)) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a href="([^"]+)" class="item.*?' - patron += 'data-original="([^"]+)".*?' - patron += 'alt="([^"]+)".*?' - patron += '<div class="duration">(.*?)</div>' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedthumbnail, scrapedtitle, duracion in matches: - url = scrapedurl - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - contentTitle = title - thumbnail = scrapedthumbnail - plot = "" - year = "" - itemlist.append(Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle=contentTitle)) - next_page = scrapertools.find_single_match(data, '<li class="next"><a href="([^"]+)"') - if next_page != "#videos": - next_page = urlparse.urljoin(item.url, next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page)) - if next_page == "#videos": - next_page = scrapertools.find_single_match(data, 'from:(\d+)">Next</a>') - next_page = urlparse.urljoin(item.url, next_page) + "/" - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page)) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - media_url = scrapertools.find_single_match(data, 'video_alt_url: \'([^\']+)/\'') - if media_url == "": - media_url = scrapertools.find_single_match(data, 'video_url: \'([^\']+)/\'') - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=media_url, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - return itemlist diff --git a/channels/porn/xtapes.json b/channels/porn/xtapes.json deleted file mode 100644 index 017437cb..00000000 --- a/channels/porn/xtapes.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "xtapes", - "name": "xtapes", - "active": false, - "adult": true, - "language": ["*"], - "thumbnail": "http://hd.xtapes.to/wp-content/uploads/xtapes.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/xtapes.py b/channels/porn/xtapes.py deleted file mode 100644 index 4bb3548b..00000000 --- a/channels/porn/xtapes.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://hd.xtapes.to' - -# Links NetuTV - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url=host + "/hd-porn-movies/")) - itemlist.append( Item(channel=item.channel, title="Productora" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/?filtre=date&cat=0")) - itemlist.append( Item(channel=item.channel, title="Mas Vistos" , action="lista", url=host + "/?display=tube&filtre=views")) - itemlist.append( Item(channel=item.channel, title="Mejor valorado" , action="lista", url=host + "/?display=tube&filtre=rate")) - itemlist.append( Item(channel=item.channel, title="Longitud" , action="lista", url=host + "/?display=tube&filtre=duree")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - if item.title=="Canal": - data = scrapertools.find_single_match(data,'<div class="footer-banner">(.*?)<div id="footer-copyright">') - if item.title=="Productora" : - data = scrapertools.find_single_match(data,'>Full Movies</a>(.*?)</ul>') - if item.title=="Categorias" : - data = scrapertools.find_single_match(data,'<a>Categories</a>(.*?)</ul>') - patron = '<a href="([^"]+)">([^"]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedtitle = scrapedtitle - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<li class="border-radius-5 box-shadow">.*?' - patron += 'src="([^"]+)".*?<a href="([^"]+)" title="([^"]+)">.*?' - patron += '<div class="time-infos".*?>([^"]+)<span class="time-img">' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedthumbnail,scrapedurl,scrapedtitle,duracion in matches: - url = urlparse.urljoin(item.url,scrapedurl) - title = scrapedtitle - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - contentTitle = title - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="findvideos" , title=title , url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = contentTitle)) - next_page = scrapertools.find_single_match(data,'<a class="next page-numbers" href="([^"]+)">Next video') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - next_page = next_page.replace("#038;cat=0#038;", "") - next_page = next_page.replace("#038;filtre=views#038;", "").replace("&filtre=rate#038;", "&").replace("#038;filtre=duree#038;", "") - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - diff --git a/channels/porn/xvideos.json b/channels/porn/xvideos.json deleted file mode 100755 index ddcc89d5..00000000 --- a/channels/porn/xvideos.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "xvideos", - "name": "xvideos", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "xvideos.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/xvideos.py b/channels/porn/xvideos.py deleted file mode 100755 index 6c66b18c..00000000 --- a/channels/porn/xvideos.py +++ /dev/null @@ -1,121 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.xvideos.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Lo mejor" , action="lista", url=host + "/best/")) - itemlist.append( Item(channel=item.channel, title="Pornstar" , action="catalogo", url=host + "/pornstars-index")) - itemlist.append( Item(channel=item.channel, title="WebCAM" , action="catalogo", url=host + "/webcam-models-index")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="catalogo", url=host + "/channels-index/top")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/tags")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?k=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<li><a href="([^"]+)"><b>([^<]+)</b><span class="navbadge default">([^<]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - title = scrapedtitle + " (" + cantidad + ")" - itemlist.append( Item(channel=item.channel, action="lista", title=title, url=scrapedurl, - thumbnail=scrapedthumbnail , plot=scrapedplot) ) - return itemlist - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<img src="([^"]+)".*?' - patron += '<p class="profile-name">.*?<a href="([^"]+)">([^<]+)</a>.*?' - patron += '<span class="with-sub">([^<]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedthumbnail,scrapedurl,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedurl = urlparse.urljoin(host,scrapedurl) + "/videos/new/0" - title = scrapedtitle + " (" + cantidad + ")" - itemlist.append( Item(channel=item.channel, action="lista", title=title, url=scrapedurl, - thumbnail=scrapedthumbnail , plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data, '<li><a href="([^"]+)" class="no-page next-page">Siguiente') - if next_page=="": - next_page = scrapertools.find_single_match(data, '<li><a class="active".*?<a href="([^"]+)"') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append( Item(channel=item.channel, action="catalogo", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<div id="video_\d+".*?' - patron += 'data-src="([^"]+)".*?' - patron += '</a>(.*?)<div class=.*?' - patron += '<a href="([^"]+)" title="([^"]+)".*?' - patron += '<span class="duration">([^<]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedthumbnail,quality,scrapedurl,scrapedtitle,scrapedtime in matches: - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + scrapedtitle - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - thumbnail = scrapedthumbnail.replace("THUMBNUM" , "10") - quality = scrapertools.find_single_match(quality, 'mark">([^<]+)</span>') - if quality: - title = "[COLOR yellow]" + scrapedtime + "[/COLOR] " + "[COLOR red]" + quality + "[/COLOR] " + scrapedtitle - plot = "" - itemlist.append( Item(channel=item.channel, action="play", title=title, url=scrapedurl, - thumbnail=thumbnail, fanart=thumbnail, plot=plot, contentTitle = scrapedtitle)) - next_page = scrapertools.find_single_match(data, '<li><a href="([^"]+)" class="no-page next-page">Siguiente') - if "profile" in item.url: - next_page = scrapertools.find_single_match(data, '<li><a class="active" href="">(\d+)</a></li><li><a href="#') - if next_page: - next_page = urlparse.urljoin(item.url,next_page).replace("&", "&") - itemlist.append( Item(channel=item.channel, action="lista", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - url = scrapertools.find_single_match(data, 'html5player.setVideoHLS\(\'([^\']+)\'\)') - itemlist.append(item.clone(action="play", title=url, url=url )) - return itemlist - diff --git a/channels/porn/xxxdan.json b/channels/porn/xxxdan.json deleted file mode 100644 index 4636a2f1..00000000 --- a/channels/porn/xxxdan.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "xxxdan", - "name": "xxxdan", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://s0.cdn3x.com/xxxdan/i/logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - - diff --git a/channels/porn/xxxdan.py b/channels/porn/xxxdan.py deleted file mode 100644 index c4d21fd0..00000000 --- a/channels/porn/xxxdan.py +++ /dev/null @@ -1,99 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys - -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'http://xxxdan.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host + "/newest")) - itemlist.append( Item(channel=item.channel, title="Popular" , action="lista", url=host + "/popular30")) - itemlist.append( Item(channel=item.channel, title="Longitud" , action="lista", url=host + "/longest")) - itemlist.append( Item(channel=item.channel, title="HD" , action="lista", url=host + "/channel30/hd")) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/channels")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search?query=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a href="([^"]+)" rel="tag".*?' - patron += 'title="([^"]+)".*?' - patron += 'data-original="([^"]+)".*?' - patron += '<span class="score">(\d+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,cantidad in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - scrapedurl = scrapedurl.replace("channel", "channel30") - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail , fanart=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - - - patron = '<li><figure>\s*<a href="([^"]+)".*?' - patron += 'data-original="([^"]+)".*?' - patron += '<time datetime="\w+">([^"]+)</time>' - patron += '(.*?)</ul>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,duracion,calidad in matches: - url = scrapedurl - scrapedtitle = scrapertools.find_single_match(scrapedurl,'https://xxxdan.com/es/.*?/(.*?).html') - contentTitle = scrapedtitle - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - if '<li class="hd">' in calidad : - title = "[COLOR yellow]" + duracion + "[/COLOR] " + "[COLOR red]" + "HD" + "[/COLOR] " + scrapedtitle - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play" , title=title , url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = contentTitle)) - next_page = scrapertools.find_single_match(data,'<li><a href="([^"]+)" rel="next">→</a>') - if next_page!="": - next_page = next_page.replace("http://xxxdan.com/","") - next_page = "/" + next_page - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - media_url = scrapertools.find_single_match(data, 'src:\'([^\']+)\'') - media_url = media_url.replace("https","http") - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=media_url, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - return itemlist - diff --git a/channels/porn/xxxfreeinhd.json b/channels/porn/xxxfreeinhd.json deleted file mode 100644 index ff580284..00000000 --- a/channels/porn/xxxfreeinhd.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "xxxfreeinhd", - "name": "xxxfreeinhd", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://watchxxxfreeinhd.com/wp-content/uploads/logo2015-1.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - ] -} - diff --git a/channels/porn/xxxfreeinhd.py b/channels/porn/xxxfreeinhd.py deleted file mode 100644 index ff12d4e1..00000000 --- a/channels/porn/xxxfreeinhd.py +++ /dev/null @@ -1,122 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -import base64 -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://watchxxxfreeinhd.com' - - -def mainlist(item): - logger.info() - itemlist = [] - - itemlist.append( Item(channel=item.channel, title="Nuevos" , action="lista", url=host + "/?filtre=date&cat=0")) - itemlist.append( Item(channel=item.channel, title="Mas vistos" , action="lista", url=host + "/?display=tube&filtre=views")) - itemlist.append( Item(channel=item.channel, title="Mejor valorada" , action="lista", url=host + "/?display=tube&filtre=rate")) - - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/categories/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "search.php?q=%s&language=en&search=Search" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<noscript>.*?src="([^"]+)".*?' - patron += '<a href="([^"]+)" title="([^"]+)".*?' - patron += '<span class="nb_cat border-radius-5">(\d+) videos</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedthumbnail,scrapedurl,scrapedtitle,cantidad in matches: - scrapedplot = "" - title = scrapedtitle + " (" + cantidad + ")" - itemlist.append( Item(channel=item.channel, action="lista", title=title, url=scrapedurl, - thumbnail=scrapedthumbnail , plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>|<br/>", "", data) - patron = '<li class="border-radius-5 box-shadow">.*?' - patron += '<img width="\d+" height="\d+" src="([^"]+)" class=.*?' - patron += '<a href="([^"]+)" title="([^"]+)">.*?' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedthumbnail,scrapedurl,scrapedtitle in matches: - title = scrapedtitle - thumbnail = scrapedthumbnail + "|https://watchxxxfreeinhd.com/" - plot = "" - itemlist.append( Item(channel=item.channel, action="findvideos", title=title, url=scrapedurl, - thumbnail=thumbnail, plot=plot, fanart=scrapedthumbnail )) - next_page = scrapertools.find_single_match(data, '<link rel="next" href="([^"]+)"') - if next_page: - next_page = urlparse.urljoin(item.url,next_page) - if "?filtre=date&cat=0" in item.url: next_page += "?filtre=date&cat=0" - elif "?display=tube&filtre=views" in item.url: next_page += "?display=tube&filtre=views" - elif "?display=tube&filtre=rate" in item.url: next_page += "?display=tube&filtre=rate" - itemlist.append( Item(channel=item.channel, action="lista", title="Página Siguiente >>", text_color="blue", - url=next_page) ) - return itemlist - - -def findvideos(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - data = scrapertools.find_single_match(data,'<div class="video-embed">(.*?)<div class="views-infos">') - patron = 'data-lazy-src="([^"]+)"' - matches = scrapertools.find_multiple_matches(data, patron) - for title in matches: - if "strdef" in title: - url = decode_url(title) - if "strdef" in url: - url = httptools.downloadpage(url).url - if "hqq" in title: - url = title - itemlist.append( Item(channel=item.channel, action="play", title = "%s", url=url )) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - return itemlist - - -def decode_url(txt): - logger.info() - itemlist = [] - data = httptools.downloadpage(txt).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - rep = True - while rep == True: - b64_data = scrapertools.find_single_match(data, '\(dhYas638H\("([^"]+)"\)') - if b64_data: - b64_url = base64.b64decode(b64_data + "=") - b64_url = base64.b64decode(b64_url + "==") - data = b64_url - else: - rep = False - url = scrapertools.find_single_match(b64_url, '<iframe src="([^"]+)"') - logger.debug (url) - return url - - diff --git a/channels/porn/xxxparodyhd.json b/channels/porn/xxxparodyhd.json deleted file mode 100644 index 54b05121..00000000 --- a/channels/porn/xxxparodyhd.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "xxxparodyhd", - "name": "xxxparodyhd", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://xxxparodyhd.net/wp-content/uploads/2018/04/parodyhd-1.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/xxxparodyhd.py b/channels/porn/xxxparodyhd.py deleted file mode 100644 index df554687..00000000 --- a/channels/porn/xxxparodyhd.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'https://xxxparodyhd.net' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Videos" , action="lista", url=host + "/genre/clips-scenes/")) - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url=host + "/movies/")) - itemlist.append( Item(channel=item.channel, title="Nuevas" , action="lista", url=host + "/genre/new-release/")) - itemlist.append( Item(channel=item.channel, title="Parodias" , action="lista", url=host + "/genre/parodies/")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - if item.title == "Canal" : - data = scrapertools.find_single_match(data,'>Studios</a>(.*?)</ul>') - else: - data = scrapertools.find_single_match(data,'>Categories</a>(.*?)</ul>') - patron = '<a href="([^"]+)">([^<]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div data-movie-id="\d+" class="ml-item">.*?' - patron += '<a href="([^"]+)".*?' - patron += 'oldtitle="([^"]+)".*?' - patron += '<img src="([^"]+)".*?rel="tag">(.*?)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedtitle,scrapedthumbnail,scrapedyear in matches: - scrapedplot = "" - itemlist.append( Item(channel=item.channel, action="findvideos", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, fanart=scrapedthumbnail, plot=scrapedplot, infoLabels={'year':scrapedyear}) ) - next_page = scrapertools.find_single_match(data,'<li class=\'active\'>.*?href=\'([^\']+)\'>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - diff --git a/channels/porn/xxxstreams.json b/channels/porn/xxxstreams.json deleted file mode 100644 index a92df9d3..00000000 --- a/channels/porn/xxxstreams.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "xxxstreams", - "name": "xxxstreams", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "xxxstreams.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/xxxstreams.py b/channels/porn/xxxstreams.py deleted file mode 100644 index cff4d613..00000000 --- a/channels/porn/xxxstreams.py +++ /dev/null @@ -1,93 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://xxxstreams.org' #es hhttp://freepornstreams.org - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url= host + "/category/full-porn-movie-stream/")) - itemlist.append( Item(channel=item.channel, title="Videos" , action="lista", url=host + "/category/new-porn-streaming/")) - itemlist.append( Item(channel=item.channel, title="Canal" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host)) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - if item.title == "Categorias" : - data1 = scrapertools.find_single_match(data,'>Top Tags</a>(.*?)</ul>') - data1 += scrapertools.find_single_match(data,'>Ethnic</a>(.*?)</ul>') - data1 += scrapertools.find_single_match(data,'>Kinky</a>(.*?)</ul>') - if item.title == "Canal" : - data1 = scrapertools.find_single_match(data,'>Top sites</a>(.*?)</ul>') - data1 += scrapertools.find_single_match(data,'Downloads</h2>(.*?)</ul>') - patron = '<a href="([^<]+)">([^<]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data1) - for scrapedurl,scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail , plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="entry-content">.*?' - patron += '<img src="([^"]+)".*?' - patron += '<a href="([^<]+)".*?' - patron += '<span class="screen-reader-text">(.*?)</span>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedthumbnail,scrapedurl,scrapedtitle in matches: - scrapedplot = "" - if '/HD' in scrapedtitle : title= "[COLOR red]" + "HD" + "[/COLOR] " + scrapedtitle - elif 'SD' in scrapedtitle : title= "[COLOR red]" + "SD" + "[/COLOR] " + scrapedtitle - elif 'FullHD' in scrapedtitle : title= "[COLOR red]" + "FullHD" + "[/COLOR] " + scrapedtitle - elif '1080' in scrapedtitle : title= "[COLOR red]" + "1080p" + "[/COLOR] " + scrapedtitle - else: title = scrapedtitle - itemlist.append( Item(channel=item.channel, action="findvideos", title=title, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail,plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<a class="next page-numbers" href="([^"]+)">Next →</a>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista" , title="Next page >>", text_color="blue", url=next_page) ) - return itemlist - - -def findvideos(item): - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t|amp;|\s{2}| ", "", data) - patron = '<a href="([^"]+)" rel="nofollow"[^<]+>(?:Streaming|Download)' - matches = scrapertools.find_multiple_matches(data, patron) - for url in matches: - if not "ubiqfile" in url: - itemlist.append(item.clone(action='play',title="%s", url=url)) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - return itemlist diff --git a/channels/porn/yespornplease.json b/channels/porn/yespornplease.json deleted file mode 100644 index f9994183..00000000 --- a/channels/porn/yespornplease.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "yespornplease", - "name": "YesPornPlease", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "yespornplease.png", - "banner": "yespornplease.png", - "categories": [ - "adult" - ], - "settings": [ - { - "id": "include_in_global_search", - "type": "bool", - "label": "Incluir en busqueda global", - "default": true, - "enabled": true, - "visible": true - } - ] -} \ No newline at end of file diff --git a/channels/porn/yespornplease.py b/channels/porn/yespornplease.py deleted file mode 100644 index ae7c2b40..00000000 --- a/channels/porn/yespornplease.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -from core import httptools -from core.item import Item -from platformcode import logger -from urlparse import urljoin -from core import servertools - - -HOST="http://yespornplease.com" - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(item.clone(action="links", title="Novedades", url=HOST)) - itemlist.append(item.clone(action="categories", title="Categorías", url=urljoin(HOST, "categories"))) - itemlist.append(item.clone(action="search", title="Buscar", url=urljoin(HOST, "search"))) - return itemlist - - -def search(item, texto): - logger.info("texto = %s" %(texto)) - item.url = urljoin(HOST, "search?q=" + texto) - try: - return links(item) - # Se captura la excepción, para no interrumpir al buscador global si un canal falla - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categories(item): - logger.info() - data = httptools.downloadpage(item.url).data - result = [] - categories = re.findall("href=[\"'](?P<url>/search[^\"']+).*?>(?P<name>[^<>]+)</div>.*?badge[^>]+>(?P<counter>\d+)", data, re.DOTALL | re.MULTILINE) - for url, name, counter in categories: - result.append(item.clone(action = "links", title = "%s (%s videos)" % (name, counter), url = urljoin(item.url, url))) - return result - - -def get_page(url): - page = re.search("p=(\d+)", url) - if page: - return int(page.group(1)) - return 1 - - -def get_page_url(url, page): - logger.debug("URL: %s to page %d" % (url, page)) - resultURL = re.sub("([&\?]p=)(?:\d+)", "\g<1>%d" % page, url) - if resultURL == url: - resultURL += ("&" if "?" in url else "?") + "p=%d" % (page) - logger.debug("Result: %s" % (resultURL)) - return resultURL - - -def links(item): - logger.info() - data = httptools.downloadpage(item.url).data - reExpr = "<img\s+src=['\"](?P<img>[^'\"]+)[^>]+(?:title|alt)[^'\"]*['\"](?P<title>[^\"]+)[^>]+id[^'\"]*['\"](?P<id>[^'\"]+)[^>]*>(?:[^<]*<[^>]+>(?P<quality>[^<]+)<)?[^<]*<[^>]*duration[^>]*>(?P<duration>[^<]+)" - reResults = re.findall(reExpr, data, re.MULTILINE | re.DOTALL) - result = [] - for img, title, vID, quality, duration in reResults: - formattedQuality = "" - if quality: - formattedQuality += " [%s]" % (quality) - titleFormatted = "%(title)s%(quality)s [%(duration)s]" % ({"title": title, "quality": formattedQuality, "duration": duration}) - result.append(item.clone(action = "play", title = titleFormatted, url = urljoin(item.url, "/v/%s" % (vID)), thumbnail = urljoin(item.url, img), vID = vID)) - # Has pagination - paginationOccurences = data.count('class="prevnext"') - if paginationOccurences: - page = get_page(item.url) - logger.info("Page " + str(page) + " Ocurrences: " + str(paginationOccurences)) - if page > 1: - result.append(item.clone(action = "links", title = "<< Anterior", url = get_page_url(item.url, page - 1))) - if paginationOccurences > 1 or page == 1: - result.append(item.clone(action = "links", title = "Siguiente >>", url = get_page_url(item.url, page + 1))) - return result - - -def play(item): - logger.info(item) - embededURL = urljoin(item.url, "/v/%s" % (item.vID)) - itemlist = servertools.find_video_items(item.clone(url = embededURL)) - return itemlist diff --git a/channels/porn/youjizz.json b/channels/porn/youjizz.json deleted file mode 100644 index cdc171b9..00000000 --- a/channels/porn/youjizz.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "youjizz", - "name": "youjizz", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://cdne-static.yjcontentdelivery.com/app/1/images/yjlogo.jpeg", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/youjizz.py b/channels/porn/youjizz.py deleted file mode 100644 index 4112acbe..00000000 --- a/channels/porn/youjizz.py +++ /dev/null @@ -1,111 +0,0 @@ -# -*- coding: utf-8 -*- -# ------------------------------------------------------------ -import urlparse -import urllib2 -import urllib -import re -import os -import sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.youjizz.com' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append(Item(channel=item.channel, title="Nuevas", action="lista", url=host + "/newest-clips/1.html")) - itemlist.append(Item(channel=item.channel, title="Popular", action="lista", url=host + "/most-popular/1.html")) - itemlist.append( - Item(channel=item.channel, title="Mejor valorada", action="lista", url=host + "/top-rated-week/1.html")) - itemlist.append(Item(channel=item.channel, title="Categorias", action="categorias", url=host)) - itemlist.append(Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/%s-1.html" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data, '>Trending Categories<(.*?)</ul>') - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<li><a href="([^"]+)">([^"]+)</a>' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedtitle in matches: - scrapedplot = "" - scrapedthumbnail = "" - scrapedtitle = scrapedtitle - scrapedurl = urlparse.urljoin(item.url, scrapedurl) - itemlist.append(Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot)) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<div class="video-item">.*?' - patron += 'class="frame image" href="([^"]+)".*?' - patron += 'data-original="([^"]+)" />.*?' - patron += '<div class="video-title">.*?' - patron += '>(.*?)</a>.*?' - patron += '<span class="time">(.*?)</span>' - matches = re.compile(patron, re.DOTALL).findall(data) - for scrapedurl, scrapedthumbnail, scrapedtitle, duracion in matches: - url = urlparse.urljoin(item.url, scrapedurl) - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - quality = "" - if '-720-' in scrapedthumbnail: - quality = "720" - if '-1080-' in scrapedthumbnail: - quality = "1080" - if quality: - title = "[COLOR yellow]" + duracion + "[/COLOR] " + "[COLOR red]" + quality + "p[/COLOR] " + scrapedtitle - contentTitle = title - thumbnail = "http:" + scrapedthumbnail - plot = "" - year = "" - itemlist.append(Item(channel=item.channel, action="play", title=title, url=url, thumbnail=thumbnail, - plot=plot, quality=quality, contentTitle=contentTitle)) - next_page = scrapertools.find_single_match(data, '<li><a class="pagination-next" href="([^"]+)">Next »</a>') - if next_page != "": - next_page = urlparse.urljoin(item.url, next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page)) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = scrapertools.find_single_match(data, 'var encodings(.*?)var') - if '360' in data: - patron = '"360".*?"filename"\:"(.*?)"' - if '720' in data: - patron = '"720".*?"filename"\:"(.*?)"' - if '1080' in data: - patron = '"1080".*?"filename"\:"(.*?)"' - media_url = scrapertools.find_single_match(data, patron) - media_url = "https:" + media_url.replace("\\", "") - itemlist.append(Item(channel=item.channel, action="play", title=item.title, url=media_url, - thumbnail=item.thumbnail, plot=item.plot, show=item.title, server="directo", folder=False)) - return itemlist diff --git a/channels/porn/youporn.json b/channels/porn/youporn.json deleted file mode 100644 index ed466088..00000000 --- a/channels/porn/youporn.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "youporn", - "name": "youporn", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "https://fs.ypncdn.com/cb/bundles/youpornwebfront/images/l_youporn_black.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/youporn.py b/channels/porn/youporn.py deleted file mode 100644 index fd41cfb7..00000000 --- a/channels/porn/youporn.py +++ /dev/null @@ -1,129 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from platformcode import config, logger -from core import scrapertools -from core.item import Item -from core import servertools -from core import httptools - -host = 'https://www.youporn.com' - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Nuevas", action="lista", url=host + "/browse/time/")) - itemlist.append( Item(channel=item.channel, title="Mas Vistas", action="lista", url=host + "/browse/views/")) - itemlist.append( Item(channel=item.channel, title="Mejor valorada", action="lista", url=host + "/top_rated/")) - itemlist.append( Item(channel=item.channel, title="Canal", action="categorias", url=host + "/channels/most_popular/")) - itemlist.append( Item(channel=item.channel, title="Pornstars", action="catalogo", url=host + "/pornstars/most_popular/")) - itemlist.append( Item(channel=item.channel, title="Categorias", action="categorias", url=host + "/categories/alphabetical/")) - itemlist.append( Item(channel=item.channel, title="Buscar", action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host + "/search/?query=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def catalogo(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - data1 = scrapertools.find_single_match(data,'>Most Popular Pornstars<(.*?)<i class=\'icon-menu-right\'></i></a>') - patron = '<a href="([^"]+)".*?' - patron += 'data-original="([^"]+)".*?' - patron += '<span class="porn-star-name">([^"]+)</span>.*?' - patron += '<span class="video-count">([^"]+)</span>' - matches = re.compile(patron,re.DOTALL).findall(data1) - for scrapedurl,scrapedthumbnail,scrapedtitle,cantidad in matches: - scrapedplot = "" - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - fanart=scrapedthumbnail, thumbnail=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<div class="currentPage".*?<a href="([^"]+)"') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="catalogo", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - if item.title == "Canal": - data = scrapertools.find_single_match(data,'>All</div>(.*?)<i class=\'icon-menu-right\'></i></a>') - if item.title == "Categorias": - data = scrapertools.find_single_match(data,'<div class=\'row alphabetical\'.*?>(.*?)>Popular by Country</h2>') - patron = '<a href="([^"]+)".*?' - patron += '<img src=(.*?)>.*?' - patron += '>([^<]+) (?:Videos|videos)<' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,cantidad in matches: - scrapedplot = "" - thumbnail = scrapertools.find_single_match(scrapedthumbnail,'data-original="([^"]+)"') - scrapedtitle = scrapertools.find_single_match(scrapedthumbnail,'alt="([^"]+)"') - if scrapedtitle == "" : - scrapedtitle = scrapertools.find_single_match(scrapedthumbnail,'alt=\'([^\']+)\'') - title = scrapedtitle + " (" + cantidad +")" - scrapedurl = urlparse.urljoin(item.url,scrapedurl) - itemlist.append( Item(channel=item.channel, action="lista", title=title, url=scrapedurl, - fanart=thumbnail, thumbnail=thumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<div class="currentPage".*?<a href="([^"]+)"') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="categorias", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - patron = '<a href="([^"]+)" class=\'video-box-image\'.*?' - patron += 'data-original="([^"]+)".*?' - patron += '<div class="video-box-title">([^"]+)</div>.*?' - patron += '<div class="video-duration">(.*?)</div>' - matches = re.compile(patron,re.DOTALL).findall(data) - for scrapedurl,scrapedthumbnail,scrapedtitle,duracion in matches: - url = urlparse.urljoin(item.url,scrapedurl) - title = "[COLOR yellow]" + duracion + "[/COLOR] " + scrapedtitle - contentTitle = title - thumbnail = scrapedthumbnail - plot = "" - itemlist.append( Item(channel=item.channel, action="play" , title=title , url=url, thumbnail=thumbnail, - fanart=thumbnail, plot=plot, contentTitle = contentTitle)) - next_page = scrapertools.find_single_match(data,'<link rel="next" href="([^"]+)"') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - return itemlist - - -def play(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = 'page_params.video.mediaDefinition =.*?"videoUrl":"([^"]+)"' - matches = scrapertools.find_multiple_matches(data, patron) - for scrapedurl in matches: - scrapedurl = scrapedurl.replace("\/", "/") - itemlist.append(item.clone(action="play", title=scrapedurl, url=scrapedurl)) - return itemlist - - diff --git a/channels/porn/yuuk.json b/channels/porn/yuuk.json deleted file mode 100644 index 89900cea..00000000 --- a/channels/porn/yuuk.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "yuuk", - "name": "yuuk", - "active": true, - "adult": true, - "language": ["*"], - "thumbnail": "http://yuuk.net/wp-content/uploads/2018/06/yuuk_net_logo.png", - "banner": "", - "categories": [ - "adult" - ], - "settings": [ - - ] -} - diff --git a/channels/porn/yuuk.py b/channels/porn/yuuk.py deleted file mode 100644 index f6e08673..00000000 --- a/channels/porn/yuuk.py +++ /dev/null @@ -1,93 +0,0 @@ -# -*- coding: utf-8 -*- -#------------------------------------------------------------ -import urlparse,urllib2,urllib,re -import os, sys -from core import scrapertools -from core import servertools -from core.item import Item -from platformcode import config, logger -from core import httptools - -host = 'http://yuuk.net' - - -def mainlist(item): - logger.info() - itemlist = [] - itemlist.append( Item(channel=item.channel, title="Peliculas" , action="lista", url=host)) - itemlist.append( Item(channel=item.channel, title="Categorias" , action="categorias", url=host + "/list-genres/")) - itemlist.append( Item(channel=item.channel, title="Buscar" , action="search")) - return itemlist - - -def search(item, texto): - logger.info() - texto = texto.replace(" ", "+") - item.url = host+ "/?s=%s" % texto - try: - return lista(item) - except: - import sys - for line in sys.exc_info(): - logger.error("%s" % line) - return [] - - -def categorias(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - itemlist.append( Item(channel=item.channel, title="Censored" , action="lista", url=host + "/category/censored/")) - itemlist.append( Item(channel=item.channel, title="Uncensored" , action="lista", url=host + "/category/uncensored/")) - patron = '<li><a href="([^"]+)" title="[^"]+"><span>([^"]+)</span><span>([^"]+)</span></a></li>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle,cantidad in matches: - scrapedtitle = scrapedtitle + " (" + cantidad + ")" - scrapedplot = "" - scrapedthumbnail = "" - itemlist.append( Item(channel=item.channel, action="lista", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, plot=scrapedplot) ) - return itemlist - - -def lista(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - patron = '<div class="featured-wrap clearfix">.*?' - patron += '<a href="([^"]+)" title="([^"]+)".*?' - patron += 'src="([^"]+)".*?' - patron += '>#([^"]+)</a>' - matches = re.compile(patron,re.DOTALL).findall(data) - scrapertools.printMatches(matches) - for scrapedurl,scrapedtitle,scrapedthumbnail,calidad in matches: - scrapedplot = "" - calidad = calidad.replace(" Full HD JAV", "") - scrapedtitle = "[COLOR red]" + calidad + "[/COLOR] " + scrapedtitle - itemlist.append( Item(channel=item.channel, action="findvideos", title=scrapedtitle, url=scrapedurl, - thumbnail=scrapedthumbnail, fanart=scrapedthumbnail, plot=scrapedplot) ) - next_page = scrapertools.find_single_match(data,'<li class=\'current\'>.*?<a rel=\'nofollow\' href=\'([^\']+)\' class=\'inactive\'>') - if next_page!="": - next_page = urlparse.urljoin(item.url,next_page) - itemlist.append(item.clone(action="lista", title="Página Siguiente >>", text_color="blue", url=next_page) ) - - return itemlist - - -def findvideos(item): - logger.info() - itemlist = [] - data = httptools.downloadpage(item.url).data - data = re.sub(r"\n|\r|\t| |<br>", "", data) - data = scrapertools.find_single_match(data,'Streaming Server<(.*?)Screenshot<') - patron = '(?:src|SRC)="([^"]+)"' - matches = scrapertools.find_multiple_matches(data, patron) - for url in matches: - if "http://stream.yuuk.net/embed.php" in url: - data = httptools.downloadpage(url).data - url = scrapertools.find_single_match(data,'"file": "([^"]+)e=download"') - itemlist.append( Item(channel=item.channel, action="play", title = "%s", url=url )) - itemlist = servertools.get_servers_itemlist(itemlist, lambda i: i.title % i.server.capitalize()) - return itemlist - diff --git a/channels/pufimovies.json b/channels/pufimovies.json index 5ded05f3..91680914 100644 --- a/channels/pufimovies.json +++ b/channels/pufimovies.json @@ -2,7 +2,6 @@ "id": "pufimovies", "name": "PufiMovies", "active": true, - "adult": false, "language": ["ita", "sub-ita"], "thumbnail": "pufimovies.png", "banner": "pufimovies.png", diff --git a/channels/raiplay.json b/channels/raiplay.json index cf69a5b1..569776ca 100644 --- a/channels/raiplay.json +++ b/channels/raiplay.json @@ -2,7 +2,6 @@ "id": "raiplay", "name": "Rai Play", "active": true, - "adult": false, "language": ["ita"], "thumbnail": "raiplay.png", "banner": "raiplay.png", diff --git a/channels/seriehd.json b/channels/seriehd.json index 54a7a5a5..eda29eb2 100644 --- a/channels/seriehd.json +++ b/channels/seriehd.json @@ -2,7 +2,6 @@ "id": "seriehd", "name": "SerieHD", "active": true, - "adult": false, "language": ["ita"], "thumbnail": "seriehd.png", "banner": "seriehd.png", diff --git a/channels/serietvonline.json b/channels/serietvonline.json index 700fe885..bc583756 100644 --- a/channels/serietvonline.json +++ b/channels/serietvonline.json @@ -2,7 +2,6 @@ "id": "serietvonline", "name": "SerieTvOnline", "active": true, - "adult": false, "language": ["ita"], "thumbnail": "serietvonline.png", "bannermenu": "serietvonline.png", diff --git a/channels/serietvonline.py b/channels/serietvonline.py index 586f5c31..f80927bf 100644 --- a/channels/serietvonline.py +++ b/channels/serietvonline.py @@ -60,7 +60,6 @@ def mainlist(item): @support.scrape def peliculas(item): support.log() - #findhost() blacklist = ['DMCA', 'Contatti', 'Attenzione NON FARTI OSCURARE', 'Lista Cartoni Animati e Anime'] patronBlock = r'<h1>.+?</h1>(?P<block>.*?)<div class="footer_c">' @@ -91,7 +90,6 @@ def peliculas(item): patron = r'href="(?P<url>[^"]+)"[^>]+>(?P<title>.*?)[ ]?(?P<year>\d+)?(?: Streaming | MD iSTANCE )?<' patronBlock = r'Lista dei film disponibili in streaming e anche in download\.</p>(?P<block>.*?)<div class="footer_c">' else: - #patronBlock = r'<h1>Ultimi film aggiunti</h1>(?P<block>.*?)<div class="footer_c">' patron = r'<tr><td><a href="(?P<url>[^"]+)"(?:|.+?)?>(?:  )?[ ]?(?P<title>.*?)[ ]?(?P<quality>HD)?[ ]?(?P<year>\d+)?(?: | HD | Streaming | MD(?: iSTANCE)? )?</a>' def itemHook(item): @@ -104,22 +102,22 @@ def peliculas(item): item.contentType = 'tvshow' item.action = 'episodios' return item - - #support.regexDbg(item, patronBlock, headers) - #debug = True return locals() @support.scrape def episodios(item): support.log() - #findhost() action = 'findvideos' patronBlock = r'<table>(?P<block>.*?)<\/table>' patron = r'<tr><td>(?:[^<]+)[ ](?:Parte)?(?P<episode>\d+x\d+|\d+)(?:|[ ]?(?P<title2>.+?)?(?:avi)?)<(?P<url>.*?)</td><tr>' - - #debug = True + def itemlistHook(itemlist): + for i, item in enumerate(itemlist): + ep = support.match(item.title, patron=r'\d+x(\d+)').match + if ep == '00': + item.title = item.title.replace('x00', 'x' + str(i+1).zfill(2)).replace('- ..','') + return itemlist return locals() diff --git a/channels/serietvsubita.json b/channels/serietvsubita.json index dcd8baec..0db82e02 100644 --- a/channels/serietvsubita.json +++ b/channels/serietvsubita.json @@ -2,7 +2,6 @@ "id": "serietvsubita", "name": "Serie TV Sub ITA", "active": true, - "adult": false, "language": ["ita"], "thumbnail": "serietvsubita.png", "banner": "serietvsubita.png", diff --git a/channels/serietvu.json b/channels/serietvu.json index 929dcc5b..e9e1ec1e 100644 --- a/channels/serietvu.json +++ b/channels/serietvu.json @@ -2,7 +2,6 @@ "id": "serietvu", "name": "SerieTVU", "active": true, - "adult": false, "language": ["ita", "sub-ita"], "thumbnail": "serietvu.png", "banner": "serietvu.png", diff --git a/channels/streamingaltadefinizione.json b/channels/streamingaltadefinizione.json index c028f749..9666b270 100644 --- a/channels/streamingaltadefinizione.json +++ b/channels/streamingaltadefinizione.json @@ -3,7 +3,6 @@ "name": "Popcorn Stream", "language": ["ita"], "active": true, - "adult": false, "thumbnail": "popcornstream.png", "banner": "popcornstream.png", "categories": ["movie","tvshow","anime"], diff --git a/channels/streamingaltadefinizione.py b/channels/streamingaltadefinizione.py index 959b4e11..64507fd9 100644 --- a/channels/streamingaltadefinizione.py +++ b/channels/streamingaltadefinizione.py @@ -12,14 +12,8 @@ list_servers = ['verystream', 'openload', 'wstream'] list_quality = ['1080p', 'HD', 'DVDRIP', 'SD', 'CAM'] def findhost(): - permUrl = httptools.downloadpage('https://www.popcornstream.info', follow_redirects=False, only_headers=True).headers - if 'google' in permUrl['location']: - host = permUrl['location'].replace('https://www.google.it/search?q=site:', '') - if host[:4] != 'http': - host = 'https://'+permUrl['location'].replace('https://www.google.it/search?q=site:', '') - else: - host = permUrl['location'] - return host + data = httptools.downloadpage('https://www.popcornstream-nuovo-indirizzo.online/').data + return support.scrapertools.find_single_match(data, '<a href="([^"]+)') host = config.get_channel_url(findhost) headers = [['Referer', host]] diff --git a/channels/streamtime.json b/channels/streamtime.json index d5e51934..11b43bab 100644 --- a/channels/streamtime.json +++ b/channels/streamtime.json @@ -3,7 +3,6 @@ "name": "StreamTime", "language": ["ita"], "active": false, - "adult": false, "thumbnail": "streamtime.png", "banner": "streamtime.png", "categories": ["tvshow", "movie"], diff --git a/channels/tantifilm.json b/channels/tantifilm.json index e50875c3..e9e12f8d 100644 --- a/channels/tantifilm.json +++ b/channels/tantifilm.json @@ -3,7 +3,6 @@ "name": "Tantifilm", "language": ["ita"], "active": true, - "adult": false, "thumbnail": "tantifilm.png", "banner": "tantifilm.png", "categories": ["tvshow", "movie", "anime"], diff --git a/channels/toonitalia.json b/channels/toonitalia.json index 15f0a135..fad45e0f 100644 --- a/channels/toonitalia.json +++ b/channels/toonitalia.json @@ -2,8 +2,7 @@ "id": "toonitalia", "name": "ToonItalia", "language": ["ita", "sub-ita"], - "active": true, - "adult": false, + "active": true, "thumbnail": "toonitalia.png", "banner": "toonitalia.png", "categories": ["tvshow", "movie", "vos", "anime"], diff --git a/channels/tunein.json b/channels/tunein.json index e72f724a..cb041bb3 100644 --- a/channels/tunein.json +++ b/channels/tunein.json @@ -2,7 +2,6 @@ "id": "tunein", "name": "TuneIn", "active": true, - "adult": false, "language": ["*"], "thumbnail": "tunein.png", "banner": "tunein.png", diff --git a/channels/tunein.py b/channels/tunein.py index 212965bc..d0d33383 100644 --- a/channels/tunein.py +++ b/channels/tunein.py @@ -21,6 +21,7 @@ def mainlist(item): patron = r'text="(?P<title>[^"]+)" URL="(?P<url>[^"]+)"' def itemHook(item): item.thumbnail = support.thumb(thumb='music.png') + item.contentType = 'music' return item def itemlistHook(itemlist): itemlist.append( diff --git a/channels/vedohd.json b/channels/vedohd.json index 4d87e941..51a47d4d 100644 --- a/channels/vedohd.json +++ b/channels/vedohd.json @@ -3,7 +3,6 @@ "name": "VedoHD", "language": ["ita"], "active": false, - "adult": false, "thumbnail": "vedohd.png", "banner": "vedohd.png", "categories": ["movie"], diff --git a/channels/vvvvid.json b/channels/vvvvid.json index e1f33816..4f84b77a 100644 --- a/channels/vvvvid.json +++ b/channels/vvvvid.json @@ -2,7 +2,6 @@ "id": "vvvvid", "name": "VVVVID", "active": true, - "adult": false, "language": ["ita","vos"], "thumbnail": "vvvvid.png", "banner": "vvvvid.png", diff --git a/channelselector.py b/channelselector.py index bfc1a764..10452461 100644 --- a/channelselector.py +++ b/channelselector.py @@ -1,15 +1,12 @@ # -*- coding: utf-8 -*- -import glob -import os -import sys +import glob, os from core import channeltools from core.item import Item from platformcode.unify import thumb_dict from platformcode import config, logger, unify -import xbmcaddon -addon = xbmcaddon.Addon('plugin.video.kod') +addon = config.__settings__ downloadenabled = addon.getSetting('downloadenabled') def getmainlist(view="thumb_"): @@ -20,16 +17,12 @@ def getmainlist(view="thumb_"): itemlist.append(Item(title="Redirect", channel="checkhost", action="check_channels", thumbnail='', category=config.get_localized_string(30119), viewmode="thumbnails")) - # Añade los canales que forman el menú principal + # Main Menu Channels if addon.getSetting('enable_news_menu') == "true": - # itemlist.append(Item(title=config.get_localized_string(30130), channel="news", action="mainlist", - # thumbnail=get_thumb("news.png", view), - # category=config.get_localized_string(30119), viewmode="thumbnails", - # context=CONTEXT + [{"title": config.get_localized_string(70285), "channel": "news", "action": "menu_opciones","goto": True}])) itemlist.append(Item(title=config.get_localized_string(30130), channel="news", action="mainlist", thumbnail=get_thumb("news.png", view), category=config.get_localized_string(30119), viewmode="thumbnails", - context=[{"title": config.get_localized_string(70285), "channel": "shortcuts", "action": "SettingOnPosition", "category":5}])) + context=[{"title": config.get_localized_string(70285), "channel": "shortcuts", "action": "SettingOnPosition", "category":7, "setting":1}])) if addon.getSetting('enable_channels_menu') == "true": itemlist.append(Item(title=config.get_localized_string(30118), channel="channelselector", action="getchanneltypes", @@ -37,16 +30,11 @@ def getmainlist(view="thumb_"): category=config.get_localized_string(30119), viewmode="thumbnails")) if addon.getSetting('enable_search_menu') == "true": - # itemlist.append(Item(title=config.get_localized_string(30103), channel="search", path='special', action="mainlist", - # thumbnail=get_thumb("search.png", view), - # category=config.get_localized_string(30119), viewmode="list", - # context = CONTEXT + [{"title": config.get_localized_string(60412), "action": "setting_channel_new", "channel": "search"}, - # {"title": config.get_localized_string(70286), "action": "settings", "channel": "search"}])) itemlist.append(Item(title=config.get_localized_string(30103), channel="search", path='special', action="mainlist", thumbnail=get_thumb("search.png", view), category=config.get_localized_string(30119), viewmode="list", context = [{"title": config.get_localized_string(60412), "action": "setting_channel_new", "channel": "search"}, - {"title": config.get_localized_string(70286), "channel": "shortcuts", "action": "SettingOnPosition", "category":3}])) + {"title": config.get_localized_string(70286), "channel": "shortcuts", "action": "SettingOnPosition", "category":5 , "setting":1}])) if addon.getSetting('enable_onair_menu') == "true": itemlist.append(Item(channel="filmontv", action="mainlist", title=config.get_localized_string(50001), @@ -63,30 +51,18 @@ def getmainlist(view="thumb_"): category=config.get_localized_string(30102), viewmode="thumbnails")) if config.get_videolibrary_support() and addon.getSetting('enable_library_menu') == "true": - # itemlist.append(Item(title=config.get_localized_string(30131), channel="videolibrary", action="mainlist", - # thumbnail=get_thumb("videolibrary.png", view), - # category=config.get_localized_string(30119), viewmode="thumbnails", - # context=CONTEXT + [{"title": config.get_localized_string(70287), "channel": "videolibrary", - # "action": "channel_config"}])) itemlist.append(Item(title=config.get_localized_string(30131), channel="videolibrary", action="mainlist", thumbnail=get_thumb("videolibrary.png", view), category=config.get_localized_string(30119), viewmode="thumbnails", - context=[{"title": config.get_localized_string(70287), "channel": "shortcuts", "action": "SettingOnPosition", "category":2}, + context=[{"title": config.get_localized_string(70287), "channel": "shortcuts", "action": "SettingOnPosition", "category":2, "setting":1}, {"title": config.get_localized_string(60568), "channel": "videolibrary", "action": "update_videolibrary"}])) if downloadenabled != "false": - # itemlist.append(Item(title=config.get_localized_string(30101), channel="downloads", action="mainlist", - # thumbnail=get_thumb("downloads.png", view), viewmode="list", - # context=CONTEXT + [{"title": config.get_localized_string(70288), "channel": "setting", "config": "downloads", - # "action": "channel_config"}])) itemlist.append(Item(title=config.get_localized_string(30101), channel="downloads", action="mainlist", thumbnail=get_thumb("downloads.png", view), viewmode="list", - context=[{"title": config.get_localized_string(70288), "channel": "shortcuts", "action": "SettingOnPosition", "category":4}])) + context=[{"title": config.get_localized_string(70288), "channel": "shortcuts", "action": "SettingOnPosition", "category":6}])) thumb_setting = "setting_%s.png" % 0 # config.get_setting("plugin_updates_available") - # itemlist.append(Item(title=config.get_localized_string(30100), channel="setting", action="mainlist", - # thumbnail=get_thumb(thumb_setting, view), - # category=config.get_localized_string(30100), viewmode="list")) itemlist.append(Item(title=config.get_localized_string(30100), channel="setting", action="settings", thumbnail=get_thumb(thumb_setting, view), category=config.get_localized_string(30100), viewmode="list")) @@ -99,18 +75,14 @@ def getmainlist(view="thumb_"): def getchanneltypes(view="thumb_"): logger.info() - # Lista de categorias - # channel_types = ["movie", "tvshow", "anime", "documentary", "vos", "direct", "live", "torrent", "music"] - channel_types = ["movie", "tvshow", "anime", "documentary", "vos", "direct", "live", "music"] + # Category List + channel_types = ["movie", "tvshow", "anime", "documentary", "vos", "direct", "live", "torrent", "music"] - if config.get_setting("adult_mode") != 0: - channel_types.append("adult") - - # channel_language = config.get_setting("channel_language", default="all") + # Channel Language channel_language = auto_filter() logger.info("channel_language=%s" % channel_language) - # Ahora construye el itemlist ordenadamente + # Build Itemlist itemlist = list() title = config.get_localized_string(30121) itemlist.append(Item(title=title, channel="channelselector", action="filterchannels", view=view, @@ -123,12 +95,6 @@ def getchanneltypes(view="thumb_"): channel_type=channel_type, viewmode="thumbnails", thumbnail=get_thumb("%s.png" % channel_type, view))) - # itemlist.append(Item(title='Oggi in TV', channel="filmontv", action="mainlist", view=view, - # category=title, channel_type="all", thumbnail=get_thumb("on_the_air.png", view), - # viewmode="thumbnails")) - - - itemlist.append(Item(title=config.get_localized_string(70685), channel="community", action="mainlist", view=view, category=config.get_localized_string(70685), channel_type="all", thumbnail=get_thumb("community.png", view), viewmode="thumbnails")) @@ -136,27 +102,23 @@ def getchanneltypes(view="thumb_"): def filterchannels(category, view="thumb_"): - logger.info('Filterchannl'+category) + logger.info('Filter Channels ' + category) channelslist = [] - # Si category = "allchannelstatus" es que estamos activando/desactivando canales + # If category = "allchannelstatus" is that we are activating / deactivating channels appenddisabledchannels = False if category == "allchannelstatus": category = "all" appenddisabledchannels = True - # Lee la lista de canales - if category != 'adult': - channel_path = os.path.join(config.get_runtime_path(), 'channels', '*.json') - else: - channel_path = os.path.join(config.get_runtime_path(), 'channels', 'porn', '*.json') + channel_path = os.path.join(config.get_runtime_path(), 'channels', '*.json') logger.info("channel_path = %s" % channel_path) channel_files = glob.glob(channel_path) - logger.info("channel_files encontrados %s" % (len(channel_files))) + logger.info("channel_files found %s" % (len(channel_files))) - # channel_language = config.get_setting("channel_language", default="all") + # Channel Language channel_language = auto_filter() logger.info("channel_language=%s" % channel_language) @@ -171,106 +133,87 @@ def filterchannels(category, view="thumb_"): if channel_parameters["channel"] == 'community': continue - # # si el canal no es compatible, no se muestra - # if not channel_parameters["compatible"]: - # continue - - # Si no es un canal lo saltamos + # If it's not a channel we skip it if not channel_parameters["channel"]: continue logger.info("channel_parameters=%s" % repr(channel_parameters)) - # Si prefiere el banner y el canal lo tiene, cambia ahora de idea + # If you prefer the banner and the channel has it, now change your mind if view == "banner_" and "banner" in channel_parameters: channel_parameters["thumbnail"] = channel_parameters["banner"] - # si el canal está desactivado no se muestra el canal en la lista + # if the channel is deactivated the channel is not shown in the list if not channel_parameters["active"]: continue - # Se salta el canal si no está activo y no estamos activando/desactivando los canales + # The channel is skipped if it is not active and we are not activating / deactivating the channels channel_status = config.get_setting("enabled", channel_parameters["channel"]) if channel_status is None: - # si channel_status no existe es que NO HAY valor en _data.json. - # como hemos llegado hasta aquí (el canal está activo en channel.json), se devuelve True + # if channel_status does not exist, there is NO value in _data.json. + # as we got here (the channel is active in channel.json), True is returned channel_status = True if not channel_status: - # si obtenemos el listado de canales desde "activar/desactivar canales", y el canal está desactivado - # lo mostramos, si estamos listando todos los canales desde el listado general y está desactivado, - # no se muestra + # if we get the list of channels from "activate / deactivate channels", and the channel is deactivated + # we show it, if we are listing all the channels from the general list and it is deactivated, it is not shown if not appenddisabledchannels: continue - # Se salta el canal para adultos si el modo adultos está desactivado - if channel_parameters["adult"] and config.get_setting("adult_mode") == 0: - continue - - # Se salta el canal si está en un idioma filtrado - # Se muestran todos los canales si se elige "all" en el filtrado de idioma - # Se muestran sólo los idiomas filtrados, cast o lat - # Los canales de adultos se mostrarán siempre que estén activos - - # for channel_language_list in channel_language_list: - # if c in channel_parameters["language"]: - # L = True - # else: - # L = False - # logger.info('CCLANG= ' + channel_language + ' ' + str(channel_language_list)) if channel_language != "all" and "*" not in channel_parameters["language"] \ and channel_language not in str(channel_parameters["language"]): continue - # Se salta el canal si está en una categoria filtrado + # The channel is skipped if it is in a filtered category if category != "all" and category not in channel_parameters["categories"]: continue - # Si tiene configuración añadimos un item en el contexto + # If you have configuration we add an item in the context context = [] if channel_parameters["has_settings"]: context.append({"title": config.get_localized_string(70525), "channel": "setting", "action": "channel_config", "config": channel_parameters["channel"]}) channel_info = set_channel_info(channel_parameters) - # Si ha llegado hasta aquí, lo añade + # If it has come this far, add it channelslist.append(Item(title=channel_parameters["title"], channel=channel_parameters["channel"], action="mainlist", thumbnail=channel_parameters["thumbnail"], fanart=channel_parameters["fanart"], plot=channel_info, category=channel_parameters["title"], language=channel_parameters["language"], viewmode="list", context=context)) except: - logger.error("Se ha producido un error al leer los datos del canal '%s'" % channel) + logger.error("An error occurred while reading the channel data '%s'" % channel) import traceback logger.error(traceback.format_exc()) channelslist.sort(key=lambda item: item.title.lower().strip()) - if category == "all": - channel_parameters = channeltools.get_channel_parameters('url') - # Si prefiere el banner y el canal lo tiene, cambia ahora de idea - if view == "banner_" and "banner" in channel_parameters: - channel_parameters["thumbnail"] = channel_parameters["banner"] + if not config.get_setting("only_channel_icons"): + if category == "all": + channel_parameters = channeltools.get_channel_parameters('url') + # If you prefer the banner and the channel has it, now change your mind + if view == "banner_" and "banner" in channel_parameters: + channel_parameters["thumbnail"] = channel_parameters["banner"] - channelslist.insert(0, Item(title=config.get_localized_string(60088), action="mainlist", channel="url", - thumbnail=channel_parameters["thumbnail"], type="generic", viewmode="list")) + channelslist.insert(0, Item(title=config.get_localized_string(60088), action="mainlist", channel="url", + thumbnail=channel_parameters["thumbnail"], type="generic", viewmode="list")) + # Special Category + if category in ['movie', 'tvshow']: + titles = [config.get_localized_string(70028), config.get_localized_string(30985), config.get_localized_string(70559), config.get_localized_string(60264), config.get_localized_string(70560)] + ids = ['popular', 'top_rated', 'now_playing', 'on_the_air'] + for x in range(0,3): + if x == 2 and category != 'movie': + title=titles[x+1] + id = ids[x+1] + else: + title=titles[x] + id = ids[x] + channelslist.insert(x, + Item(channel='search', action='discover_list', title=title, search_type='list', + list_type='%s/%s' % (category.replace('show',''), id), mode=category, thumbnail=get_thumb(id+".png"))) - if category in ['movie', 'tvshow']: - titles = [config.get_localized_string(70028), config.get_localized_string(30985), config.get_localized_string(70559), config.get_localized_string(60264), config.get_localized_string(70560)] - ids = ['popular', 'top_rated', 'now_playing', 'on_the_air'] - for x in range(0,3): - if x == 2 and category != 'movie': - title=titles[x+1] - id = ids[x+1] - else: - title=titles[x] - id = ids[x] - channelslist.insert(x, - Item(channel='search', action='discover_list', title=title, search_type='list', - list_type='%s/%s' % (category.replace('show',''), id), mode=category, thumbnail=get_thumb(id+".png"))) - - channelslist.insert(3, Item(channel='search', action='genres_menu', title=config.get_localized_string(30987), - type=category.replace('show',''), mode=category ,thumbnail=get_thumb("genres.png"))) + channelslist.insert(3, Item(channel='search', action='genres_menu', title=config.get_localized_string(30987), + type=category.replace('show',''), mode=category ,thumbnail=get_thumb("genres.png"))) return channelslist @@ -314,15 +257,11 @@ def set_channel_info(parameters): '*':'Italiano, Sottotitolato in Italiano'} for lang in langs: - # if 'vos' in parameters['categories']: - # lang = '*' - # if 'sub-ita' in parameters['categories']: - # lang = 'ita' if lang in lang_dict: - if language != '' and language != '*' and not parameters['adult']: + if language != '' and language != '*': language = '%s, %s' % (language, lang_dict[lang]) - elif not parameters['adult']: + else: language = lang_dict[lang] if lang == '*': break @@ -352,26 +291,6 @@ def auto_filter(auto_lang=False): return lang - # import xbmc, xbmcaddon - - # addon = xbmcaddon.Addon('metadata.themoviedb.org') - # def_lang = addon.getSetting('language') - # lang = 'all' - # lang_list = ['all'] - - # lang_dict = {'it':'ita'} - # lang_list_dict = {'it':['ita','vosi']} - - # if config.get_setting("channel_language") == 'auto' or auto_lang == True: - # lang = lang_dict[def_lang] - # lang_list = lang_list_dict[def_lang] - - # else: - # lang = config.get_setting("channel_language", default="all") - # lang_list = lang_list_dict[def_lang] - - # return lang, lang_list - def thumb(item_or_itemlist=None, genre=False, thumb=''): import re diff --git a/core/channeltools.py b/core/channeltools.py index 62bbdde9..1ab338ef 100644 --- a/core/channeltools.py +++ b/core/channeltools.py @@ -14,13 +14,6 @@ default_file = dict() remote_path = 'https://raw.githubusercontent.com/kodiondemand/media/master/' - -def is_adult(channel_name): - logger.info("channel_name=" + channel_name) - channel_parameters = get_channel_parameters(channel_name) - return channel_parameters["adult"] - - def is_enabled(channel_name): logger.info("channel_name=" + channel_name) return get_channel_parameters(channel_name)["active"] and get_channel_setting("enabled", channel=channel_name, @@ -41,14 +34,8 @@ def get_channel_parameters(channel_name): channel_parameters["channel"] = channel_parameters.pop("id") # si no existe el key se declaran valor por defecto para que no de fallos en las funciones que lo llaman - channel_parameters["adult"] = channel_parameters.get("adult", False) - logger.info(channel_parameters["adult"]) - if channel_parameters["adult"]: - channel_parameters["update_url"] = channel_parameters.get("update_url", DEFAULT_UPDATE_URL + 'porn/') - else: - channel_parameters["update_url"] = channel_parameters.get("update_url", DEFAULT_UPDATE_URL) + channel_parameters["update_url"] = channel_parameters.get("update_url", DEFAULT_UPDATE_URL) channel_parameters["language"] = channel_parameters.get("language", ["all"]) - ## channel_parameters["adult"] = channel_parameters.get("adult", False) channel_parameters["active"] = channel_parameters.get("active", False) channel_parameters["include_in_global_search"] = channel_parameters.get("include_in_global_search", False) @@ -92,7 +79,6 @@ def get_channel_parameters(channel_name): logger.error(channel_name + ".json error \n%s" % ex) channel_parameters = dict() channel_parameters["channel"] = "" - channel_parameters["adult"] = False channel_parameters['active'] = False channel_parameters["language"] = "" channel_parameters["update_url"] = DEFAULT_UPDATE_URL @@ -108,14 +94,12 @@ def get_channel_json(channel_name): try: channel_path = filetools.join(config.get_runtime_path(), "channels", channel_name + ".json") if not filetools.isfile(channel_path): - channel_path = filetools.join(config.get_runtime_path(), 'channels', "porn", channel_name + ".json") + channel_path = filetools.join(config.get_runtime_path(), "specials", channel_name + ".json") if not filetools.isfile(channel_path): - channel_path = filetools.join(config.get_runtime_path(), "specials", channel_name + ".json") + channel_path = filetools.join(config.get_runtime_path(), "servers", channel_name + ".json") if not filetools.isfile(channel_path): - channel_path = filetools.join(config.get_runtime_path(), "servers", channel_name + ".json") - if not filetools.isfile(channel_path): - channel_path = filetools.join(config.get_runtime_path(), "servers", "debriders", - channel_name + ".json") + channel_path = filetools.join(config.get_runtime_path(), "servers", "debriders", + channel_name + ".json") if filetools.isfile(channel_path): # logger.info("channel_data=" + channel_path) @@ -182,10 +166,9 @@ def get_default_settings(channel_name): default_file = jsontools.load(filetools.read(default_path)) channel_path = filetools.join(config.get_runtime_path(), 'channels', channel_name + '.json') - adult_path = filetools.join(config.get_runtime_path(), 'channels', 'porn', channel_name + '.json') # from core.support import dbg; dbg() - if filetools.exists(channel_path) or filetools.exists(adult_path): + if filetools.exists(channel_path): default_controls = default_file['settings'] default_controls_renumber = default_file['renumber'] channel_json = get_channel_json(channel_name) diff --git a/core/downloadtools.py b/core/downloadtools.py index 628b9bcb..57b020aa 100644 --- a/core/downloadtools.py +++ b/core/downloadtools.py @@ -621,7 +621,7 @@ def downloadfileGzipped(url, pathfichero): else: tiempofalta = 0 logger.info(sec_to_hms(tiempofalta)) - progreso.update(percent, "%.2fMB/%.2fMB (%d%%) %.2f Kb/s %s falta " % + progreso.update(percent, "%.2fMB/%.2fMB (%d%%) %.2f Kb/s %s mancanti " % (descargadosmb, totalmb, percent, old_div(velocidad, 1024), sec_to_hms(tiempofalta))) break except: diff --git a/core/httptools.py b/core/httptools.py index 6f1bde5c..9cf736ed 100755 --- a/core/httptools.py +++ b/core/httptools.py @@ -41,12 +41,23 @@ if HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT == 0: HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT = # Random use of User-Agents, if nad is not specified HTTPTOOLS_DEFAULT_RANDOM_HEADERS = False -domainCF = list() -channelsCF = ['guardaserieclick', 'casacinema', 'dreamsub', 'ilgeniodellostreaming', 'piratestreaming', 'altadefinizioneclick', 'altadefinizione01_link', 'cineblog01'] -otherCF = ['altadefinizione-nuovo.link', 'wstream.video', 'akvideo.stream', 'backin.net', 'vcrypt.net'] -for ch in channelsCF: - domainCF.append(urlparse.urlparse(config.get_channel_url(name=ch)).hostname) -domainCF.extend(otherCF) +# old +# domainCF = list() +# channelsCF = ['guardaserieclick', 'ilgeniodellostreaming'] +# otherCF = ['akvideo.stream', 'backin.net', 'vcrypt.net'] +# for ch in channelsCF: +# domainCF.append(urlparse.urlparse(config.get_channel_url(name=ch)).hostname) +# domainCF.extend(otherCF) + +global CF_LIST +CF_LIST = list() +CF_LIST_PATH = os.path.join(config.get_data_path(), "CF_Domains.txt") + +if os.path.exists(CF_LIST_PATH): + with open(CF_LIST_PATH, "rb") as CF_File: + CF_LIST = CF_File.read().splitlines() + +FORCE_CLOUDSCRAPER_LIST = ['akvideo.stream'] def get_user_agent(): # Returns the global user agent to be used when necessary for the url. @@ -212,7 +223,7 @@ def show_infobox(info_dict): def downloadpage(url, **opt): - logger.info() + # logger.info() """ Open a url and return the data obtained @@ -257,9 +268,10 @@ def downloadpage(url, **opt): """ url = scrapertools.unescape(url) domain = urlparse.urlparse(url).netloc - global domainCF + global CF_LIST CF = False - if domain in domainCF or opt.get('cf', False): + + if domain in FORCE_CLOUDSCRAPER_LIST: from lib import cloudscraper session = cloudscraper.create_scraper() CF = True @@ -267,6 +279,10 @@ def downloadpage(url, **opt): from lib import requests session = requests.session() + if domain in CF_LIST or opt.get('CF', False): + url = 'https://web.archive.org/save/' + url + CF = True + if config.get_setting('resolver_dns') and not opt.get('use_requests', False): from specials import resolverdns session.mount('https://', resolverdns.CipherSuiteAdapter(domain, CF)) @@ -383,7 +399,18 @@ def downloadpage(url, **opt): response_code = req.status_code + if req.headers.get('Server', '').startswith('cloudflare') and response_code in [429, 503, 403] and not opt.get('CF', False): + if domain not in CF_LIST: + opt["CF"] = True + with open(CF_LIST_PATH, "a") as CF_File: + CF_File.write("%s\n" % domain) + logger.debug("CF retry... for domain: %s" % domain) + return downloadpage(url, **opt) + response['data'] = req.content if req.content else '' + if CF: + import re + response['data'] = re.sub('["|\']/save/[^"]*(https?://[^"]+)', '"\\1', response['data']) response['url'] = req.url if type(response['data']) != str: diff --git a/core/item.py b/core/item.py index 5ab216ea..f3d33b9a 100644 --- a/core/item.py +++ b/core/item.py @@ -41,7 +41,7 @@ class InfoLabels(dict): # super(InfoLabels, self).__setitem__('code', value) super(InfoLabels, self).__setitem__('imdb_id', str(value)) - elif name == "mediatype" and value not in ["list", "movie", "tvshow", "season", "episode"]: + elif name == "mediatype" and value not in ["list", "movie", "tvshow", "season", "episode", "music"]: super(InfoLabels, self).__setitem__('mediatype', 'list') elif name in ['tmdb_id', 'tvdb_id', 'noscrap_id']: diff --git a/core/jsontools.py b/core/jsontools.py index 07733fd8..d12a5213 100644 --- a/core/jsontools.py +++ b/core/jsontools.py @@ -6,6 +6,7 @@ import traceback from platformcode import logger +from inspect import stack try: import json @@ -43,6 +44,7 @@ def load(*args, **kwargs): except: logger.error("**NOT** able to load the JSON") logger.error(traceback.format_exc()) + logger.error('ERROR STACK ' + str(stack()[1][3])) value = {} return value @@ -146,7 +148,7 @@ def check_to_backup(data, fname, dict_data): logger.debug("The file is empty: %s" % fname) -def update_node(dict_node, name_file, node, path=None): +def update_node(dict_node, name_file, node, path=None, silent=False): """ actualiza el json_data de un fichero con el diccionario pasado @@ -162,7 +164,7 @@ def update_node(dict_node, name_file, node, path=None): @return json_data @rtype: dict """ - logger.info() + if not silent: logger.info() from platformcode import config from core import filetools @@ -183,14 +185,14 @@ def update_node(dict_node, name_file, node, path=None): # es un dict if dict_data: if node in dict_data: - logger.debug(" the key exists %s" % node) + if not silent: logger.debug(" the key exists %s" % node) dict_data[node] = dict_node else: - logger.debug(" The key does NOT exist %s" % node) + if not silent: logger.debug(" The key does NOT exist %s" % node) new_dict = {node: dict_node} dict_data.update(new_dict) else: - logger.debug(" It is NOT a dict") + if not silent: logger.debug(" It is NOT a dict") dict_data = {node: dict_node} json_data = dump(dict_data) result = filetools.write(fname, json_data) diff --git a/core/support.py b/core/support.py index 22dd0841..589e1b0b 100755 --- a/core/support.py +++ b/core/support.py @@ -6,6 +6,9 @@ import inspect import os import re import sys + +from lib.guessit import guessit + PY3 = False if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int if PY3: @@ -137,17 +140,6 @@ def regexDbg(item, patron, headers, data=''): webbrowser.open(url + "/r/" + permaLink) -def scrape2(item, patron = '', listGroups = [], headers="", blacklist="", data="", patronBlock="", - patronNext="", action="findvideos", addVideolibrary = True, typeContentDict={}, typeActionDict={}): - m = re.search(r'(?<!\\|\[)\((?!\?)', patron) - n = 0 - while m: - patron = patron[:m.end()] + '?P<' + listGroups[n] + '>' + patron[m.end():] - m = re.search(r'(?<!\\|\[)\((?!\?)', patron) - n += 1 - regexDbg(item, patron, headers) - - def scrapeLang(scraped, lang, longtitle): ## Aggiunto/modificato per gestire i siti che hanno i video ## in ita e subita delle serie tv nella stessa pagina @@ -171,7 +163,7 @@ def cleantitle(title): cleantitle = title.replace('"', "'").replace('×', 'x').replace('–', '-').strip() return cleantitle -def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, typeContentDict, typeActionDict, blacklist, search, pag, function, lang): +def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, typeContentDict, typeActionDict, blacklist, search, pag, function, lang, sceneTitle): itemlist = [] log("scrapeBlock qui") if debug: @@ -240,17 +232,6 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t Type = scraped['type'] if scraped['type'] else '' plot = cleantitle(scraped["plot"]) if scraped["plot"] else '' - # make formatted Title [longtitle] - s = ' - ' - title = episode + (s if episode and title else '') + title - longtitle = title + (s if title and title2 else '') + title2 - longtitle = typo(longtitle, 'bold') - longtitle += typo(quality, '_ [] color kod') if quality else '' - longtitle += typo(scraped['size'], '_ [] color kod') if scraped['size'] else '' - longtitle += typo(scraped['seed']+ ' SEEDS', '_ [] color kod') if scraped['seed'] else '' - - lang1, longtitle = scrapeLang(scraped, lang, longtitle) - # if title is set, probably this is a list of episodes or video sources # necessaria l'aggiunta di == scraped["title"] altrimenti non prende i gruppi dopo le categorie if item.infoLabels["title"] == scraped["title"]: @@ -275,6 +256,49 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t if scraped["rating"]: infolabels['rating'] = scrapertools.decodeHtmlentities(scraped["rating"]) + # make formatted Title [longtitle] + s = ' - ' + title = episode + (s if episode and title else '') + title + longtitle = title + (s if title and title2 else '') + title2 + '\n' + + if sceneTitle: + try: + parsedTitle = guessit(title) + title = longtitle = parsedTitle.get('title', '') + log('TITOLO',title) + if parsedTitle.get('source'): + quality = str(parsedTitle.get('source')) + if parsedTitle.get('screen_size'): + quality += ' ' + str(parsedTitle.get('screen_size', '')) + if not scraped['year']: + infolabels['year'] = parsedTitle.get('year', '') + if parsedTitle.get('episode') and parsedTitle.get('season'): + longtitle = title + s + + if type(parsedTitle.get('season')) == list: + longtitle += str(parsedTitle.get('season')[0]) + '-' + str(parsedTitle.get('season')[-1]) + else: + longtitle += str(parsedTitle.get('season')) + + if type(parsedTitle.get('episode')) == list: + longtitle += 'x' + str(parsedTitle.get('episode')[0]).zfill(2) + '-' + str(parsedTitle.get('episode')[-1]).zfill(2) + else: + longtitle += 'x' + str(parsedTitle.get('episode')).zfill(2) + elif parsedTitle.get('season') and type(parsedTitle.get('season')) == list: + longtitle += s + config.get_localized_string(30140) + " " +str(parsedTitle.get('season')[0]) + '-' + str(parsedTitle.get('season')[-1]) + elif parsedTitle.get('season'): + longtitle += s + config.get_localized_string(60027) % str(parsedTitle.get('season')) + if parsedTitle.get('episode_title'): + longtitle += s + parsedTitle.get('episode_title') + except: + log('Error') + + longtitle = typo(longtitle, 'bold') + lang1, longtitle = scrapeLang(scraped, lang, longtitle) + longtitle += typo(quality, '_ [] color kod') if quality else '' + longtitle += typo(scraped['size'], '_ [] color kod') if scraped['size'] else '' + longtitle += typo(scraped['seed'] + ' SEEDS', '_ [] color kod') if scraped['seed'] else '' + AC = CT = '' if typeContentDict: for name, variants in typeContentDict.items(): @@ -288,7 +312,6 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t AC = name break else: AC = action - if (scraped["title"] not in blacklist) and (search.lower() in longtitle.lower()): it = Item( channel=item.channel, @@ -380,6 +403,7 @@ def scrape(func): if 'pagination' in args and inspect.stack()[1][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes']: pagination = args['pagination'] if args['pagination'] else 20 else: pagination = '' lang = args['deflang'] if 'deflang' in args else '' + sceneTitle = args.get('sceneTitle') pag = item.page if item.page else 1 # pagination matches = [] @@ -402,7 +426,7 @@ def scrape(func): if 'season' in bl and bl['season']: item.season = bl['season'] blockItemlist, blockMatches = scrapeBlock(item, args, bl['block'], patron, headers, action, pagination, debug, - typeContentDict, typeActionDict, blacklist, search, pag, function, lang) + typeContentDict, typeActionDict, blacklist, search, pag, function, lang, sceneTitle) for it in blockItemlist: if 'lang' in bl: it.contentLanguage, it.title = scrapeLang(bl, it.contentLanguage, it.title) @@ -413,7 +437,7 @@ def scrape(func): matches.extend(blockMatches) elif patron: itemlist, matches = scrapeBlock(item, args, data, patron, headers, action, pagination, debug, typeContentDict, - typeActionDict, blacklist, search, pag, function, lang) + typeActionDict, blacklist, search, pag, function, lang, sceneTitle) if 'itemlistHook' in args: itemlist = args['itemlistHook'](itemlist) @@ -453,7 +477,7 @@ def scrape(func): page=pag + 1, thumbnail=thumb())) - if action != 'play' and function != 'episodios' and 'patronMenu' not in args: + if action != 'play' and function != 'episodios' and 'patronMenu' not in args and item.contentType in ['movie', 'tvshow', 'episode']: tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) from specials import autorenumber @@ -826,7 +850,6 @@ def match(item_url_string, **args): match: first match matches: all the matches ''' - log() matches = blocks = [] url = None @@ -839,7 +862,7 @@ def match(item_url_string, **args): string = args.get('string', False) # remove scrape arguments - args = dict([(key, val) for key, val in args.items() if key not in ['patron', 'patronBlock', 'patronBlocks', 'debug', 'debugBlock', 'string']]) + args = dict([(key, val) for key, val in args.items() if key not in ['patron', 'patronBlock', 'patronBlocks', 'debug', 'debugBlock', 'string']]) # check type of item_url_string if string: @@ -927,11 +950,13 @@ def download(itemlist, item, typography='', function_level=1, function=''): elif item.contentType == 'episode': from_action = 'findvideos' title = typo(config.get_localized_string(60356), typography) + ' - ' + item.title - else: + elif item.contentType == 'tvshow': from_action = 'episodios' title = typo(config.get_localized_string(60355), typography) + else: # content type does not support download + return itemlist - function = function if function else inspect.stack()[function_level][3] + # function = function if function else inspect.stack()[function_level][3] contentSerieName=item.contentSerieName if item.contentSerieName else '' contentTitle=item.contentTitle if item.contentTitle else '' @@ -1119,21 +1144,7 @@ def controls(itemlist, item, AutoPlay=True, CheckLinks=True, down_load=True, vid from platformcode.config import get_setting CL = get_setting('checklinks') or get_setting('checklinks', item.channel) - autoplay_node = jsontools.get_node_from_file('autoplay', 'AUTOPLAY') - channel_node = autoplay_node.get(item.channel, {}) - if not channel_node: # non ha mai aperto il menu del canale quindi in autoplay_data.json non c'e la key - try: - channelFile = __import__('channels.' + item.channel, fromlist=["channels.%s" % item.channel]) - except: - channelFile = __import__('specials.' + item.channel, fromlist=["specials.%s" % item.channel]) - if hasattr(channelFile, 'list_servers') and hasattr(channelFile, 'list_quality'): - autoplay.init(item.channel, channelFile.list_servers, channelFile.list_quality) - - autoplay_node = jsontools.get_node_from_file('autoplay', 'AUTOPLAY') - channel_node = autoplay_node.get(item.channel, {}) - settings_node = channel_node.get('settings', {}) - AP = get_setting('autoplay') or (settings_node['active'] if 'active' in settings_node else False) - HS = config.get_setting('hide_servers') or (settings_node['hide_servers'] if 'hide_server' in settings_node else False) + AP, HS = autoplay.get_channel_AP_HS(item) if CL and not AP: if get_setting('checklinks', item.channel): diff --git a/core/tmdb.py b/core/tmdb.py index 0e3c137e..18b7464d 100644 --- a/core/tmdb.py +++ b/core/tmdb.py @@ -826,7 +826,7 @@ class Tmdb(object): self.busqueda_texto = re.sub('\[\\\?(B|I|COLOR)\s?[^\]]*\]', '', self.texto_buscado).strip() self.busqueda_tipo = kwargs.get('tipo', '') self.busqueda_idioma = kwargs.get('idioma_busqueda', def_lang) - self.busqueda_include_adult = kwargs.get('include_adult', False) + # self.busqueda_include_adult = kwargs.get('include_adult', False) self.busqueda_year = kwargs.get('year', '') self.busqueda_filtro = kwargs.get('filtro', {}) self.discover = kwargs.get('discover', {}) @@ -978,7 +978,7 @@ class Tmdb(object): # &include_adult=false&page=1 url = ('http://api.themoviedb.org/3/search/%s?api_key=a1ab8b8669da03637a4b98fa39c39228&query=%s&language=%s' '&include_adult=%s&page=%s' % (self.busqueda_tipo, text_quote, - self.busqueda_idioma, self.busqueda_include_adult, page)) + self.busqueda_idioma, True, page)) if self.busqueda_year: url += '&year=%s' % self.busqueda_year diff --git a/core/videolibrarytools.py b/core/videolibrarytools.py index 1b25cc07..006f631b 100644 --- a/core/videolibrarytools.py +++ b/core/videolibrarytools.py @@ -111,7 +111,7 @@ def save_movie(item, silent=False): # Si llegados a este punto no tenemos titulo, salimos if not item.contentTitle or not item.channel: logger.debug("contentTitle NOT FOUND") - return 0, 0, -1 # Salimos sin guardar + return 0, 0, -1, path # Salimos sin guardar scraper_return = scraper.find_and_set_infoLabels(item) @@ -123,7 +123,7 @@ def save_movie(item, silent=False): # TODO de momento si no hay resultado no añadimos nada, # aunq podriamos abrir un cuadro para introducir el identificador/nombre a mano logger.debug("NOT FOUND IN SCRAPER OR DO NOT HAVE code") - return 0, 0, -1 + return 0, 0, -1, path _id = item.infoLabels['code'][0] @@ -158,7 +158,7 @@ def save_movie(item, silent=False): logger.info("Creating movie directory:" + path) if not filetools.mkdir(path): logger.debug("Could not create directory") - return 0, 0, -1 + return 0, 0, -1, path nfo_path = filetools.join(path, "%s [%s].nfo" % (base_name, _id)) strm_path = filetools.join(path, "%s.strm" % base_name) @@ -227,14 +227,14 @@ def save_movie(item, silent=False): xbmc_videolibrary.update() if not silent: p_dialog.close() - return insertados, sobreescritos, fallidos + return insertados, sobreescritos, fallidos, path # Si llegamos a este punto es por q algo ha fallado logger.error("Could not save %s in the video library" % item.contentTitle) if not silent: p_dialog.update(100, config.get_localized_string(60063), item.contentTitle) p_dialog.close() - return 0, 0, -1 + return 0, 0, -1, path def update_renumber_options(item, head_nfo, path): from core import jsontools @@ -586,6 +586,22 @@ def save_episodes(path, episodelist, serie, silent=False, overwrite=True): logger.info("There is no episode list, we go out without creating strm") return 0, 0, 0 + # process local episodes + local_episodes_path = '' + nfo_path = filetools.join(path, "tvshow.nfo") + head_nfo, item_nfo = read_nfo(nfo_path) + if item_nfo.update_last: + local_episodes_path = item_nfo.local_episodes_path + elif config.get_setting("local_episodes", "videolibrary"): + done, local_episodes_path = config_local_episodes_path(path, serie.show) + if done < 0: + logger.info("An issue has occurred while configuring local episodes, going out without creating strm") + return 0, 0, done + item_nfo.local_episodes_path = local_episodes_path + filetools.write(nfo_path, head_nfo + item_nfo.tojson()) + if local_episodes_path: + process_local_episodes(local_episodes_path, path) + insertados = 0 sobreescritos = 0 fallidos = 0 @@ -671,9 +687,6 @@ def save_episodes(path, episodelist, serie, silent=False, overwrite=True): except: t = 0 - local_episodelist = get_local_content(path) - - last_season_episode = '' for i, e in enumerate(scraper.sort_episode_list(new_episodelist)): if not silent: p_dialog.update(int(math.ceil((i + 1) * t)), config.get_localized_string(60064), e.title) @@ -695,9 +708,11 @@ def save_episodes(path, episodelist, serie, silent=False, overwrite=True): nfo_path = filetools.join(path, "%s.nfo" % season_episode) json_path = filetools.join(path, ("%s [%s].json" % (season_episode, e.channel)).lower()) - if season_episode in local_episodelist: - logger.info('Skipped: Serie ' + serie.contentSerieName + ' ' + season_episode + ' available as local content') + # check if the episode has been downloaded + if filetools.join(path, "%s [downloads].json" % season_episode) in ficheros: + logger.info('INFO: "%s" episode %s has been downloaded, skipping it' % (serie.contentSerieName, season_episode)) continue + strm_exists = strm_path in ficheros nfo_exists = nfo_path in ficheros json_exists = json_path in ficheros @@ -808,7 +823,8 @@ def save_episodes(path, episodelist, serie, silent=False, overwrite=True): tvshow_item.infoLabels["title"] = tvshow_item.infoLabels["tvshowtitle"] if max_sea == high_sea and max_epi == high_epi and (tvshow_item.infoLabels["status"] == "Ended" - or tvshow_item.infoLabels["status"] == "Canceled") and insertados == 0 and fallidos == 0: + or tvshow_item.infoLabels["status"] == "Canceled") and insertados == 0 and fallidos == 0 \ + and not tvshow_item.local_episodes_path: tvshow_item.active = 0 # ... no la actualizaremos más logger.debug("%s [%s]: serie 'Terminada' o 'Cancelada'. Se desactiva la actualización periódica" % \ (serie.contentSerieName, serie.channel)) @@ -838,19 +854,72 @@ def save_episodes(path, episodelist, serie, silent=False, overwrite=True): return insertados, sobreescritos, fallidos -def get_local_content(path): +def config_local_episodes_path(path, title, silent=False): logger.info() - local_episodelist = [] - for root, folders, files in filetools.walk(path): - for file in files: - season_episode = scrapertools.get_season_and_episode(file) - if season_episode == "" or filetools.exists(filetools.join(path, "%s.strm" % season_episode)): - continue - local_episodelist.append(season_episode) - local_episodelist = sorted(set(local_episodelist)) + local_episodes_path = '' + if not silent: + silent = platformtools.dialog_yesno(config.get_localized_string(30131), config.get_localized_string(80044) % title) + if silent: + if config.is_xbmc() and not config.get_setting("videolibrary_kodi"): + platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(80043)) + local_episodes_path = platformtools.dialog_browse(0, config.get_localized_string(80046)) + if local_episodes_path == '': + logger.info("User has canceled the dialog") + return -2, local_episodes_path + elif path in local_episodes_path: + platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(80045)) + logger.info("Selected folder is the same of the TV show one") + return -2, local_episodes_path - return local_episodelist + if local_episodes_path: + # import artwork + artwork_extensions = ['.jpg', '.jpeg', '.png'] + files = filetools.listdir(local_episodes_path) + for file in files: + if os.path.splitext(file)[1] in artwork_extensions: + filetools.copy(filetools.join(local_episodes_path, file), filetools.join(path, file)) + + return 0, local_episodes_path + + +def process_local_episodes(local_episodes_path, path): + logger.info() + + sub_extensions = ['.srt', '.sub', '.sbv', '.ass', '.idx', '.ssa', '.smi'] + artwork_extensions = ['.jpg', '.jpeg', '.png'] + extensions = sub_extensions + artwork_extensions + + local_episodes_list = [] + files_list = [] + for root, folders, files in filetools.walk(local_episodes_path): + for file in files: + if os.path.splitext(file)[1] in extensions: + continue + season_episode = scrapertools.get_season_and_episode(file) + if season_episode == "": + continue + local_episodes_list.append(season_episode) + files_list.append(file) + + nfo_path = filetools.join(path, "tvshow.nfo") + head_nfo, item_nfo = read_nfo(nfo_path) + + # if a local episode has been added, overwrites the strm + for season_episode, file in zip(local_episodes_list, files_list): + if not season_episode in item_nfo.local_episodes_list: + filetools.write(filetools.join(path, season_episode + '.strm'), filetools.join(root, file)) + + # if a local episode has been removed, deletes the strm + for season_episode in set(item_nfo.local_episodes_list).difference(local_episodes_list): + filetools.remove(filetools.join(path, season_episode + '.strm')) + + # updates the local episodes path and list in the nfo + if not local_episodes_list: + item_nfo.local_episodes_path = '' + item_nfo.local_episodes_list = sorted(set(local_episodes_list)) + + filetools.write(nfo_path, head_nfo + item_nfo.tojson()) def add_movie(item): @@ -883,12 +952,13 @@ def add_movie(item): # del item.tmdb_stat #Limpiamos el status para que no se grabe en la Videoteca new_item = item.clone(action="findvideos") - insertados, sobreescritos, fallidos = save_movie(new_item) + insertados, sobreescritos, fallidos, path = save_movie(new_item) if fallidos == 0: platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(30135) % new_item.contentTitle) # 'se ha añadido a la videoteca' else: + filetools.rmdirtree(path) platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(60066) % new_item.contentTitle) #"ERROR, la pelicula NO se ha añadido a la videoteca") @@ -968,13 +1038,18 @@ def add_tvshow(item, channel=None): insertados, sobreescritos, fallidos, path = save_tvshow(item, itemlist) if not insertados and not sobreescritos and not fallidos: + filetools.rmdirtree(path) platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(60067) % item.show) logger.error("La serie %s no se ha podido añadir a la videoteca. No se ha podido obtener ningun episodio" % item.show) elif fallidos == -1: + filetools.rmdirtree(path) platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(60068) % item.show) logger.error("La serie %s no se ha podido añadir a la videoteca" % item.show) + elif fallidos == -2: + filetools.rmdirtree(path) + elif fallidos > 0: platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(60069) % item.show) logger.error("No se han podido añadir %s episodios de la serie %s a la videoteca" % (fallidos, item.show)) diff --git a/lib/babelfish/__init__.py b/lib/babelfish/__init__.py new file mode 100755 index 00000000..559705a2 --- /dev/null +++ b/lib/babelfish/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +__title__ = 'babelfish' +__version__ = '0.5.5-dev' +__author__ = 'Antoine Bertin' +__license__ = 'BSD' +__copyright__ = 'Copyright 2015 the BabelFish authors' + +import sys + +if sys.version_info[0] >= 3: + basestr = str +else: + basestr = basestring + +from .converters import (LanguageConverter, LanguageReverseConverter, LanguageEquivalenceConverter, CountryConverter, + CountryReverseConverter) +from .country import country_converters, COUNTRIES, COUNTRY_MATRIX, Country +from .exceptions import Error, LanguageConvertError, LanguageReverseError, CountryConvertError, CountryReverseError +from .language import language_converters, LANGUAGES, LANGUAGE_MATRIX, Language +from .script import SCRIPTS, SCRIPT_MATRIX, Script diff --git a/lib/babelfish/converters/__init__.py b/lib/babelfish/converters/__init__.py new file mode 100755 index 00000000..5dc98ddf --- /dev/null +++ b/lib/babelfish/converters/__init__.py @@ -0,0 +1,289 @@ +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +import collections +import functools +from importlib import import_module + +# from pkg_resources import iter_entry_points, EntryPoint +from ..exceptions import LanguageConvertError, LanguageReverseError + + +# from https://github.com/kennethreitz/requests/blob/master/requests/structures.py +class CaseInsensitiveDict(collections.MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``collections.MutableMapping`` as well as dict's ``copy``. Also + provides ``lower_items``. + + All keys are expected to be strings. The structure remembers the + case of the last key to be set, and ``iter(instance)``, + ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` + will contain case-sensitive keys. However, querying and contains + testing is case insensitive: + + cid = CaseInsensitiveDict() + cid['English'] = 'eng' + cid['ENGLISH'] == 'eng' # True + list(cid) == ['English'] # True + + If the constructor, ``.update``, or equality comparison + operations are given keys that have equal ``.lower()``s, the + behavior is undefined. + + """ + def __init__(self, data=None, **kwargs): + self._store = dict() + if data is None: + data = {} + self.update(data, **kwargs) + + def __setitem__(self, key, value): + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] + + def __delitem__(self, key): + del self._store[key.lower()] + + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) + + def __len__(self): + return len(self._store) + + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + return ( + (lowerkey, keyval[1]) + for (lowerkey, keyval) + in self._store.items() + ) + + def __eq__(self, other): + if isinstance(other, collections.Mapping): + other = CaseInsensitiveDict(other) + else: + return NotImplemented + # Compare insensitively + return dict(self.lower_items()) == dict(other.lower_items()) + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, dict(self.items())) + + +class LanguageConverter(object): + """A :class:`LanguageConverter` supports converting an alpha3 language code with an + alpha2 country code and a script code into a custom code + + .. attribute:: codes + + Set of possible custom codes + + """ + def convert(self, alpha3, country=None, script=None): + """Convert an alpha3 language code with an alpha2 country code and a script code + into a custom code + + :param string alpha3: ISO-639-3 language code + :param country: ISO-3166 country code, if any + :type country: string or None + :param script: ISO-15924 script code, if any + :type script: string or None + :return: the corresponding custom code + :rtype: string + :raise: :class:`~babelfish.exceptions.LanguageConvertError` + + """ + raise NotImplementedError + + +class LanguageReverseConverter(LanguageConverter): + """A :class:`LanguageConverter` able to reverse a custom code into a alpha3 + ISO-639-3 language code, alpha2 ISO-3166-1 country code and ISO-15924 script code + + """ + def reverse(self, code): + """Reverse a custom code into alpha3, country and script code + + :param string code: custom code to reverse + :return: the corresponding alpha3 ISO-639-3 language code, alpha2 ISO-3166-1 country code and ISO-15924 script code + :rtype: tuple + :raise: :class:`~babelfish.exceptions.LanguageReverseError` + + """ + raise NotImplementedError + + +class LanguageEquivalenceConverter(LanguageReverseConverter): + """A :class:`LanguageEquivalenceConverter` is a utility class that allows you to easily define a + :class:`LanguageReverseConverter` by only specifying the dict from alpha3 to their corresponding symbols. + + You must specify the dict of equivalence as a class variable named SYMBOLS. + + If you also set the class variable CASE_SENSITIVE to ``True`` then the reverse conversion function will be + case-sensitive (it is case-insensitive by default). + + Example:: + + class MyCodeConverter(babelfish.LanguageEquivalenceConverter): + CASE_SENSITIVE = True + SYMBOLS = {'fra': 'mycode1', 'eng': 'mycode2'} + + """ + CASE_SENSITIVE = False + + def __init__(self): + self.codes = set() + self.to_symbol = {} + if self.CASE_SENSITIVE: + self.from_symbol = {} + else: + self.from_symbol = CaseInsensitiveDict() + + for alpha3, symbol in self.SYMBOLS.items(): + self.to_symbol[alpha3] = symbol + self.from_symbol[symbol] = (alpha3, None, None) + self.codes.add(symbol) + + def convert(self, alpha3, country=None, script=None): + try: + return self.to_symbol[alpha3] + except KeyError: + raise LanguageConvertError(alpha3, country, script) + + def reverse(self, code): + try: + return self.from_symbol[code] + except KeyError: + raise LanguageReverseError(code) + + +class CountryConverter(object): + """A :class:`CountryConverter` supports converting an alpha2 country code + into a custom code + + .. attribute:: codes + + Set of possible custom codes + + """ + def convert(self, alpha2): + """Convert an alpha2 country code into a custom code + + :param string alpha2: ISO-3166-1 language code + :return: the corresponding custom code + :rtype: string + :raise: :class:`~babelfish.exceptions.CountryConvertError` + + """ + raise NotImplementedError + + +class CountryReverseConverter(CountryConverter): + """A :class:`CountryConverter` able to reverse a custom code into a alpha2 + ISO-3166-1 country code + + """ + def reverse(self, code): + """Reverse a custom code into alpha2 code + + :param string code: custom code to reverse + :return: the corresponding alpha2 ISO-3166-1 country code + :rtype: string + :raise: :class:`~babelfish.exceptions.CountryReverseError` + + """ + raise NotImplementedError + + +class ConverterManager(object): + """Manager for babelfish converters behaving like a dict with lazy loading + + Loading is done in this order: + + * Entry point converters + * Registered converters + * Internal converters + + .. attribute:: entry_point + + The entry point where to look for converters + + .. attribute:: internal_converters + + Internal converters with entry point syntax + + """ + entry_point = '' + internal_converters = [] + + def __init__(self): + #: Registered converters with entry point syntax + self.registered_converters = [] + + #: Loaded converters + self.converters = {} + + def __getitem__(self, name): + """Get a converter, lazy loading it if necessary""" + if name in self.converters: + return self.converters[name] + # for ep in iter_entry_points(self.entry_point): + # if ep.name == name: + # self.converters[ep.name] = ep.load()() + # return self.converters[ep.name] + def parse(str): + import re + match = re.match('(?P<name>\w+) = (?P<module>[a-z0-9.]+):(?P<class>\w+)', str) + print match.groupdict() + return match.groupdict() + for ep in (parse(c) for c in self.registered_converters + self.internal_converters): + if ep.get('name') == name: + cl = getattr(import_module(ep.get('module')), ep.get('class')) + self.converters[ep.get('name')] = cl() + return self.converters[ep.get('name')] + raise KeyError(name) + + def __setitem__(self, name, converter): + """Load a converter""" + self.converters[name] = converter + + def __delitem__(self, name): + """Unload a converter""" + del self.converters[name] + + def __iter__(self): + """Iterator over loaded converters""" + return iter(self.converters) + + def register(self, entry_point): + """Register a converter + + :param string entry_point: converter to register (entry point syntax) + :raise: ValueError if already registered + + """ + if entry_point in self.registered_converters: + raise ValueError('Already registered') + self.registered_converters.insert(0, entry_point) + + def unregister(self, entry_point): + """Unregister a converter + + :param string entry_point: converter to unregister (entry point syntax) + + """ + self.registered_converters.remove(entry_point) + + def __contains__(self, name): + return name in self.converters diff --git a/lib/babelfish/converters/alpha2.py b/lib/babelfish/converters/alpha2.py new file mode 100755 index 00000000..aca973dd --- /dev/null +++ b/lib/babelfish/converters/alpha2.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +from __future__ import unicode_literals +from . import LanguageEquivalenceConverter +from ..language import LANGUAGE_MATRIX + + +class Alpha2Converter(LanguageEquivalenceConverter): + CASE_SENSITIVE = True + SYMBOLS = {} + for iso_language in LANGUAGE_MATRIX: + if iso_language.alpha2: + SYMBOLS[iso_language.alpha3] = iso_language.alpha2 diff --git a/lib/babelfish/converters/alpha3b.py b/lib/babelfish/converters/alpha3b.py new file mode 100755 index 00000000..e90c5f5e --- /dev/null +++ b/lib/babelfish/converters/alpha3b.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +from __future__ import unicode_literals +from . import LanguageEquivalenceConverter +from ..language import LANGUAGE_MATRIX + + +class Alpha3BConverter(LanguageEquivalenceConverter): + CASE_SENSITIVE = True + SYMBOLS = {} + for iso_language in LANGUAGE_MATRIX: + if iso_language.alpha3b: + SYMBOLS[iso_language.alpha3] = iso_language.alpha3b diff --git a/lib/babelfish/converters/alpha3t.py b/lib/babelfish/converters/alpha3t.py new file mode 100755 index 00000000..6de6e4c6 --- /dev/null +++ b/lib/babelfish/converters/alpha3t.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +from __future__ import unicode_literals +from . import LanguageEquivalenceConverter +from ..language import LANGUAGE_MATRIX + + +class Alpha3TConverter(LanguageEquivalenceConverter): + CASE_SENSITIVE = True + SYMBOLS = {} + for iso_language in LANGUAGE_MATRIX: + if iso_language.alpha3t: + SYMBOLS[iso_language.alpha3] = iso_language.alpha3t diff --git a/lib/babelfish/converters/countryname.py b/lib/babelfish/converters/countryname.py new file mode 100755 index 00000000..ff36c878 --- /dev/null +++ b/lib/babelfish/converters/countryname.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +from __future__ import unicode_literals +from . import CountryReverseConverter, CaseInsensitiveDict +from ..country import COUNTRY_MATRIX +from ..exceptions import CountryConvertError, CountryReverseError + + +class CountryNameConverter(CountryReverseConverter): + def __init__(self): + self.codes = set() + self.to_name = {} + self.from_name = CaseInsensitiveDict() + for country in COUNTRY_MATRIX: + self.codes.add(country.name) + self.to_name[country.alpha2] = country.name + self.from_name[country.name] = country.alpha2 + + def convert(self, alpha2): + if alpha2 not in self.to_name: + raise CountryConvertError(alpha2) + return self.to_name[alpha2] + + def reverse(self, name): + if name not in self.from_name: + raise CountryReverseError(name) + return self.from_name[name] diff --git a/lib/babelfish/converters/name.py b/lib/babelfish/converters/name.py new file mode 100755 index 00000000..8dd865b7 --- /dev/null +++ b/lib/babelfish/converters/name.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +from __future__ import unicode_literals +from . import LanguageEquivalenceConverter +from ..language import LANGUAGE_MATRIX + + +class NameConverter(LanguageEquivalenceConverter): + CASE_SENSITIVE = False + SYMBOLS = {} + for iso_language in LANGUAGE_MATRIX: + if iso_language.name: + SYMBOLS[iso_language.alpha3] = iso_language.name diff --git a/lib/babelfish/converters/opensubtitles.py b/lib/babelfish/converters/opensubtitles.py new file mode 100755 index 00000000..101c40fd --- /dev/null +++ b/lib/babelfish/converters/opensubtitles.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +from __future__ import unicode_literals +from . import LanguageReverseConverter, CaseInsensitiveDict +from ..exceptions import LanguageReverseError +from ..language import language_converters + + +class OpenSubtitlesConverter(LanguageReverseConverter): + def __init__(self): + self.alpha3b_converter = language_converters['alpha3b'] + self.alpha2_converter = language_converters['alpha2'] + self.to_opensubtitles = {('por', 'BR'): 'pob', ('gre', None): 'ell', ('srp', None): 'scc', ('srp', 'ME'): 'mne'} + self.from_opensubtitles = CaseInsensitiveDict({'pob': ('por', 'BR'), 'pb': ('por', 'BR'), 'ell': ('ell', None), + 'scc': ('srp', None), 'mne': ('srp', 'ME')}) + self.codes = (self.alpha2_converter.codes | self.alpha3b_converter.codes | set(['pob', 'pb', 'scc', 'mne'])) + + def convert(self, alpha3, country=None, script=None): + alpha3b = self.alpha3b_converter.convert(alpha3, country, script) + if (alpha3b, country) in self.to_opensubtitles: + return self.to_opensubtitles[(alpha3b, country)] + return alpha3b + + def reverse(self, opensubtitles): + if opensubtitles in self.from_opensubtitles: + return self.from_opensubtitles[opensubtitles] + for conv in [self.alpha3b_converter, self.alpha2_converter]: + try: + return conv.reverse(opensubtitles) + except LanguageReverseError: + pass + raise LanguageReverseError(opensubtitles) diff --git a/lib/babelfish/converters/scope.py b/lib/babelfish/converters/scope.py new file mode 100755 index 00000000..73540063 --- /dev/null +++ b/lib/babelfish/converters/scope.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +from __future__ import unicode_literals +from . import LanguageConverter +from ..exceptions import LanguageConvertError +from ..language import LANGUAGE_MATRIX + + +class ScopeConverter(LanguageConverter): + FULLNAME = {'I': 'individual', 'M': 'macrolanguage', 'S': 'special'} + SYMBOLS = {} + for iso_language in LANGUAGE_MATRIX: + SYMBOLS[iso_language.alpha3] = iso_language.scope + codes = set(SYMBOLS.values()) + + def convert(self, alpha3, country=None, script=None): + if self.SYMBOLS[alpha3] in self.FULLNAME: + return self.FULLNAME[self.SYMBOLS[alpha3]] + raise LanguageConvertError(alpha3, country, script) diff --git a/lib/babelfish/converters/type.py b/lib/babelfish/converters/type.py new file mode 100755 index 00000000..3b7378c2 --- /dev/null +++ b/lib/babelfish/converters/type.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +from __future__ import unicode_literals +from . import LanguageConverter +from ..exceptions import LanguageConvertError +from ..language import LANGUAGE_MATRIX + + +class LanguageTypeConverter(LanguageConverter): + FULLNAME = {'A': 'ancient', 'C': 'constructed', 'E': 'extinct', 'H': 'historical', 'L': 'living', 'S': 'special'} + SYMBOLS = {} + for iso_language in LANGUAGE_MATRIX: + SYMBOLS[iso_language.alpha3] = iso_language.type + codes = set(SYMBOLS.values()) + + def convert(self, alpha3, country=None, script=None): + if self.SYMBOLS[alpha3] in self.FULLNAME: + return self.FULLNAME[self.SYMBOLS[alpha3]] + raise LanguageConvertError(alpha3, country, script) diff --git a/lib/babelfish/country.py b/lib/babelfish/country.py new file mode 100755 index 00000000..8e5bf80f --- /dev/null +++ b/lib/babelfish/country.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +from __future__ import unicode_literals +from collections import namedtuple +from functools import partial +# from pkg_resources import resource_stream # @UnresolvedImport +import os +from .converters import ConverterManager +from . import basestr + + +COUNTRIES = {} +COUNTRY_MATRIX = [] + +#: The namedtuple used in the :data:`COUNTRY_MATRIX` +IsoCountry = namedtuple('IsoCountry', ['name', 'alpha2']) + +f = open(os.path.join(os.path.dirname(__file__), 'data/iso-3166-1.txt')) +f.readline() +for l in f: + iso_country = IsoCountry(*l.decode('utf-8').strip().split(';')) + COUNTRIES[iso_country.alpha2] = iso_country.name + COUNTRY_MATRIX.append(iso_country) +f.close() + + +class CountryConverterManager(ConverterManager): + """:class:`~babelfish.converters.ConverterManager` for country converters""" + entry_point = 'babelfish.country_converters' + internal_converters = ['name = babelfish.converters.countryname:CountryNameConverter'] + +country_converters = CountryConverterManager() + + +class CountryMeta(type): + """The :class:`Country` metaclass + + Dynamically redirect :meth:`Country.frommycode` to :meth:`Country.fromcode` with the ``mycode`` `converter` + + """ + def __getattr__(cls, name): + if name.startswith('from'): + return partial(cls.fromcode, converter=name[4:]) + return type.__getattribute__(cls, name) + + +class Country(CountryMeta(str('CountryBase'), (object,), {})): + """A country on Earth + + A country is represented by a 2-letter code from the ISO-3166 standard + + :param string country: 2-letter ISO-3166 country code + + """ + def __init__(self, country): + if country not in COUNTRIES: + raise ValueError('%r is not a valid country' % country) + + #: ISO-3166 2-letter country code + self.alpha2 = country + + @classmethod + def fromcode(cls, code, converter): + """Create a :class:`Country` by its `code` using `converter` to + :meth:`~babelfish.converters.CountryReverseConverter.reverse` it + + :param string code: the code to reverse + :param string converter: name of the :class:`~babelfish.converters.CountryReverseConverter` to use + :return: the corresponding :class:`Country` instance + :rtype: :class:`Country` + + """ + return cls(country_converters[converter].reverse(code)) + + def __getstate__(self): + return self.alpha2 + + def __setstate__(self, state): + self.alpha2 = state + + def __getattr__(self, name): + try: + return country_converters[name].convert(self.alpha2) + except KeyError: + raise AttributeError(name) + + def __hash__(self): + return hash(self.alpha2) + + def __eq__(self, other): + if isinstance(other, basestr): + return str(self) == other + if not isinstance(other, Country): + return False + return self.alpha2 == other.alpha2 + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return '<Country [%s]>' % self + + def __str__(self): + return self.alpha2 diff --git a/lib/babelfish/data/iso-3166-1.txt b/lib/babelfish/data/iso-3166-1.txt new file mode 100755 index 00000000..da105072 --- /dev/null +++ b/lib/babelfish/data/iso-3166-1.txt @@ -0,0 +1,250 @@ +Country Name;ISO 3166-1-alpha-2 code +AFGHANISTAN;AF +ÅLAND ISLANDS;AX +ALBANIA;AL +ALGERIA;DZ +AMERICAN SAMOA;AS +ANDORRA;AD +ANGOLA;AO +ANGUILLA;AI +ANTARCTICA;AQ +ANTIGUA AND BARBUDA;AG +ARGENTINA;AR +ARMENIA;AM +ARUBA;AW +AUSTRALIA;AU +AUSTRIA;AT +AZERBAIJAN;AZ +BAHAMAS;BS +BAHRAIN;BH +BANGLADESH;BD +BARBADOS;BB +BELARUS;BY +BELGIUM;BE +BELIZE;BZ +BENIN;BJ +BERMUDA;BM +BHUTAN;BT +BOLIVIA, PLURINATIONAL STATE OF;BO +BONAIRE, SINT EUSTATIUS AND SABA;BQ +BOSNIA AND HERZEGOVINA;BA +BOTSWANA;BW +BOUVET ISLAND;BV +BRAZIL;BR +BRITISH INDIAN OCEAN TERRITORY;IO +BRUNEI DARUSSALAM;BN +BULGARIA;BG +BURKINA FASO;BF +BURUNDI;BI +CAMBODIA;KH +CAMEROON;CM +CANADA;CA +CAPE VERDE;CV +CAYMAN ISLANDS;KY +CENTRAL AFRICAN REPUBLIC;CF +CHAD;TD +CHILE;CL +CHINA;CN +CHRISTMAS ISLAND;CX +COCOS (KEELING) ISLANDS;CC +COLOMBIA;CO +COMOROS;KM +CONGO;CG +CONGO, THE DEMOCRATIC REPUBLIC OF THE;CD +COOK ISLANDS;CK +COSTA RICA;CR +CÔTE D'IVOIRE;CI +CROATIA;HR +CUBA;CU +CURAÇAO;CW +CYPRUS;CY +CZECH REPUBLIC;CZ +DENMARK;DK +DJIBOUTI;DJ +DOMINICA;DM +DOMINICAN REPUBLIC;DO +ECUADOR;EC +EGYPT;EG +EL SALVADOR;SV +EQUATORIAL GUINEA;GQ +ERITREA;ER +ESTONIA;EE +ETHIOPIA;ET +FALKLAND ISLANDS (MALVINAS);FK +FAROE ISLANDS;FO +FIJI;FJ +FINLAND;FI +FRANCE;FR +FRENCH GUIANA;GF +FRENCH POLYNESIA;PF +FRENCH SOUTHERN TERRITORIES;TF +GABON;GA +GAMBIA;GM +GEORGIA;GE +GERMANY;DE +GHANA;GH +GIBRALTAR;GI +GREECE;GR +GREENLAND;GL +GRENADA;GD +GUADELOUPE;GP +GUAM;GU +GUATEMALA;GT +GUERNSEY;GG +GUINEA;GN +GUINEA-BISSAU;GW +GUYANA;GY +HAITI;HT +HEARD ISLAND AND MCDONALD ISLANDS;HM +HOLY SEE (VATICAN CITY STATE);VA +HONDURAS;HN +HONG KONG;HK +HUNGARY;HU +ICELAND;IS +INDIA;IN +INDONESIA;ID +IRAN, ISLAMIC REPUBLIC OF;IR +IRAQ;IQ +IRELAND;IE +ISLE OF MAN;IM +ISRAEL;IL +ITALY;IT +JAMAICA;JM +JAPAN;JP +JERSEY;JE +JORDAN;JO +KAZAKHSTAN;KZ +KENYA;KE +KIRIBATI;KI +KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF;KP +KOREA, REPUBLIC OF;KR +KUWAIT;KW +KYRGYZSTAN;KG +LAO PEOPLE'S DEMOCRATIC REPUBLIC;LA +LATVIA;LV +LEBANON;LB +LESOTHO;LS +LIBERIA;LR +LIBYA;LY +LIECHTENSTEIN;LI +LITHUANIA;LT +LUXEMBOURG;LU +MACAO;MO +MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF;MK +MADAGASCAR;MG +MALAWI;MW +MALAYSIA;MY +MALDIVES;MV +MALI;ML +MALTA;MT +MARSHALL ISLANDS;MH +MARTINIQUE;MQ +MAURITANIA;MR +MAURITIUS;MU +MAYOTTE;YT +MEXICO;MX +MICRONESIA, FEDERATED STATES OF;FM +MOLDOVA, REPUBLIC OF;MD +MONACO;MC +MONGOLIA;MN +MONTENEGRO;ME +MONTSERRAT;MS +MOROCCO;MA +MOZAMBIQUE;MZ +MYANMAR;MM +NAMIBIA;NA +NAURU;NR +NEPAL;NP +NETHERLANDS;NL +NEW CALEDONIA;NC +NEW ZEALAND;NZ +NICARAGUA;NI +NIGER;NE +NIGERIA;NG +NIUE;NU +NORFOLK ISLAND;NF +NORTHERN MARIANA ISLANDS;MP +NORWAY;NO +OMAN;OM +PAKISTAN;PK +PALAU;PW +PALESTINE, STATE OF;PS +PANAMA;PA +PAPUA NEW GUINEA;PG +PARAGUAY;PY +PERU;PE +PHILIPPINES;PH +PITCAIRN;PN +POLAND;PL +PORTUGAL;PT +PUERTO RICO;PR +QATAR;QA +RÉUNION;RE +ROMANIA;RO +RUSSIAN FEDERATION;RU +RWANDA;RW +SAINT BARTHÉLEMY;BL +SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA;SH +SAINT KITTS AND NEVIS;KN +SAINT LUCIA;LC +SAINT MARTIN (FRENCH PART);MF +SAINT PIERRE AND MIQUELON;PM +SAINT VINCENT AND THE GRENADINES;VC +SAMOA;WS +SAN MARINO;SM +SAO TOME AND PRINCIPE;ST +SAUDI ARABIA;SA +SENEGAL;SN +SERBIA;RS +SEYCHELLES;SC +SIERRA LEONE;SL +SINGAPORE;SG +SINT MAARTEN (DUTCH PART);SX +SLOVAKIA;SK +SLOVENIA;SI +SOLOMON ISLANDS;SB +SOMALIA;SO +SOUTH AFRICA;ZA +SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS;GS +SOUTH SUDAN;SS +SPAIN;ES +SRI LANKA;LK +SUDAN;SD +SURINAME;SR +SVALBARD AND JAN MAYEN;SJ +SWAZILAND;SZ +SWEDEN;SE +SWITZERLAND;CH +SYRIAN ARAB REPUBLIC;SY +TAIWAN, PROVINCE OF CHINA;TW +TAJIKISTAN;TJ +TANZANIA, UNITED REPUBLIC OF;TZ +THAILAND;TH +TIMOR-LESTE;TL +TOGO;TG +TOKELAU;TK +TONGA;TO +TRINIDAD AND TOBAGO;TT +TUNISIA;TN +TURKEY;TR +TURKMENISTAN;TM +TURKS AND CAICOS ISLANDS;TC +TUVALU;TV +UGANDA;UG +UKRAINE;UA +UNITED ARAB EMIRATES;AE +UNITED KINGDOM;GB +UNITED STATES;US +UNITED STATES MINOR OUTLYING ISLANDS;UM +URUGUAY;UY +UZBEKISTAN;UZ +VANUATU;VU +VENEZUELA, BOLIVARIAN REPUBLIC OF;VE +VIET NAM;VN +VIRGIN ISLANDS, BRITISH;VG +VIRGIN ISLANDS, U.S.;VI +WALLIS AND FUTUNA;WF +WESTERN SAHARA;EH +YEMEN;YE +ZAMBIA;ZM +ZIMBABWE;ZW \ No newline at end of file diff --git a/lib/babelfish/data/iso-639-3.tab b/lib/babelfish/data/iso-639-3.tab new file mode 100755 index 00000000..f66d683b --- /dev/null +++ b/lib/babelfish/data/iso-639-3.tab @@ -0,0 +1,7875 @@ +Id Part2B Part2T Part1 Scope Language_Type Ref_Name Comment +aaa I L Ghotuo +aab I L Alumu-Tesu +aac I L Ari +aad I L Amal +aae I L Arbëreshë Albanian +aaf I L Aranadan +aag I L Ambrak +aah I L Abu' Arapesh +aai I L Arifama-Miniafia +aak I L Ankave +aal I L Afade +aam I L Aramanik +aan I L Anambé +aao I L Algerian Saharan Arabic +aap I L Pará Arára +aaq I E Eastern Abnaki +aar aar aar aa I L Afar +aas I L Aasáx +aat I L Arvanitika Albanian +aau I L Abau +aaw I L Solong +aax I L Mandobo Atas +aaz I L Amarasi +aba I L Abé +abb I L Bankon +abc I L Ambala Ayta +abd I L Manide +abe I E Western Abnaki +abf I L Abai Sungai +abg I L Abaga +abh I L Tajiki Arabic +abi I L Abidji +abj I E Aka-Bea +abk abk abk ab I L Abkhazian +abl I L Lampung Nyo +abm I L Abanyom +abn I L Abua +abo I L Abon +abp I L Abellen Ayta +abq I L Abaza +abr I L Abron +abs I L Ambonese Malay +abt I L Ambulas +abu I L Abure +abv I L Baharna Arabic +abw I L Pal +abx I L Inabaknon +aby I L Aneme Wake +abz I L Abui +aca I L Achagua +acb I L Áncá +acd I L Gikyode +ace ace ace I L Achinese +acf I L Saint Lucian Creole French +ach ach ach I L Acoli +aci I E Aka-Cari +ack I E Aka-Kora +acl I E Akar-Bale +acm I L Mesopotamian Arabic +acn I L Achang +acp I L Eastern Acipa +acq I L Ta'izzi-Adeni Arabic +acr I L Achi +acs I E Acroá +act I L Achterhoeks +acu I L Achuar-Shiwiar +acv I L Achumawi +acw I L Hijazi Arabic +acx I L Omani Arabic +acy I L Cypriot Arabic +acz I L Acheron +ada ada ada I L Adangme +adb I L Adabe +add I L Dzodinka +ade I L Adele +adf I L Dhofari Arabic +adg I L Andegerebinha +adh I L Adhola +adi I L Adi +adj I L Adioukrou +adl I L Galo +adn I L Adang +ado I L Abu +adp I L Adap +adq I L Adangbe +adr I L Adonara +ads I L Adamorobe Sign Language +adt I L Adnyamathanha +adu I L Aduge +adw I L Amundava +adx I L Amdo Tibetan +ady ady ady I L Adyghe +adz I L Adzera +aea I E Areba +aeb I L Tunisian Arabic +aec I L Saidi Arabic +aed I L Argentine Sign Language +aee I L Northeast Pashayi +aek I L Haeke +ael I L Ambele +aem I L Arem +aen I L Armenian Sign Language +aeq I L Aer +aer I L Eastern Arrernte +aes I E Alsea +aeu I L Akeu +aew I L Ambakich +aey I L Amele +aez I L Aeka +afb I L Gulf Arabic +afd I L Andai +afe I L Putukwam +afg I L Afghan Sign Language +afh afh afh I C Afrihili +afi I L Akrukay +afk I L Nanubae +afn I L Defaka +afo I L Eloyi +afp I L Tapei +afr afr afr af I L Afrikaans +afs I L Afro-Seminole Creole +aft I L Afitti +afu I L Awutu +afz I L Obokuitai +aga I E Aguano +agb I L Legbo +agc I L Agatu +agd I L Agarabi +age I L Angal +agf I L Arguni +agg I L Angor +agh I L Ngelima +agi I L Agariya +agj I L Argobba +agk I L Isarog Agta +agl I L Fembe +agm I L Angaataha +agn I L Agutaynen +ago I L Tainae +agq I L Aghem +agr I L Aguaruna +ags I L Esimbi +agt I L Central Cagayan Agta +agu I L Aguacateco +agv I L Remontado Dumagat +agw I L Kahua +agx I L Aghul +agy I L Southern Alta +agz I L Mt. Iriga Agta +aha I L Ahanta +ahb I L Axamb +ahg I L Qimant +ahh I L Aghu +ahi I L Tiagbamrin Aizi +ahk I L Akha +ahl I L Igo +ahm I L Mobumrin Aizi +ahn I L Àhàn +aho I E Ahom +ahp I L Aproumu Aizi +ahr I L Ahirani +ahs I L Ashe +aht I L Ahtena +aia I L Arosi +aib I L Ainu (China) +aic I L Ainbai +aid I E Alngith +aie I L Amara +aif I L Agi +aig I L Antigua and Barbuda Creole English +aih I L Ai-Cham +aii I L Assyrian Neo-Aramaic +aij I L Lishanid Noshan +aik I L Ake +ail I L Aimele +aim I L Aimol +ain ain ain I L Ainu (Japan) +aio I L Aiton +aip I L Burumakok +aiq I L Aimaq +air I L Airoran +ais I L Nataoran Amis +ait I E Arikem +aiw I L Aari +aix I L Aighon +aiy I L Ali +aja I L Aja (Sudan) +ajg I L Aja (Benin) +aji I L Ajië +ajn I L Andajin +ajp I L South Levantine Arabic +ajt I L Judeo-Tunisian Arabic +aju I L Judeo-Moroccan Arabic +ajw I E Ajawa +ajz I L Amri Karbi +aka aka aka ak M L Akan +akb I L Batak Angkola +akc I L Mpur +akd I L Ukpet-Ehom +ake I L Akawaio +akf I L Akpa +akg I L Anakalangu +akh I L Angal Heneng +aki I L Aiome +akj I E Aka-Jeru +akk akk akk I A Akkadian +akl I L Aklanon +akm I E Aka-Bo +ako I L Akurio +akp I L Siwu +akq I L Ak +akr I L Araki +aks I L Akaselem +akt I L Akolet +aku I L Akum +akv I L Akhvakh +akw I L Akwa +akx I E Aka-Kede +aky I E Aka-Kol +akz I L Alabama +ala I L Alago +alc I L Qawasqar +ald I L Alladian +ale ale ale I L Aleut +alf I L Alege +alh I L Alawa +ali I L Amaimon +alj I L Alangan +alk I L Alak +all I L Allar +alm I L Amblong +aln I L Gheg Albanian +alo I L Larike-Wakasihu +alp I L Alune +alq I L Algonquin +alr I L Alutor +als I L Tosk Albanian +alt alt alt I L Southern Altai +alu I L 'Are'are +alw I L Alaba-K’abeena +alx I L Amol +aly I L Alyawarr +alz I L Alur +ama I E Amanayé +amb I L Ambo +amc I L Amahuaca +ame I L Yanesha' +amf I L Hamer-Banna +amg I L Amurdak +amh amh amh am I L Amharic +ami I L Amis +amj I L Amdang +amk I L Ambai +aml I L War-Jaintia +amm I L Ama (Papua New Guinea) +amn I L Amanab +amo I L Amo +amp I L Alamblak +amq I L Amahai +amr I L Amarakaeri +ams I L Southern Amami-Oshima +amt I L Amto +amu I L Guerrero Amuzgo +amv I L Ambelau +amw I L Western Neo-Aramaic +amx I L Anmatyerre +amy I L Ami +amz I E Atampaya +ana I E Andaqui +anb I E Andoa +anc I L Ngas +and I L Ansus +ane I L Xârâcùù +anf I L Animere +ang ang ang I H Old English (ca. 450-1100) +anh I L Nend +ani I L Andi +anj I L Anor +ank I L Goemai +anl I L Anu-Hkongso Chin +anm I L Anal +ann I L Obolo +ano I L Andoque +anp anp anp I L Angika +anq I L Jarawa (India) +anr I L Andh +ans I E Anserma +ant I L Antakarinya +anu I L Anuak +anv I L Denya +anw I L Anaang +anx I L Andra-Hus +any I L Anyin +anz I L Anem +aoa I L Angolar +aob I L Abom +aoc I L Pemon +aod I L Andarum +aoe I L Angal Enen +aof I L Bragat +aog I L Angoram +aoh I E Arma +aoi I L Anindilyakwa +aoj I L Mufian +aok I L Arhö +aol I L Alor +aom I L Ömie +aon I L Bumbita Arapesh +aor I E Aore +aos I L Taikat +aot I L A'tong +aou I L A'ou +aox I L Atorada +aoz I L Uab Meto +apb I L Sa'a +apc I L North Levantine Arabic +apd I L Sudanese Arabic +ape I L Bukiyip +apf I L Pahanan Agta +apg I L Ampanang +aph I L Athpariya +api I L Apiaká +apj I L Jicarilla Apache +apk I L Kiowa Apache +apl I L Lipan Apache +apm I L Mescalero-Chiricahua Apache +apn I L Apinayé +apo I L Ambul +app I L Apma +apq I L A-Pucikwar +apr I L Arop-Lokep +aps I L Arop-Sissano +apt I L Apatani +apu I L Apurinã +apv I E Alapmunte +apw I L Western Apache +apx I L Aputai +apy I L Apalaí +apz I L Safeyoka +aqc I L Archi +aqd I L Ampari Dogon +aqg I L Arigidi +aqm I L Atohwaim +aqn I L Northern Alta +aqp I E Atakapa +aqr I L Arhâ +aqz I L Akuntsu +ara ara ara ar M L Arabic +arb I L Standard Arabic +arc arc arc I A Official Aramaic (700-300 BCE) +ard I E Arabana +are I L Western Arrarnta +arg arg arg an I L Aragonese +arh I L Arhuaco +ari I L Arikara +arj I E Arapaso +ark I L Arikapú +arl I L Arabela +arn arn arn I L Mapudungun +aro I L Araona +arp arp arp I L Arapaho +arq I L Algerian Arabic +arr I L Karo (Brazil) +ars I L Najdi Arabic +aru I E Aruá (Amazonas State) +arv I L Arbore +arw arw arw I L Arawak +arx I L Aruá (Rodonia State) +ary I L Moroccan Arabic +arz I L Egyptian Arabic +asa I L Asu (Tanzania) +asb I L Assiniboine +asc I L Casuarina Coast Asmat +asd I L Asas +ase I L American Sign Language +asf I L Australian Sign Language +asg I L Cishingini +ash I E Abishira +asi I L Buruwai +asj I L Sari +ask I L Ashkun +asl I L Asilulu +asm asm asm as I L Assamese +asn I L Xingú Asuriní +aso I L Dano +asp I L Algerian Sign Language +asq I L Austrian Sign Language +asr I L Asuri +ass I L Ipulo +ast ast ast I L Asturian +asu I L Tocantins Asurini +asv I L Asoa +asw I L Australian Aborigines Sign Language +asx I L Muratayak +asy I L Yaosakor Asmat +asz I L As +ata I L Pele-Ata +atb I L Zaiwa +atc I E Atsahuaca +atd I L Ata Manobo +ate I L Atemble +atg I L Ivbie North-Okpela-Arhe +ati I L Attié +atj I L Atikamekw +atk I L Ati +atl I L Mt. Iraya Agta +atm I L Ata +atn I L Ashtiani +ato I L Atong +atp I L Pudtol Atta +atq I L Aralle-Tabulahan +atr I L Waimiri-Atroari +ats I L Gros Ventre +att I L Pamplona Atta +atu I L Reel +atv I L Northern Altai +atw I L Atsugewi +atx I L Arutani +aty I L Aneityum +atz I L Arta +aua I L Asumboa +aub I L Alugu +auc I L Waorani +aud I L Anuta +aue I L =/Kx'au//'ein +aug I L Aguna +auh I L Aushi +aui I L Anuki +auj I L Awjilah +auk I L Heyo +aul I L Aulua +aum I L Asu (Nigeria) +aun I L Molmo One +auo I E Auyokawa +aup I L Makayam +auq I L Anus +aur I L Aruek +aut I L Austral +auu I L Auye +auw I L Awyi +aux I E Aurá +auy I L Awiyaana +auz I L Uzbeki Arabic +ava ava ava av I L Avaric +avb I L Avau +avd I L Alviri-Vidari +ave ave ave ae I A Avestan +avi I L Avikam +avk I C Kotava +avl I L Eastern Egyptian Bedawi Arabic +avm I E Angkamuthi +avn I L Avatime +avo I E Agavotaguerra +avs I E Aushiri +avt I L Au +avu I L Avokaya +avv I L Avá-Canoeiro +awa awa awa I L Awadhi +awb I L Awa (Papua New Guinea) +awc I L Cicipu +awe I L Awetí +awg I E Anguthimri +awh I L Awbono +awi I L Aekyom +awk I E Awabakal +awm I L Arawum +awn I L Awngi +awo I L Awak +awr I L Awera +aws I L South Awyu +awt I L Araweté +awu I L Central Awyu +awv I L Jair Awyu +aww I L Awun +awx I L Awara +awy I L Edera Awyu +axb I E Abipon +axe I E Ayerrerenge +axg I E Mato Grosso Arára +axk I L Yaka (Central African Republic) +axl I E Lower Southern Aranda +axm I H Middle Armenian +axx I L Xârâgurè +aya I L Awar +ayb I L Ayizo Gbe +ayc I L Southern Aymara +ayd I E Ayabadhu +aye I L Ayere +ayg I L Ginyanga +ayh I L Hadrami Arabic +ayi I L Leyigha +ayk I L Akuku +ayl I L Libyan Arabic +aym aym aym ay M L Aymara +ayn I L Sanaani Arabic +ayo I L Ayoreo +ayp I L North Mesopotamian Arabic +ayq I L Ayi (Papua New Guinea) +ayr I L Central Aymara +ays I L Sorsogon Ayta +ayt I L Magbukun Ayta +ayu I L Ayu +ayy I E Tayabas Ayta +ayz I L Mai Brat +aza I L Azha +azb I L South Azerbaijani +azd I L Eastern Durango Nahuatl +aze aze aze az M L Azerbaijani +azg I L San Pedro Amuzgos Amuzgo +azj I L North Azerbaijani +azm I L Ipalapa Amuzgo +azn I L Western Durango Nahuatl +azo I L Awing +azt I L Faire Atta +azz I L Highland Puebla Nahuatl +baa I L Babatana +bab I L Bainouk-Gunyuño +bac I L Badui +bae I E Baré +baf I L Nubaca +bag I L Tuki +bah I L Bahamas Creole English +baj I L Barakai +bak bak bak ba I L Bashkir +bal bal bal M L Baluchi +bam bam bam bm I L Bambara +ban ban ban I L Balinese +bao I L Waimaha +bap I L Bantawa +bar I L Bavarian +bas bas bas I L Basa (Cameroon) +bau I L Bada (Nigeria) +bav I L Vengo +baw I L Bambili-Bambui +bax I L Bamun +bay I L Batuley +bba I L Baatonum +bbb I L Barai +bbc I L Batak Toba +bbd I L Bau +bbe I L Bangba +bbf I L Baibai +bbg I L Barama +bbh I L Bugan +bbi I L Barombi +bbj I L Ghomálá' +bbk I L Babanki +bbl I L Bats +bbm I L Babango +bbn I L Uneapa +bbo I L Northern Bobo Madaré +bbp I L West Central Banda +bbq I L Bamali +bbr I L Girawa +bbs I L Bakpinka +bbt I L Mburku +bbu I L Kulung (Nigeria) +bbv I L Karnai +bbw I L Baba +bbx I L Bubia +bby I L Befang +bbz I L Babalia Creole Arabic +bca I L Central Bai +bcb I L Bainouk-Samik +bcc I L Southern Balochi +bcd I L North Babar +bce I L Bamenyam +bcf I L Bamu +bcg I L Baga Binari +bch I L Bariai +bci I L Baoulé +bcj I L Bardi +bck I L Bunaba +bcl I L Central Bikol +bcm I L Bannoni +bcn I L Bali (Nigeria) +bco I L Kaluli +bcp I L Bali (Democratic Republic of Congo) +bcq I L Bench +bcr I L Babine +bcs I L Kohumono +bct I L Bendi +bcu I L Awad Bing +bcv I L Shoo-Minda-Nye +bcw I L Bana +bcy I L Bacama +bcz I L Bainouk-Gunyaamolo +bda I L Bayot +bdb I L Basap +bdc I L Emberá-Baudó +bdd I L Bunama +bde I L Bade +bdf I L Biage +bdg I L Bonggi +bdh I L Baka (Sudan) +bdi I L Burun +bdj I L Bai +bdk I L Budukh +bdl I L Indonesian Bajau +bdm I L Buduma +bdn I L Baldemu +bdo I L Morom +bdp I L Bende +bdq I L Bahnar +bdr I L West Coast Bajau +bds I L Burunge +bdt I L Bokoto +bdu I L Oroko +bdv I L Bodo Parja +bdw I L Baham +bdx I L Budong-Budong +bdy I L Bandjalang +bdz I L Badeshi +bea I L Beaver +beb I L Bebele +bec I L Iceve-Maci +bed I L Bedoanas +bee I L Byangsi +bef I L Benabena +beg I L Belait +beh I L Biali +bei I L Bekati' +bej bej bej I L Beja +bek I L Bebeli +bel bel bel be I L Belarusian +bem bem bem I L Bemba (Zambia) +ben ben ben bn I L Bengali +beo I L Beami +bep I L Besoa +beq I L Beembe +bes I L Besme +bet I L Guiberoua Béte +beu I L Blagar +bev I L Daloa Bété +bew I L Betawi +bex I L Jur Modo +bey I L Beli (Papua New Guinea) +bez I L Bena (Tanzania) +bfa I L Bari +bfb I L Pauri Bareli +bfc I L Northern Bai +bfd I L Bafut +bfe I L Betaf +bff I L Bofi +bfg I L Busang Kayan +bfh I L Blafe +bfi I L British Sign Language +bfj I L Bafanji +bfk I L Ban Khor Sign Language +bfl I L Banda-Ndélé +bfm I L Mmen +bfn I L Bunak +bfo I L Malba Birifor +bfp I L Beba +bfq I L Badaga +bfr I L Bazigar +bfs I L Southern Bai +bft I L Balti +bfu I L Gahri +bfw I L Bondo +bfx I L Bantayanon +bfy I L Bagheli +bfz I L Mahasu Pahari +bga I L Gwamhi-Wuri +bgb I L Bobongko +bgc I L Haryanvi +bgd I L Rathwi Bareli +bge I L Bauria +bgf I L Bangandu +bgg I L Bugun +bgi I L Giangan +bgj I L Bangolan +bgk I L Bit +bgl I L Bo (Laos) +bgm I L Baga Mboteni +bgn I L Western Balochi +bgo I L Baga Koga +bgp I L Eastern Balochi +bgq I L Bagri +bgr I L Bawm Chin +bgs I L Tagabawa +bgt I L Bughotu +bgu I L Mbongno +bgv I L Warkay-Bipim +bgw I L Bhatri +bgx I L Balkan Gagauz Turkish +bgy I L Benggoi +bgz I L Banggai +bha I L Bharia +bhb I L Bhili +bhc I L Biga +bhd I L Bhadrawahi +bhe I L Bhaya +bhf I L Odiai +bhg I L Binandere +bhh I L Bukharic +bhi I L Bhilali +bhj I L Bahing +bhl I L Bimin +bhm I L Bathari +bhn I L Bohtan Neo-Aramaic +bho bho bho I L Bhojpuri +bhp I L Bima +bhq I L Tukang Besi South +bhr I L Bara Malagasy +bhs I L Buwal +bht I L Bhattiyali +bhu I L Bhunjia +bhv I L Bahau +bhw I L Biak +bhx I L Bhalay +bhy I L Bhele +bhz I L Bada (Indonesia) +bia I L Badimaya +bib I L Bissa +bic I L Bikaru +bid I L Bidiyo +bie I L Bepour +bif I L Biafada +big I L Biangai +bij I L Vaghat-Ya-Bijim-Legeri +bik bik bik M L Bikol +bil I L Bile +bim I L Bimoba +bin bin bin I L Bini +bio I L Nai +bip I L Bila +biq I L Bipi +bir I L Bisorio +bis bis bis bi I L Bislama +bit I L Berinomo +biu I L Biete +biv I L Southern Birifor +biw I L Kol (Cameroon) +bix I L Bijori +biy I L Birhor +biz I L Baloi +bja I L Budza +bjb I E Banggarla +bjc I L Bariji +bje I L Biao-Jiao Mien +bjf I L Barzani Jewish Neo-Aramaic +bjg I L Bidyogo +bjh I L Bahinemo +bji I L Burji +bjj I L Kanauji +bjk I L Barok +bjl I L Bulu (Papua New Guinea) +bjm I L Bajelani +bjn I L Banjar +bjo I L Mid-Southern Banda +bjp I L Fanamaket +bjr I L Binumarien +bjs I L Bajan +bjt I L Balanta-Ganja +bju I L Busuu +bjv I L Bedjond +bjw I L Bakwé +bjx I L Banao Itneg +bjy I E Bayali +bjz I L Baruga +bka I L Kyak +bkc I L Baka (Cameroon) +bkd I L Binukid +bkf I L Beeke +bkg I L Buraka +bkh I L Bakoko +bki I L Baki +bkj I L Pande +bkk I L Brokskat +bkl I L Berik +bkm I L Kom (Cameroon) +bkn I L Bukitan +bko I L Kwa' +bkp I L Boko (Democratic Republic of Congo) +bkq I L Bakairí +bkr I L Bakumpai +bks I L Northern Sorsoganon +bkt I L Boloki +bku I L Buhid +bkv I L Bekwarra +bkw I L Bekwel +bkx I L Baikeno +bky I L Bokyi +bkz I L Bungku +bla bla bla I L Siksika +blb I L Bilua +blc I L Bella Coola +bld I L Bolango +ble I L Balanta-Kentohe +blf I L Buol +blg I L Balau +blh I L Kuwaa +bli I L Bolia +blj I L Bolongan +blk I L Pa'o Karen +bll I E Biloxi +blm I L Beli (Sudan) +bln I L Southern Catanduanes Bikol +blo I L Anii +blp I L Blablanga +blq I L Baluan-Pam +blr I L Blang +bls I L Balaesang +blt I L Tai Dam +blv I L Bolo +blw I L Balangao +blx I L Mag-Indi Ayta +bly I L Notre +blz I L Balantak +bma I L Lame +bmb I L Bembe +bmc I L Biem +bmd I L Baga Manduri +bme I L Limassa +bmf I L Bom +bmg I L Bamwe +bmh I L Kein +bmi I L Bagirmi +bmj I L Bote-Majhi +bmk I L Ghayavi +bml I L Bomboli +bmm I L Northern Betsimisaraka Malagasy +bmn I E Bina (Papua New Guinea) +bmo I L Bambalang +bmp I L Bulgebi +bmq I L Bomu +bmr I L Muinane +bms I L Bilma Kanuri +bmt I L Biao Mon +bmu I L Somba-Siawari +bmv I L Bum +bmw I L Bomwali +bmx I L Baimak +bmy I L Bemba (Democratic Republic of Congo) +bmz I L Baramu +bna I L Bonerate +bnb I L Bookan +bnc M L Bontok +bnd I L Banda (Indonesia) +bne I L Bintauna +bnf I L Masiwang +bng I L Benga +bni I L Bangi +bnj I L Eastern Tawbuid +bnk I L Bierebo +bnl I L Boon +bnm I L Batanga +bnn I L Bunun +bno I L Bantoanon +bnp I L Bola +bnq I L Bantik +bnr I L Butmas-Tur +bns I L Bundeli +bnu I L Bentong +bnv I L Bonerif +bnw I L Bisis +bnx I L Bangubangu +bny I L Bintulu +bnz I L Beezen +boa I L Bora +bob I L Aweer +bod tib bod bo I L Tibetan +boe I L Mundabli +bof I L Bolon +bog I L Bamako Sign Language +boh I L Boma +boi I E Barbareño +boj I L Anjam +bok I L Bonjo +bol I L Bole +bom I L Berom +bon I L Bine +boo I L Tiemacèwè Bozo +bop I L Bonkiman +boq I L Bogaya +bor I L Borôro +bos bos bos bs I L Bosnian +bot I L Bongo +bou I L Bondei +bov I L Tuwuli +bow I E Rema +box I L Buamu +boy I L Bodo (Central African Republic) +boz I L Tiéyaxo Bozo +bpa I L Daakaka +bpb I E Barbacoas +bpd I L Banda-Banda +bpg I L Bonggo +bph I L Botlikh +bpi I L Bagupi +bpj I L Binji +bpk I L Orowe +bpl I L Broome Pearling Lugger Pidgin +bpm I L Biyom +bpn I L Dzao Min +bpo I L Anasi +bpp I L Kaure +bpq I L Banda Malay +bpr I L Koronadal Blaan +bps I L Sarangani Blaan +bpt I E Barrow Point +bpu I L Bongu +bpv I L Bian Marind +bpw I L Bo (Papua New Guinea) +bpx I L Palya Bareli +bpy I L Bishnupriya +bpz I L Bilba +bqa I L Tchumbuli +bqb I L Bagusa +bqc I L Boko (Benin) +bqd I L Bung +bqf I E Baga Kaloum +bqg I L Bago-Kusuntu +bqh I L Baima +bqi I L Bakhtiari +bqj I L Bandial +bqk I L Banda-Mbrès +bql I L Bilakura +bqm I L Wumboko +bqn I L Bulgarian Sign Language +bqo I L Balo +bqp I L Busa +bqq I L Biritai +bqr I L Burusu +bqs I L Bosngun +bqt I L Bamukumbit +bqu I L Boguru +bqv I L Koro Wachi +bqw I L Buru (Nigeria) +bqx I L Baangi +bqy I L Bengkala Sign Language +bqz I L Bakaka +bra bra bra I L Braj +brb I L Lave +brc I E Berbice Creole Dutch +brd I L Baraamu +bre bre bre br I L Breton +brf I L Bera +brg I L Baure +brh I L Brahui +bri I L Mokpwe +brj I L Bieria +brk I E Birked +brl I L Birwa +brm I L Barambu +brn I L Boruca +bro I L Brokkat +brp I L Barapasi +brq I L Breri +brr I L Birao +brs I L Baras +brt I L Bitare +bru I L Eastern Bru +brv I L Western Bru +brw I L Bellari +brx I L Bodo (India) +bry I L Burui +brz I L Bilbil +bsa I L Abinomn +bsb I L Brunei Bisaya +bsc I L Bassari +bse I L Wushi +bsf I L Bauchi +bsg I L Bashkardi +bsh I L Kati +bsi I L Bassossi +bsj I L Bangwinji +bsk I L Burushaski +bsl I E Basa-Gumna +bsm I L Busami +bsn I L Barasana-Eduria +bso I L Buso +bsp I L Baga Sitemu +bsq I L Bassa +bsr I L Bassa-Kontagora +bss I L Akoose +bst I L Basketo +bsu I L Bahonsuai +bsv I E Baga Sobané +bsw I L Baiso +bsx I L Yangkam +bsy I L Sabah Bisaya +bta I L Bata +btc I L Bati (Cameroon) +btd I L Batak Dairi +bte I E Gamo-Ningi +btf I L Birgit +btg I L Gagnoa Bété +bth I L Biatah Bidayuh +bti I L Burate +btj I L Bacanese Malay +btl I L Bhatola +btm I L Batak Mandailing +btn I L Ratagnon +bto I L Rinconada Bikol +btp I L Budibud +btq I L Batek +btr I L Baetora +bts I L Batak Simalungun +btt I L Bete-Bendi +btu I L Batu +btv I L Bateri +btw I L Butuanon +btx I L Batak Karo +bty I L Bobot +btz I L Batak Alas-Kluet +bua bua bua M L Buriat +bub I L Bua +buc I L Bushi +bud I L Ntcham +bue I E Beothuk +buf I L Bushoong +bug bug bug I L Buginese +buh I L Younuo Bunu +bui I L Bongili +buj I L Basa-Gurmana +buk I L Bugawac +bul bul bul bg I L Bulgarian +bum I L Bulu (Cameroon) +bun I L Sherbro +buo I L Terei +bup I L Busoa +buq I L Brem +bus I L Bokobaru +but I L Bungain +buu I L Budu +buv I L Bun +buw I L Bubi +bux I L Boghom +buy I L Bullom So +buz I L Bukwen +bva I L Barein +bvb I L Bube +bvc I L Baelelea +bvd I L Baeggu +bve I L Berau Malay +bvf I L Boor +bvg I L Bonkeng +bvh I L Bure +bvi I L Belanda Viri +bvj I L Baan +bvk I L Bukat +bvl I L Bolivian Sign Language +bvm I L Bamunka +bvn I L Buna +bvo I L Bolgo +bvp I L Bumang +bvq I L Birri +bvr I L Burarra +bvt I L Bati (Indonesia) +bvu I L Bukit Malay +bvv I E Baniva +bvw I L Boga +bvx I L Dibole +bvy I L Baybayanon +bvz I L Bauzi +bwa I L Bwatoo +bwb I L Namosi-Naitasiri-Serua +bwc I L Bwile +bwd I L Bwaidoka +bwe I L Bwe Karen +bwf I L Boselewa +bwg I L Barwe +bwh I L Bishuo +bwi I L Baniwa +bwj I L Láá Láá Bwamu +bwk I L Bauwaki +bwl I L Bwela +bwm I L Biwat +bwn I L Wunai Bunu +bwo I L Boro (Ethiopia) +bwp I L Mandobo Bawah +bwq I L Southern Bobo Madaré +bwr I L Bura-Pabir +bws I L Bomboma +bwt I L Bafaw-Balong +bwu I L Buli (Ghana) +bww I L Bwa +bwx I L Bu-Nao Bunu +bwy I L Cwi Bwamu +bwz I L Bwisi +bxa I L Tairaha +bxb I L Belanda Bor +bxc I L Molengue +bxd I L Pela +bxe I L Birale +bxf I L Bilur +bxg I L Bangala +bxh I L Buhutu +bxi I E Pirlatapa +bxj I L Bayungu +bxk I L Bukusu +bxl I L Jalkunan +bxm I L Mongolia Buriat +bxn I L Burduna +bxo I L Barikanchi +bxp I L Bebil +bxq I L Beele +bxr I L Russia Buriat +bxs I L Busam +bxu I L China Buriat +bxv I L Berakou +bxw I L Bankagooma +bxx I L Borna (Democratic Republic of Congo) +bxz I L Binahari +bya I L Batak +byb I L Bikya +byc I L Ubaghara +byd I L Benyadu' +bye I L Pouye +byf I L Bete +byg I E Baygo +byh I L Bhujel +byi I L Buyu +byj I L Bina (Nigeria) +byk I L Biao +byl I L Bayono +bym I L Bidyara +byn byn byn I L Bilin +byo I L Biyo +byp I L Bumaji +byq I E Basay +byr I L Baruya +bys I L Burak +byt I E Berti +byv I L Medumba +byw I L Belhariya +byx I L Qaqet +byy I L Buya +byz I L Banaro +bza I L Bandi +bzb I L Andio +bzc I L Southern Betsimisaraka Malagasy +bzd I L Bribri +bze I L Jenaama Bozo +bzf I L Boikin +bzg I L Babuza +bzh I L Mapos Buang +bzi I L Bisu +bzj I L Belize Kriol English +bzk I L Nicaragua Creole English +bzl I L Boano (Sulawesi) +bzm I L Bolondo +bzn I L Boano (Maluku) +bzo I L Bozaba +bzp I L Kemberano +bzq I L Buli (Indonesia) +bzr I E Biri +bzs I L Brazilian Sign Language +bzt I C Brithenig +bzu I L Burmeso +bzv I L Naami +bzw I L Basa (Nigeria) +bzx I L Kɛlɛngaxo Bozo +bzy I L Obanliku +bzz I L Evant +caa I L Chortí +cab I L Garifuna +cac I L Chuj +cad cad cad I L Caddo +cae I L Lehar +caf I L Southern Carrier +cag I L Nivaclé +cah I L Cahuarano +caj I E Chané +cak I L Kaqchikel +cal I L Carolinian +cam I L Cemuhî +can I L Chambri +cao I L Chácobo +cap I L Chipaya +caq I L Car Nicobarese +car car car I L Galibi Carib +cas I L Tsimané +cat cat cat ca I L Catalan +cav I L Cavineña +caw I L Callawalla +cax I L Chiquitano +cay I L Cayuga +caz I E Canichana +cbb I L Cabiyarí +cbc I L Carapana +cbd I L Carijona +cbe I E Chipiajes +cbg I L Chimila +cbh I E Cagua +cbi I L Chachi +cbj I L Ede Cabe +cbk I L Chavacano +cbl I L Bualkhaw Chin +cbn I L Nyahkur +cbo I L Izora +cbr I L Cashibo-Cacataibo +cbs I L Cashinahua +cbt I L Chayahuita +cbu I L Candoshi-Shapra +cbv I L Cacua +cbw I L Kinabalian +cby I L Carabayo +cca I E Cauca +ccc I L Chamicuro +ccd I L Cafundo Creole +cce I L Chopi +ccg I L Samba Daka +cch I L Atsam +ccj I L Kasanga +ccl I L Cutchi-Swahili +ccm I L Malaccan Creole Malay +cco I L Comaltepec Chinantec +ccp I L Chakma +ccr I E Cacaopera +cda I L Choni +cde I L Chenchu +cdf I L Chiru +cdg I L Chamari +cdh I L Chambeali +cdi I L Chodri +cdj I L Churahi +cdm I L Chepang +cdn I L Chaudangsi +cdo I L Min Dong Chinese +cdr I L Cinda-Regi-Tiyal +cds I L Chadian Sign Language +cdy I L Chadong +cdz I L Koda +cea I E Lower Chehalis +ceb ceb ceb I L Cebuano +ceg I L Chamacoco +cek I L Eastern Khumi Chin +cen I L Cen +ces cze ces cs I L Czech +cet I L Centúúm +cfa I L Dijim-Bwilim +cfd I L Cara +cfg I L Como Karim +cfm I L Falam Chin +cga I L Changriwa +cgc I L Kagayanen +cgg I L Chiga +cgk I L Chocangacakha +cha cha cha ch I L Chamorro +chb chb chb I E Chibcha +chc I E Catawba +chd I L Highland Oaxaca Chontal +che che che ce I L Chechen +chf I L Tabasco Chontal +chg chg chg I E Chagatai +chh I L Chinook +chj I L Ojitlán Chinantec +chk chk chk I L Chuukese +chl I L Cahuilla +chm chm chm M L Mari (Russia) +chn chn chn I L Chinook jargon +cho cho cho I L Choctaw +chp chp chp I L Chipewyan +chq I L Quiotepec Chinantec +chr chr chr I L Cherokee +cht I E Cholón +chu chu chu cu I A Church Slavic +chv chv chv cv I L Chuvash +chw I L Chuwabu +chx I L Chantyal +chy chy chy I L Cheyenne +chz I L Ozumacín Chinantec +cia I L Cia-Cia +cib I L Ci Gbe +cic I L Chickasaw +cid I E Chimariko +cie I L Cineni +cih I L Chinali +cik I L Chitkuli Kinnauri +cim I L Cimbrian +cin I L Cinta Larga +cip I L Chiapanec +cir I L Tiri +ciw I L Chippewa +ciy I L Chaima +cja I L Western Cham +cje I L Chru +cjh I E Upper Chehalis +cji I L Chamalal +cjk I L Chokwe +cjm I L Eastern Cham +cjn I L Chenapian +cjo I L Ashéninka Pajonal +cjp I L Cabécar +cjs I L Shor +cjv I L Chuave +cjy I L Jinyu Chinese +ckb I L Central Kurdish +ckh I L Chak +ckl I L Cibak +ckn I L Kaang Chin +cko I L Anufo +ckq I L Kajakse +ckr I L Kairak +cks I L Tayo +ckt I L Chukot +cku I L Koasati +ckv I L Kavalan +ckx I L Caka +cky I L Cakfem-Mushere +ckz I L Cakchiquel-Quiché Mixed Language +cla I L Ron +clc I L Chilcotin +cld I L Chaldean Neo-Aramaic +cle I L Lealao Chinantec +clh I L Chilisso +cli I L Chakali +clj I L Laitu Chin +clk I L Idu-Mishmi +cll I L Chala +clm I L Clallam +clo I L Lowland Oaxaca Chontal +clt I L Lautu Chin +clu I L Caluyanun +clw I L Chulym +cly I L Eastern Highland Chatino +cma I L Maa +cme I L Cerma +cmg I H Classical Mongolian +cmi I L Emberá-Chamí +cml I L Campalagian +cmm I E Michigamea +cmn I L Mandarin Chinese +cmo I L Central Mnong +cmr I L Mro-Khimi Chin +cms I A Messapic +cmt I L Camtho +cna I L Changthang +cnb I L Chinbon Chin +cnc I L Côông +cng I L Northern Qiang +cnh I L Haka Chin +cni I L Asháninka +cnk I L Khumi Chin +cnl I L Lalana Chinantec +cno I L Con +cns I L Central Asmat +cnt I L Tepetotutla Chinantec +cnu I L Chenoua +cnw I L Ngawn Chin +cnx I H Middle Cornish +coa I L Cocos Islands Malay +cob I E Chicomuceltec +coc I L Cocopa +cod I L Cocama-Cocamilla +coe I L Koreguaje +cof I L Colorado +cog I L Chong +coh I L Chonyi-Dzihana-Kauma +coj I E Cochimi +cok I L Santa Teresa Cora +col I L Columbia-Wenatchi +com I L Comanche +con I L Cofán +coo I L Comox +cop cop cop I E Coptic +coq I E Coquille +cor cor cor kw I L Cornish +cos cos cos co I L Corsican +cot I L Caquinte +cou I L Wamey +cov I L Cao Miao +cow I E Cowlitz +cox I L Nanti +coy I E Coyaima +coz I L Chochotec +cpa I L Palantla Chinantec +cpb I L Ucayali-Yurúa Ashéninka +cpc I L Ajyíninka Apurucayali +cpg I E Cappadocian Greek +cpi I L Chinese Pidgin English +cpn I L Cherepon +cpo I L Kpeego +cps I L Capiznon +cpu I L Pichis Ashéninka +cpx I L Pu-Xian Chinese +cpy I L South Ucayali Ashéninka +cqd I L Chuanqiandian Cluster Miao +cqu I L Chilean Quechua +cra I L Chara +crb I E Island Carib +crc I L Lonwolwol +crd I L Coeur d'Alene +cre cre cre cr M L Cree +crf I E Caramanta +crg I L Michif +crh crh crh I L Crimean Tatar +cri I L Sãotomense +crj I L Southern East Cree +crk I L Plains Cree +crl I L Northern East Cree +crm I L Moose Cree +crn I L El Nayar Cora +cro I L Crow +crq I L Iyo'wujwa Chorote +crr I E Carolina Algonquian +crs I L Seselwa Creole French +crt I L Iyojwa'ja Chorote +crv I L Chaura +crw I L Chrau +crx I L Carrier +cry I L Cori +crz I E Cruzeño +csa I L Chiltepec Chinantec +csb csb csb I L Kashubian +csc I L Catalan Sign Language +csd I L Chiangmai Sign Language +cse I L Czech Sign Language +csf I L Cuba Sign Language +csg I L Chilean Sign Language +csh I L Asho Chin +csi I E Coast Miwok +csj I L Songlai Chin +csk I L Jola-Kasa +csl I L Chinese Sign Language +csm I L Central Sierra Miwok +csn I L Colombian Sign Language +cso I L Sochiapam Chinantec +csq I L Croatia Sign Language +csr I L Costa Rican Sign Language +css I E Southern Ohlone +cst I L Northern Ohlone +csv I L Sumtu Chin +csw I L Swampy Cree +csy I L Siyin Chin +csz I L Coos +cta I L Tataltepec Chatino +ctc I L Chetco +ctd I L Tedim Chin +cte I L Tepinapa Chinantec +ctg I L Chittagonian +cth I L Thaiphum Chin +ctl I L Tlacoatzintepec Chinantec +ctm I E Chitimacha +ctn I L Chhintange +cto I L Emberá-Catío +ctp I L Western Highland Chatino +cts I L Northern Catanduanes Bikol +ctt I L Wayanad Chetti +ctu I L Chol +ctz I L Zacatepec Chatino +cua I L Cua +cub I L Cubeo +cuc I L Usila Chinantec +cug I L Cung +cuh I L Chuka +cui I L Cuiba +cuj I L Mashco Piro +cuk I L San Blas Kuna +cul I L Culina +cum I E Cumeral +cuo I E Cumanagoto +cup I E Cupeño +cuq I L Cun +cur I L Chhulung +cut I L Teutila Cuicatec +cuu I L Tai Ya +cuv I L Cuvok +cuw I L Chukwa +cux I L Tepeuxila Cuicatec +cvg I L Chug +cvn I L Valle Nacional Chinantec +cwa I L Kabwa +cwb I L Maindo +cwd I L Woods Cree +cwe I L Kwere +cwg I L Chewong +cwt I L Kuwaataay +cya I L Nopala Chatino +cyb I E Cayubaba +cym wel cym cy I L Welsh +cyo I L Cuyonon +czh I L Huizhou Chinese +czk I E Knaanic +czn I L Zenzontepec Chatino +czo I L Min Zhong Chinese +czt I L Zotung Chin +daa I L Dangaléat +dac I L Dambi +dad I L Marik +dae I L Duupa +dag I L Dagbani +dah I L Gwahatike +dai I L Day +daj I L Dar Fur Daju +dak dak dak I L Dakota +dal I L Dahalo +dam I L Damakawa +dan dan dan da I L Danish +dao I L Daai Chin +daq I L Dandami Maria +dar dar dar I L Dargwa +das I L Daho-Doo +dau I L Dar Sila Daju +dav I L Taita +daw I L Davawenyo +dax I L Dayi +daz I L Dao +dba I L Bangime +dbb I L Deno +dbd I L Dadiya +dbe I L Dabe +dbf I L Edopi +dbg I L Dogul Dom Dogon +dbi I L Doka +dbj I L Ida'an +dbl I L Dyirbal +dbm I L Duguri +dbn I L Duriankere +dbo I L Dulbu +dbp I L Duwai +dbq I L Daba +dbr I L Dabarre +dbt I L Ben Tey Dogon +dbu I L Bondum Dom Dogon +dbv I L Dungu +dbw I L Bankan Tey Dogon +dby I L Dibiyaso +dcc I L Deccan +dcr I E Negerhollands +dda I E Dadi Dadi +ddd I L Dongotono +dde I L Doondo +ddg I L Fataluku +ddi I L West Goodenough +ddj I L Jaru +ddn I L Dendi (Benin) +ddo I L Dido +ddr I E Dhudhuroa +dds I L Donno So Dogon +ddw I L Dawera-Daweloor +dec I L Dagik +ded I L Dedua +dee I L Dewoin +def I L Dezfuli +deg I L Degema +deh I L Dehwari +dei I L Demisa +dek I L Dek +del del del M L Delaware +dem I L Dem +den den den M L Slave (Athapascan) +dep I E Pidgin Delaware +deq I L Dendi (Central African Republic) +der I L Deori +des I L Desano +deu ger deu de I L German +dev I L Domung +dez I L Dengese +dga I L Southern Dagaare +dgb I L Bunoge Dogon +dgc I L Casiguran Dumagat Agta +dgd I L Dagaari Dioula +dge I L Degenan +dgg I L Doga +dgh I L Dghwede +dgi I L Northern Dagara +dgk I L Dagba +dgl I L Andaandi +dgn I E Dagoman +dgo I L Dogri (individual language) +dgr dgr dgr I L Dogrib +dgs I L Dogoso +dgt I E Ndra'ngith +dgu I L Degaru +dgw I E Daungwurrung +dgx I L Doghoro +dgz I L Daga +dhd I L Dhundari +dhg I L Djangu +dhi I L Dhimal +dhl I L Dhalandji +dhm I L Zemba +dhn I L Dhanki +dho I L Dhodia +dhr I L Dhargari +dhs I L Dhaiso +dhu I E Dhurga +dhv I L Dehu +dhw I L Dhanwar (Nepal) +dhx I L Dhungaloo +dia I L Dia +dib I L South Central Dinka +dic I L Lakota Dida +did I L Didinga +dif I E Dieri +dig I L Digo +dih I L Kumiai +dii I L Dimbong +dij I L Dai +dik I L Southwestern Dinka +dil I L Dilling +dim I L Dime +din din din M L Dinka +dio I L Dibo +dip I L Northeastern Dinka +diq I L Dimli (individual language) +dir I L Dirim +dis I L Dimasa +dit I E Dirari +diu I L Diriku +div div div dv I L Dhivehi +diw I L Northwestern Dinka +dix I L Dixon Reef +diy I L Diuwe +diz I L Ding +dja I E Djadjawurrung +djb I L Djinba +djc I L Dar Daju Daju +djd I L Djamindjung +dje I L Zarma +djf I E Djangun +dji I L Djinang +djj I L Djeebbana +djk I L Eastern Maroon Creole +djm I L Jamsay Dogon +djn I L Djauan +djo I L Jangkang +djr I L Djambarrpuyngu +dju I L Kapriman +djw I E Djawi +dka I L Dakpakha +dkk I L Dakka +dkr I L Kuijau +dks I L Southeastern Dinka +dkx I L Mazagway +dlg I L Dolgan +dlk I L Dahalik +dlm I E Dalmatian +dln I L Darlong +dma I L Duma +dmb I L Mombo Dogon +dmc I L Gavak +dmd I E Madhi Madhi +dme I L Dugwor +dmg I L Upper Kinabatangan +dmk I L Domaaki +dml I L Dameli +dmm I L Dama +dmo I L Kemedzung +dmr I L East Damar +dms I L Dampelas +dmu I L Dubu +dmv I L Dumpas +dmw I L Mudburra +dmx I L Dema +dmy I L Demta +dna I L Upper Grand Valley Dani +dnd I L Daonda +dne I L Ndendeule +dng I L Dungan +dni I L Lower Grand Valley Dani +dnj I L Dan +dnk I L Dengka +dnn I L Dzùùngoo +dnr I L Danaru +dnt I L Mid Grand Valley Dani +dnu I L Danau +dnv I L Danu +dnw I L Western Dani +dny I L Dení +doa I L Dom +dob I L Dobu +doc I L Northern Dong +doe I L Doe +dof I L Domu +doh I L Dong +doi doi doi M L Dogri (macrolanguage) +dok I L Dondo +dol I L Doso +don I L Toura (Papua New Guinea) +doo I L Dongo +dop I L Lukpa +doq I L Dominican Sign Language +dor I L Dori'o +dos I L Dogosé +dot I L Dass +dov I L Dombe +dow I L Doyayo +dox I L Bussa +doy I L Dompo +doz I L Dorze +dpp I L Papar +drb I L Dair +drc I L Minderico +drd I L Darmiya +dre I L Dolpo +drg I L Rungus +dri I L C'lela +drl I L Paakantyi +drn I L West Damar +dro I L Daro-Matu Melanau +drq I E Dura +drr I E Dororo +drs I L Gedeo +drt I L Drents +dru I L Rukai +dry I L Darai +dsb dsb dsb I L Lower Sorbian +dse I L Dutch Sign Language +dsh I L Daasanach +dsi I L Disa +dsl I L Danish Sign Language +dsn I L Dusner +dso I L Desiya +dsq I L Tadaksahak +dta I L Daur +dtb I L Labuk-Kinabatangan Kadazan +dtd I L Ditidaht +dth I E Adithinngithigh +dti I L Ana Tinga Dogon +dtk I L Tene Kan Dogon +dtm I L Tomo Kan Dogon +dto I L Tommo So Dogon +dtp I L Central Dusun +dtr I L Lotud +dts I L Toro So Dogon +dtt I L Toro Tegu Dogon +dtu I L Tebul Ure Dogon +dty I L Dotyali +dua dua dua I L Duala +dub I L Dubli +duc I L Duna +dud I L Hun-Saare +due I L Umiray Dumaget Agta +duf I L Dumbea +dug I L Duruma +duh I L Dungra Bhil +dui I L Dumun +duj I L Dhuwal +duk I L Uyajitaya +dul I L Alabat Island Agta +dum dum dum I H Middle Dutch (ca. 1050-1350) +dun I L Dusun Deyah +duo I L Dupaninan Agta +dup I L Duano +duq I L Dusun Malang +dur I L Dii +dus I L Dumi +duu I L Drung +duv I L Duvle +duw I L Dusun Witu +dux I L Duungooma +duy I E Dicamay Agta +duz I E Duli +dva I L Duau +dwa I L Diri +dwr I L Dawro +dws I C Dutton World Speedwords +dww I L Dawawa +dya I L Dyan +dyb I E Dyaberdyaber +dyd I E Dyugun +dyg I E Villa Viciosa Agta +dyi I L Djimini Senoufo +dym I L Yanda Dom Dogon +dyn I L Dyangadi +dyo I L Jola-Fonyi +dyu dyu dyu I L Dyula +dyy I L Dyaabugay +dza I L Tunzu +dzd I L Daza +dze I E Djiwarli +dzg I L Dazaga +dzl I L Dzalakha +dzn I L Dzando +dzo dzo dzo dz I L Dzongkha +eaa I E Karenggapa +ebg I L Ebughu +ebk I L Eastern Bontok +ebo I L Teke-Ebo +ebr I L Ebrié +ebu I L Embu +ecr I A Eteocretan +ecs I L Ecuadorian Sign Language +ecy I A Eteocypriot +eee I L E +efa I L Efai +efe I L Efe +efi efi efi I L Efik +ega I L Ega +egl I L Emilian +ego I L Eggon +egy egy egy I A Egyptian (Ancient) +ehu I L Ehueun +eip I L Eipomek +eit I L Eitiep +eiv I L Askopan +eja I L Ejamat +eka eka eka I L Ekajuk +ekc I E Eastern Karnic +eke I L Ekit +ekg I L Ekari +eki I L Eki +ekk I L Standard Estonian +ekl I L Kol (Bangladesh) +ekm I L Elip +eko I L Koti +ekp I L Ekpeye +ekr I L Yace +eky I L Eastern Kayah +ele I L Elepi +elh I L El Hugeirat +eli I E Nding +elk I L Elkei +ell gre ell el I L Modern Greek (1453-) +elm I L Eleme +elo I L El Molo +elu I L Elu +elx elx elx I A Elamite +ema I L Emai-Iuleha-Ora +emb I L Embaloh +eme I L Emerillon +emg I L Eastern Meohang +emi I L Mussau-Emira +emk I L Eastern Maninkakan +emm I E Mamulique +emn I L Eman +emo I E Emok +emp I L Northern Emberá +ems I L Pacific Gulf Yupik +emu I L Eastern Muria +emw I L Emplawas +emx I L Erromintxela +emy I E Epigraphic Mayan +ena I L Apali +enb I L Markweeta +enc I L En +end I L Ende +enf I L Forest Enets +eng eng eng en I L English +enh I L Tundra Enets +enm enm enm I H Middle English (1100-1500) +enn I L Engenni +eno I L Enggano +enq I L Enga +enr I L Emumu +enu I L Enu +env I L Enwan (Edu State) +enw I L Enwan (Akwa Ibom State) +eot I L Beti (Côte d'Ivoire) +epi I L Epie +epo epo epo eo I C Esperanto +era I L Eravallan +erg I L Sie +erh I L Eruwa +eri I L Ogea +erk I L South Efate +ero I L Horpa +err I E Erre +ers I L Ersu +ert I L Eritai +erw I L Erokwanas +ese I L Ese Ejja +esh I L Eshtehardi +esi I L North Alaskan Inupiatun +esk I L Northwest Alaska Inupiatun +esl I L Egypt Sign Language +esm I E Esuma +esn I L Salvadoran Sign Language +eso I L Estonian Sign Language +esq I E Esselen +ess I L Central Siberian Yupik +est est est et M L Estonian +esu I L Central Yupik +etb I L Etebi +etc I E Etchemin +eth I L Ethiopian Sign Language +etn I L Eton (Vanuatu) +eto I L Eton (Cameroon) +etr I L Edolo +ets I L Yekhee +ett I A Etruscan +etu I L Ejagham +etx I L Eten +etz I L Semimi +eus baq eus eu I L Basque +eve I L Even +evh I L Uvbie +evn I L Evenki +ewe ewe ewe ee I L Ewe +ewo ewo ewo I L Ewondo +ext I L Extremaduran +eya I E Eyak +eyo I L Keiyo +eza I L Ezaa +eze I L Uzekwe +faa I L Fasu +fab I L Fa d'Ambu +fad I L Wagi +faf I L Fagani +fag I L Finongan +fah I L Baissa Fali +fai I L Faiwol +faj I L Faita +fak I L Fang (Cameroon) +fal I L South Fali +fam I L Fam +fan fan fan I L Fang (Equatorial Guinea) +fao fao fao fo I L Faroese +fap I L Palor +far I L Fataleka +fas per fas fa M L Persian +fat fat fat I L Fanti +fau I L Fayu +fax I L Fala +fay I L Southwestern Fars +faz I L Northwestern Fars +fbl I L West Albay Bikol +fcs I L Quebec Sign Language +fer I L Feroge +ffi I L Foia Foia +ffm I L Maasina Fulfulde +fgr I L Fongoro +fia I L Nobiin +fie I L Fyer +fij fij fij fj I L Fijian +fil fil fil I L Filipino +fin fin fin fi I L Finnish +fip I L Fipa +fir I L Firan +fit I L Tornedalen Finnish +fiw I L Fiwaga +fkk I L Kirya-Konzəl +fkv I L Kven Finnish +fla I L Kalispel-Pend d'Oreille +flh I L Foau +fli I L Fali +fll I L North Fali +fln I E Flinders Island +flr I L Fuliiru +fly I L Tsotsitaal +fmp I L Fe'fe' +fmu I L Far Western Muria +fng I L Fanagalo +fni I L Fania +fod I L Foodo +foi I L Foi +fom I L Foma +fon fon fon I L Fon +for I L Fore +fos I E Siraya +fpe I L Fernando Po Creole English +fqs I L Fas +fra fre fra fr I L French +frc I L Cajun French +frd I L Fordata +frk I E Frankish +frm frm frm I H Middle French (ca. 1400-1600) +fro fro fro I H Old French (842-ca. 1400) +frp I L Arpitan +frq I L Forak +frr frr frr I L Northern Frisian +frs frs frs I L Eastern Frisian +frt I L Fortsenal +fry fry fry fy I L Western Frisian +fse I L Finnish Sign Language +fsl I L French Sign Language +fss I L Finland-Swedish Sign Language +fub I L Adamawa Fulfulde +fuc I L Pulaar +fud I L East Futuna +fue I L Borgu Fulfulde +fuf I L Pular +fuh I L Western Niger Fulfulde +fui I L Bagirmi Fulfulde +fuj I L Ko +ful ful ful ff M L Fulah +fum I L Fum +fun I L Fulniô +fuq I L Central-Eastern Niger Fulfulde +fur fur fur I L Friulian +fut I L Futuna-Aniwa +fuu I L Furu +fuv I L Nigerian Fulfulde +fuy I L Fuyug +fvr I L Fur +fwa I L Fwâi +fwe I L Fwe +gaa gaa gaa I L Ga +gab I L Gabri +gac I L Mixed Great Andamanese +gad I L Gaddang +gae I L Guarequena +gaf I L Gende +gag I L Gagauz +gah I L Alekano +gai I L Borei +gaj I L Gadsup +gak I L Gamkonora +gal I L Galolen +gam I L Kandawo +gan I L Gan Chinese +gao I L Gants +gap I L Gal +gaq I L Gata' +gar I L Galeya +gas I L Adiwasi Garasia +gat I L Kenati +gau I L Mudhili Gadaba +gaw I L Nobonob +gax I L Borana-Arsi-Guji Oromo +gay gay gay I L Gayo +gaz I L West Central Oromo +gba gba gba M L Gbaya (Central African Republic) +gbb I L Kaytetye +gbd I L Karadjeri +gbe I L Niksek +gbf I L Gaikundi +gbg I L Gbanziri +gbh I L Defi Gbe +gbi I L Galela +gbj I L Bodo Gadaba +gbk I L Gaddi +gbl I L Gamit +gbm I L Garhwali +gbn I L Mo'da +gbo I L Northern Grebo +gbp I L Gbaya-Bossangoa +gbq I L Gbaya-Bozoum +gbr I L Gbagyi +gbs I L Gbesi Gbe +gbu I L Gagadu +gbv I L Gbanu +gbw I L Gabi-Gabi +gbx I L Eastern Xwla Gbe +gby I L Gbari +gbz I L Zoroastrian Dari +gcc I L Mali +gcd I E Ganggalida +gce I E Galice +gcf I L Guadeloupean Creole French +gcl I L Grenadian Creole English +gcn I L Gaina +gcr I L Guianese Creole French +gct I L Colonia Tovar German +gda I L Gade Lohar +gdb I L Pottangi Ollar Gadaba +gdc I E Gugu Badhun +gdd I L Gedaged +gde I L Gude +gdf I L Guduf-Gava +gdg I L Ga'dang +gdh I L Gadjerawang +gdi I L Gundi +gdj I L Gurdjar +gdk I L Gadang +gdl I L Dirasha +gdm I L Laal +gdn I L Umanakaina +gdo I L Ghodoberi +gdq I L Mehri +gdr I L Wipi +gds I L Ghandruk Sign Language +gdt I E Kungardutyi +gdu I L Gudu +gdx I L Godwari +gea I L Geruma +geb I L Kire +gec I L Gboloo Grebo +ged I L Gade +geg I L Gengle +geh I L Hutterite German +gei I L Gebe +gej I L Gen +gek I L Yiwom +gel I L ut-Ma'in +geq I L Geme +ges I L Geser-Gorom +gew I L Gera +gex I L Garre +gey I L Enya +gez gez gez I A Geez +gfk I L Patpatar +gft I E Gafat +gfx I L Mangetti Dune !Xung +gga I L Gao +ggb I L Gbii +ggd I E Gugadj +gge I L Guragone +ggg I L Gurgula +ggk I E Kungarakany +ggl I L Ganglau +ggm I E Gugu Mini +ggn I L Eastern Gurung +ggo I L Southern Gondi +ggt I L Gitua +ggu I L Gagu +ggw I L Gogodala +gha I L Ghadamès +ghc I E Hiberno-Scottish Gaelic +ghe I L Southern Ghale +ghh I L Northern Ghale +ghk I L Geko Karen +ghl I L Ghulfan +ghn I L Ghanongga +gho I E Ghomara +ghr I L Ghera +ghs I L Guhu-Samane +ght I L Kuke +gia I L Kitja +gib I L Gibanawa +gic I L Gail +gid I L Gidar +gig I L Goaria +gih I L Githabul +gil gil gil I L Gilbertese +gim I L Gimi (Eastern Highlands) +gin I L Hinukh +gip I L Gimi (West New Britain) +giq I L Green Gelao +gir I L Red Gelao +gis I L North Giziga +git I L Gitxsan +giu I L Mulao +giw I L White Gelao +gix I L Gilima +giy I L Giyug +giz I L South Giziga +gji I L Geji +gjk I L Kachi Koli +gjm I E Gunditjmara +gjn I L Gonja +gju I L Gujari +gka I L Guya +gke I L Ndai +gkn I L Gokana +gko I E Kok-Nar +gkp I L Guinea Kpelle +gla gla gla gd I L Scottish Gaelic +glc I L Bon Gula +gld I L Nanai +gle gle gle ga I L Irish +glg glg glg gl I L Galician +glh I L Northwest Pashayi +gli I E Guliguli +glj I L Gula Iro +glk I L Gilaki +gll I E Garlali +glo I L Galambu +glr I L Glaro-Twabo +glu I L Gula (Chad) +glv glv glv gv I L Manx +glw I L Glavda +gly I E Gule +gma I E Gambera +gmb I L Gula'alaa +gmd I L Mághdì +gmh gmh gmh I H Middle High German (ca. 1050-1500) +gml I H Middle Low German +gmm I L Gbaya-Mbodomo +gmn I L Gimnime +gmu I L Gumalu +gmv I L Gamo +gmx I L Magoma +gmy I A Mycenaean Greek +gmz I L Mgbolizhia +gna I L Kaansa +gnb I L Gangte +gnc I E Guanche +gnd I L Zulgo-Gemzek +gne I L Ganang +gng I L Ngangam +gnh I L Lere +gni I L Gooniyandi +gnk I L //Gana +gnl I E Gangulu +gnm I L Ginuman +gnn I L Gumatj +gno I L Northern Gondi +gnq I L Gana +gnr I E Gureng Gureng +gnt I L Guntai +gnu I L Gnau +gnw I L Western Bolivian Guaraní +gnz I L Ganzi +goa I L Guro +gob I L Playero +goc I L Gorakor +god I L Godié +goe I L Gongduk +gof I L Gofa +gog I L Gogo +goh goh goh I H Old High German (ca. 750-1050) +goi I L Gobasi +goj I L Gowlan +gok I L Gowli +gol I L Gola +gom I L Goan Konkani +gon gon gon M L Gondi +goo I L Gone Dau +gop I L Yeretuar +goq I L Gorap +gor gor gor I L Gorontalo +gos I L Gronings +got got got I A Gothic +gou I L Gavar +gow I L Gorowa +gox I L Gobu +goy I L Goundo +goz I L Gozarkhani +gpa I L Gupa-Abawa +gpe I L Ghanaian Pidgin English +gpn I L Taiap +gqa I L Ga'anda +gqi I L Guiqiong +gqn I E Guana (Brazil) +gqr I L Gor +gqu I L Qau +gra I L Rajput Garasia +grb grb grb M L Grebo +grc grc grc I H Ancient Greek (to 1453) +grd I L Guruntum-Mbaaru +grg I L Madi +grh I L Gbiri-Niragu +gri I L Ghari +grj I L Southern Grebo +grm I L Kota Marudu Talantang +grn grn grn gn M L Guarani +gro I L Groma +grq I L Gorovu +grr I L Taznatit +grs I L Gresi +grt I L Garo +gru I L Kistane +grv I L Central Grebo +grw I L Gweda +grx I L Guriaso +gry I L Barclayville Grebo +grz I L Guramalum +gse I L Ghanaian Sign Language +gsg I L German Sign Language +gsl I L Gusilay +gsm I L Guatemalan Sign Language +gsn I L Gusan +gso I L Southwest Gbaya +gsp I L Wasembo +gss I L Greek Sign Language +gsw gsw gsw I L Swiss German +gta I L Guató +gti I L Gbati-ri +gtu I E Aghu-Tharnggala +gua I L Shiki +gub I L Guajajára +guc I L Wayuu +gud I L Yocoboué Dida +gue I L Gurinji +guf I L Gupapuyngu +gug I L Paraguayan Guaraní +guh I L Guahibo +gui I L Eastern Bolivian Guaraní +guj guj guj gu I L Gujarati +guk I L Gumuz +gul I L Sea Island Creole English +gum I L Guambiano +gun I L Mbyá Guaraní +guo I L Guayabero +gup I L Gunwinggu +guq I L Aché +gur I L Farefare +gus I L Guinean Sign Language +gut I L Maléku Jaíka +guu I L Yanomamö +guv I E Gey +guw I L Gun +gux I L Gourmanchéma +guz I L Gusii +gva I L Guana (Paraguay) +gvc I L Guanano +gve I L Duwet +gvf I L Golin +gvj I L Guajá +gvl I L Gulay +gvm I L Gurmana +gvn I L Kuku-Yalanji +gvo I L Gavião Do Jiparaná +gvp I L Pará Gavião +gvr I L Western Gurung +gvs I L Gumawana +gvy I E Guyani +gwa I L Mbato +gwb I L Gwa +gwc I L Kalami +gwd I L Gawwada +gwe I L Gweno +gwf I L Gowro +gwg I L Moo +gwi gwi gwi I L Gwichʼin +gwj I L /Gwi +gwm I E Awngthim +gwn I L Gwandara +gwr I L Gwere +gwt I L Gawar-Bati +gwu I E Guwamu +gww I L Kwini +gwx I L Gua +gxx I L Wè Southern +gya I L Northwest Gbaya +gyb I L Garus +gyd I L Kayardild +gye I L Gyem +gyf I E Gungabula +gyg I L Gbayi +gyi I L Gyele +gyl I L Gayil +gym I L Ngäbere +gyn I L Guyanese Creole English +gyr I L Guarayu +gyy I E Gunya +gza I L Ganza +gzi I L Gazi +gzn I L Gane +haa I L Han +hab I L Hanoi Sign Language +hac I L Gurani +had I L Hatam +hae I L Eastern Oromo +haf I L Haiphong Sign Language +hag I L Hanga +hah I L Hahon +hai hai hai M L Haida +haj I L Hajong +hak I L Hakka Chinese +hal I L Halang +ham I L Hewa +han I L Hangaza +hao I L Hakö +hap I L Hupla +haq I L Ha +har I L Harari +has I L Haisla +hat hat hat ht I L Haitian +hau hau hau ha I L Hausa +hav I L Havu +haw haw haw I L Hawaiian +hax I L Southern Haida +hay I L Haya +haz I L Hazaragi +hba I L Hamba +hbb I L Huba +hbn I L Heiban +hbo I H Ancient Hebrew +hbs sh M L Serbo-Croatian Code element for 639-1 has been deprecated +hbu I L Habu +hca I L Andaman Creole Hindi +hch I L Huichol +hdn I L Northern Haida +hds I L Honduras Sign Language +hdy I L Hadiyya +hea I L Northern Qiandong Miao +heb heb heb he I L Hebrew +hed I L Herdé +heg I L Helong +heh I L Hehe +hei I L Heiltsuk +hem I L Hemba +her her her hz I L Herero +hgm I L Hai//om +hgw I L Haigwai +hhi I L Hoia Hoia +hhr I L Kerak +hhy I L Hoyahoya +hia I L Lamang +hib I E Hibito +hid I L Hidatsa +hif I L Fiji Hindi +hig I L Kamwe +hih I L Pamosu +hii I L Hinduri +hij I L Hijuk +hik I L Seit-Kaitetu +hil hil hil I L Hiligaynon +hin hin hin hi I L Hindi +hio I L Tsoa +hir I L Himarimã +hit hit hit I A Hittite +hiw I L Hiw +hix I L Hixkaryána +hji I L Haji +hka I L Kahe +hke I L Hunde +hkk I L Hunjara-Kaina Ke +hks I L Hong Kong Sign Language +hla I L Halia +hlb I L Halbi +hld I L Halang Doan +hle I L Hlersu +hlt I L Matu Chin +hlu I A Hieroglyphic Luwian +hma I L Southern Mashan Hmong +hmb I L Humburi Senni Songhay +hmc I L Central Huishui Hmong +hmd I L Large Flowery Miao +hme I L Eastern Huishui Hmong +hmf I L Hmong Don +hmg I L Southwestern Guiyang Hmong +hmh I L Southwestern Huishui Hmong +hmi I L Northern Huishui Hmong +hmj I L Ge +hmk I E Maek +hml I L Luopohe Hmong +hmm I L Central Mashan Hmong +hmn hmn hmn M L Hmong +hmo hmo hmo ho I L Hiri Motu +hmp I L Northern Mashan Hmong +hmq I L Eastern Qiandong Miao +hmr I L Hmar +hms I L Southern Qiandong Miao +hmt I L Hamtai +hmu I L Hamap +hmv I L Hmong Dô +hmw I L Western Mashan Hmong +hmy I L Southern Guiyang Hmong +hmz I L Hmong Shua +hna I L Mina (Cameroon) +hnd I L Southern Hindko +hne I L Chhattisgarhi +hnh I L //Ani +hni I L Hani +hnj I L Hmong Njua +hnn I L Hanunoo +hno I L Northern Hindko +hns I L Caribbean Hindustani +hnu I L Hung +hoa I L Hoava +hob I L Mari (Madang Province) +hoc I L Ho +hod I E Holma +hoe I L Horom +hoh I L Hobyót +hoi I L Holikachuk +hoj I L Hadothi +hol I L Holu +hom I E Homa +hoo I L Holoholo +hop I L Hopi +hor I E Horo +hos I L Ho Chi Minh City Sign Language +hot I L Hote +hov I L Hovongan +how I L Honi +hoy I L Holiya +hoz I L Hozo +hpo I L Hpon +hps I L Hawai'i Pidgin Sign Language +hra I L Hrangkhol +hrc I L Niwer Mil +hre I L Hre +hrk I L Haruku +hrm I L Horned Miao +hro I L Haroi +hrp I E Nhirrpi +hrt I L Hértevin +hru I L Hruso +hrv hrv hrv hr I L Croatian +hrw I L Warwar Feni +hrx I L Hunsrik +hrz I L Harzani +hsb hsb hsb I L Upper Sorbian +hsh I L Hungarian Sign Language +hsl I L Hausa Sign Language +hsn I L Xiang Chinese +hss I L Harsusi +hti I L Hoti +hto I L Minica Huitoto +hts I L Hadza +htu I L Hitu +htx I A Middle Hittite +hub I L Huambisa +huc I L =/Hua +hud I L Huaulu +hue I L San Francisco Del Mar Huave +huf I L Humene +hug I L Huachipaeri +huh I L Huilliche +hui I L Huli +huj I L Northern Guiyang Hmong +huk I L Hulung +hul I L Hula +hum I L Hungana +hun hun hun hu I L Hungarian +huo I L Hu +hup hup hup I L Hupa +huq I L Tsat +hur I L Halkomelem +hus I L Huastec +hut I L Humla +huu I L Murui Huitoto +huv I L San Mateo Del Mar Huave +huw I E Hukumina +hux I L Nüpode Huitoto +huy I L Hulaulá +huz I L Hunzib +hvc I L Haitian Vodoun Culture Language +hve I L San Dionisio Del Mar Huave +hvk I L Haveke +hvn I L Sabu +hvv I L Santa María Del Mar Huave +hwa I L Wané +hwc I L Hawai'i Creole English +hwo I L Hwana +hya I L Hya +hye arm hye hy I L Armenian +iai I L Iaai +ian I L Iatmul +iap I L Iapama +iar I L Purari +iba iba iba I L Iban +ibb I L Ibibio +ibd I L Iwaidja +ibe I L Akpes +ibg I L Ibanag +ibl I L Ibaloi +ibm I L Agoi +ibn I L Ibino +ibo ibo ibo ig I L Igbo +ibr I L Ibuoro +ibu I L Ibu +iby I L Ibani +ica I L Ede Ica +ich I L Etkywan +icl I L Icelandic Sign Language +icr I L Islander Creole English +ida I L Idakho-Isukha-Tiriki +idb I L Indo-Portuguese +idc I L Idon +idd I L Ede Idaca +ide I L Idere +idi I L Idi +ido ido ido io I C Ido +idr I L Indri +ids I L Idesa +idt I L Idaté +idu I L Idoma +ifa I L Amganad Ifugao +ifb I L Batad Ifugao +ife I L Ifè +iff I E Ifo +ifk I L Tuwali Ifugao +ifm I L Teke-Fuumu +ifu I L Mayoyao Ifugao +ify I L Keley-I Kallahan +igb I L Ebira +ige I L Igede +igg I L Igana +igl I L Igala +igm I L Kanggape +ign I L Ignaciano +igo I L Isebe +igs I C Interglossa +igw I L Igwe +ihb I L Iha Based Pidgin +ihi I L Ihievbe +ihp I L Iha +ihw I E Bidhawal +iii iii iii ii I L Sichuan Yi +iin I E Thiin +ijc I L Izon +ije I L Biseni +ijj I L Ede Ije +ijn I L Kalabari +ijs I L Southeast Ijo +ike I L Eastern Canadian Inuktitut +iki I L Iko +ikk I L Ika +ikl I L Ikulu +iko I L Olulumo-Ikom +ikp I L Ikpeshi +ikr I E Ikaranggal +ikt I L Inuinnaqtun +iku iku iku iu M L Inuktitut +ikv I L Iku-Gora-Ankwa +ikw I L Ikwere +ikx I L Ik +ikz I L Ikizu +ila I L Ile Ape +ilb I L Ila +ile ile ile ie I C Interlingue +ilg I E Garig-Ilgar +ili I L Ili Turki +ilk I L Ilongot +ill I L Iranun +ilo ilo ilo I L Iloko +ils I L International Sign +ilu I L Ili'uun +ilv I L Ilue +ima I L Mala Malasar +ime I L Imeraguen +imi I L Anamgura +iml I E Miluk +imn I L Imonda +imo I L Imbongu +imr I L Imroing +ims I A Marsian +imy I A Milyan +ina ina ina ia I C Interlingua (International Auxiliary Language Association) +inb I L Inga +ind ind ind id I L Indonesian +ing I L Degexit'an +inh inh inh I L Ingush +inj I L Jungle Inga +inl I L Indonesian Sign Language +inm I A Minaean +inn I L Isinai +ino I L Inoke-Yate +inp I L Iñapari +ins I L Indian Sign Language +int I L Intha +inz I E Ineseño +ior I L Inor +iou I L Tuma-Irumu +iow I E Iowa-Oto +ipi I L Ipili +ipk ipk ipk ik M L Inupiaq +ipo I L Ipiko +iqu I L Iquito +iqw I L Ikwo +ire I L Iresim +irh I L Irarutu +iri I L Irigwe +irk I L Iraqw +irn I L Irántxe +irr I L Ir +iru I L Irula +irx I L Kamberau +iry I L Iraya +isa I L Isabi +isc I L Isconahua +isd I L Isnag +ise I L Italian Sign Language +isg I L Irish Sign Language +ish I L Esan +isi I L Nkem-Nkum +isk I L Ishkashimi +isl ice isl is I L Icelandic +ism I L Masimasi +isn I L Isanzu +iso I L Isoko +isr I L Israeli Sign Language +ist I L Istriot +isu I L Isu (Menchum Division) +ita ita ita it I L Italian +itb I L Binongan Itneg +ite I E Itene +iti I L Inlaod Itneg +itk I L Judeo-Italian +itl I L Itelmen +itm I L Itu Mbon Uzo +ito I L Itonama +itr I L Iteri +its I L Isekiri +itt I L Maeng Itneg +itv I L Itawit +itw I L Ito +itx I L Itik +ity I L Moyadan Itneg +itz I L Itzá +ium I L Iu Mien +ivb I L Ibatan +ivv I L Ivatan +iwk I L I-Wak +iwm I L Iwam +iwo I L Iwur +iws I L Sepik Iwam +ixc I L Ixcatec +ixl I L Ixil +iya I L Iyayu +iyo I L Mesaka +iyx I L Yaka (Congo) +izh I L Ingrian +izr I L Izere +izz I L Izii +jaa I L Jamamadí +jab I L Hyam +jac I L Popti' +jad I L Jahanka +jae I L Yabem +jaf I L Jara +jah I L Jah Hut +jaj I L Zazao +jak I L Jakun +jal I L Yalahatan +jam I L Jamaican Creole English +jan I E Jandai +jao I L Yanyuwa +jaq I L Yaqay +jas I L New Caledonian Javanese +jat I L Jakati +jau I L Yaur +jav jav jav jv I L Javanese +jax I L Jambi Malay +jay I L Yan-nhangu +jaz I L Jawe +jbe I L Judeo-Berber +jbi I E Badjiri +jbj I L Arandai +jbk I L Barikewa +jbn I L Nafusi +jbo jbo jbo I C Lojban +jbr I L Jofotek-Bromnya +jbt I L Jabutí +jbu I L Jukun Takum +jbw I E Yawijibaya +jcs I L Jamaican Country Sign Language +jct I L Krymchak +jda I L Jad +jdg I L Jadgali +jdt I L Judeo-Tat +jeb I L Jebero +jee I L Jerung +jeg I L Jeng +jeh I L Jeh +jei I L Yei +jek I L Jeri Kuo +jel I L Yelmek +jen I L Dza +jer I L Jere +jet I L Manem +jeu I L Jonkor Bourmataguil +jgb I E Ngbee +jge I L Judeo-Georgian +jgk I L Gwak +jgo I L Ngomba +jhi I L Jehai +jhs I L Jhankot Sign Language +jia I L Jina +jib I L Jibu +jic I L Tol +jid I L Bu +jie I L Jilbe +jig I L Djingili +jih I L sTodsde +jii I L Jiiddu +jil I L Jilim +jim I L Jimi (Cameroon) +jio I L Jiamao +jiq I L Guanyinqiao +jit I L Jita +jiu I L Youle Jinuo +jiv I L Shuar +jiy I L Buyuan Jinuo +jjr I L Bankal +jkm I L Mobwa Karen +jko I L Kubo +jkp I L Paku Karen +jkr I L Koro (India) +jku I L Labir +jle I L Ngile +jls I L Jamaican Sign Language +jma I L Dima +jmb I L Zumbun +jmc I L Machame +jmd I L Yamdena +jmi I L Jimi (Nigeria) +jml I L Jumli +jmn I L Makuri Naga +jmr I L Kamara +jms I L Mashi (Nigeria) +jmw I L Mouwase +jmx I L Western Juxtlahuaca Mixtec +jna I L Jangshung +jnd I L Jandavra +jng I E Yangman +jni I L Janji +jnj I L Yemsa +jnl I L Rawat +jns I L Jaunsari +job I L Joba +jod I L Wojenaka +jor I E Jorá +jos I L Jordanian Sign Language +jow I L Jowulu +jpa I H Jewish Palestinian Aramaic +jpn jpn jpn ja I L Japanese +jpr jpr jpr I L Judeo-Persian +jqr I L Jaqaru +jra I L Jarai +jrb jrb jrb M L Judeo-Arabic +jrr I L Jiru +jrt I L Jorto +jru I L Japrería +jsl I L Japanese Sign Language +jua I L Júma +jub I L Wannu +juc I E Jurchen +jud I L Worodougou +juh I L Hõne +jui I E Ngadjuri +juk I L Wapan +jul I L Jirel +jum I L Jumjum +jun I L Juang +juo I L Jiba +jup I L Hupdë +jur I L Jurúna +jus I L Jumla Sign Language +jut I L Jutish +juu I L Ju +juw I L Wãpha +juy I L Juray +jvd I E Javindo +jvn I L Caribbean Javanese +jwi I L Jwira-Pepesa +jya I L Jiarong +jye I L Judeo-Yemeni Arabic +jyy I L Jaya +kaa kaa kaa I L Kara-Kalpak +kab kab kab I L Kabyle +kac kac kac I L Kachin +kad I L Adara +kae I E Ketangalan +kaf I L Katso +kag I L Kajaman +kah I L Kara (Central African Republic) +kai I L Karekare +kaj I L Jju +kak I L Kayapa Kallahan +kal kal kal kl I L Kalaallisut +kam kam kam I L Kamba (Kenya) +kan kan kan kn I L Kannada +kao I L Xaasongaxango +kap I L Bezhta +kaq I L Capanahua +kas kas kas ks I L Kashmiri +kat geo kat ka I L Georgian +kau kau kau kr M L Kanuri +kav I L Katukína +kaw kaw kaw I A Kawi +kax I L Kao +kay I L Kamayurá +kaz kaz kaz kk I L Kazakh +kba I E Kalarko +kbb I E Kaxuiâna +kbc I L Kadiwéu +kbd kbd kbd I L Kabardian +kbe I L Kanju +kbf I E Kakauhua +kbg I L Khamba +kbh I L Camsá +kbi I L Kaptiau +kbj I L Kari +kbk I L Grass Koiari +kbl I L Kanembu +kbm I L Iwal +kbn I L Kare (Central African Republic) +kbo I L Keliko +kbp I L Kabiyè +kbq I L Kamano +kbr I L Kafa +kbs I L Kande +kbt I L Abadi +kbu I L Kabutra +kbv I L Dera (Indonesia) +kbw I L Kaiep +kbx I L Ap Ma +kby I L Manga Kanuri +kbz I L Duhwa +kca I L Khanty +kcb I L Kawacha +kcc I L Lubila +kcd I L Ngkâlmpw Kanum +kce I L Kaivi +kcf I L Ukaan +kcg I L Tyap +kch I L Vono +kci I L Kamantan +kcj I L Kobiana +kck I L Kalanga +kcl I L Kela (Papua New Guinea) +kcm I L Gula (Central African Republic) +kcn I L Nubi +kco I L Kinalakna +kcp I L Kanga +kcq I L Kamo +kcr I L Katla +kcs I L Koenoem +kct I L Kaian +kcu I L Kami (Tanzania) +kcv I L Kete +kcw I L Kabwari +kcx I L Kachama-Ganjule +kcy I L Korandje +kcz I L Konongo +kda I E Worimi +kdc I L Kutu +kdd I L Yankunytjatjara +kde I L Makonde +kdf I L Mamusi +kdg I L Seba +kdh I L Tem +kdi I L Kumam +kdj I L Karamojong +kdk I L Numèè +kdl I L Tsikimba +kdm I L Kagoma +kdn I L Kunda +kdp I L Kaningdon-Nindem +kdq I L Koch +kdr I L Karaim +kdt I L Kuy +kdu I L Kadaru +kdw I L Koneraw +kdx I L Kam +kdy I L Keder +kdz I L Kwaja +kea I L Kabuverdianu +keb I L Kélé +kec I L Keiga +ked I L Kerewe +kee I L Eastern Keres +kef I L Kpessi +keg I L Tese +keh I L Keak +kei I L Kei +kej I L Kadar +kek I L Kekchí +kel I L Kela (Democratic Republic of Congo) +kem I L Kemak +ken I L Kenyang +keo I L Kakwa +kep I L Kaikadi +keq I L Kamar +ker I L Kera +kes I L Kugbo +ket I L Ket +keu I L Akebu +kev I L Kanikkaran +kew I L West Kewa +kex I L Kukna +key I L Kupia +kez I L Kukele +kfa I L Kodava +kfb I L Northwestern Kolami +kfc I L Konda-Dora +kfd I L Korra Koraga +kfe I L Kota (India) +kff I L Koya +kfg I L Kudiya +kfh I L Kurichiya +kfi I L Kannada Kurumba +kfj I L Kemiehua +kfk I L Kinnauri +kfl I L Kung +kfm I L Khunsari +kfn I L Kuk +kfo I L Koro (Côte d'Ivoire) +kfp I L Korwa +kfq I L Korku +kfr I L Kachchi +kfs I L Bilaspuri +kft I L Kanjari +kfu I L Katkari +kfv I L Kurmukar +kfw I L Kharam Naga +kfx I L Kullu Pahari +kfy I L Kumaoni +kfz I L Koromfé +kga I L Koyaga +kgb I L Kawe +kgc I L Kasseng +kgd I L Kataang +kge I L Komering +kgf I L Kube +kgg I L Kusunda +kgi I L Selangor Sign Language +kgj I L Gamale Kham +kgk I L Kaiwá +kgl I E Kunggari +kgm I E Karipúna +kgn I L Karingani +kgo I L Krongo +kgp I L Kaingang +kgq I L Kamoro +kgr I L Abun +kgs I L Kumbainggar +kgt I L Somyev +kgu I L Kobol +kgv I L Karas +kgw I L Karon Dori +kgx I L Kamaru +kgy I L Kyerung +kha kha kha I L Khasi +khb I L Lü +khc I L Tukang Besi North +khd I L Bädi Kanum +khe I L Korowai +khf I L Khuen +khg I L Khams Tibetan +khh I L Kehu +khj I L Kuturmi +khk I L Halh Mongolian +khl I L Lusi +khm khm khm km I L Central Khmer +khn I L Khandesi +kho kho kho I A Khotanese +khp I L Kapori +khq I L Koyra Chiini Songhay +khr I L Kharia +khs I L Kasua +kht I L Khamti +khu I L Nkhumbi +khv I L Khvarshi +khw I L Khowar +khx I L Kanu +khy I L Kele (Democratic Republic of Congo) +khz I L Keapara +kia I L Kim +kib I L Koalib +kic I L Kickapoo +kid I L Koshin +kie I L Kibet +kif I L Eastern Parbate Kham +kig I L Kimaama +kih I L Kilmeri +kii I E Kitsai +kij I L Kilivila +kik kik kik ki I L Kikuyu +kil I L Kariya +kim I L Karagas +kin kin kin rw I L Kinyarwanda +kio I L Kiowa +kip I L Sheshi Kham +kiq I L Kosadle +kir kir kir ky I L Kirghiz +kis I L Kis +kit I L Agob +kiu I L Kirmanjki (individual language) +kiv I L Kimbu +kiw I L Northeast Kiwai +kix I L Khiamniungan Naga +kiy I L Kirikiri +kiz I L Kisi +kja I L Mlap +kjb I L Q'anjob'al +kjc I L Coastal Konjo +kjd I L Southern Kiwai +kje I L Kisar +kjf I L Khalaj +kjg I L Khmu +kjh I L Khakas +kji I L Zabana +kjj I L Khinalugh +kjk I L Highland Konjo +kjl I L Western Parbate Kham +kjm I L Kháng +kjn I L Kunjen +kjo I L Harijan Kinnauri +kjp I L Pwo Eastern Karen +kjq I L Western Keres +kjr I L Kurudu +kjs I L East Kewa +kjt I L Phrae Pwo Karen +kju I L Kashaya +kjx I L Ramopa +kjy I L Erave +kjz I L Bumthangkha +kka I L Kakanda +kkb I L Kwerisa +kkc I L Odoodee +kkd I L Kinuku +kke I L Kakabe +kkf I L Kalaktang Monpa +kkg I L Mabaka Valley Kalinga +kkh I L Khün +kki I L Kagulu +kkj I L Kako +kkk I L Kokota +kkl I L Kosarek Yale +kkm I L Kiong +kkn I L Kon Keu +kko I L Karko +kkp I L Gugubera +kkq I L Kaiku +kkr I L Kir-Balar +kks I L Giiwo +kkt I L Koi +kku I L Tumi +kkv I L Kangean +kkw I L Teke-Kukuya +kkx I L Kohin +kky I L Guguyimidjir +kkz I L Kaska +kla I E Klamath-Modoc +klb I L Kiliwa +klc I L Kolbila +kld I L Gamilaraay +kle I L Kulung (Nepal) +klf I L Kendeje +klg I L Tagakaulo +klh I L Weliki +kli I L Kalumpang +klj I L Turkic Khalaj +klk I L Kono (Nigeria) +kll I L Kagan Kalagan +klm I L Migum +kln M L Kalenjin +klo I L Kapya +klp I L Kamasa +klq I L Rumu +klr I L Khaling +kls I L Kalasha +klt I L Nukna +klu I L Klao +klv I L Maskelynes +klw I L Lindu +klx I L Koluwawa +kly I L Kalao +klz I L Kabola +kma I L Konni +kmb kmb kmb I L Kimbundu +kmc I L Southern Dong +kmd I L Majukayang Kalinga +kme I L Bakole +kmf I L Kare (Papua New Guinea) +kmg I L Kâte +kmh I L Kalam +kmi I L Kami (Nigeria) +kmj I L Kumarbhag Paharia +kmk I L Limos Kalinga +kml I L Tanudan Kalinga +kmm I L Kom (India) +kmn I L Awtuw +kmo I L Kwoma +kmp I L Gimme +kmq I L Kwama +kmr I L Northern Kurdish +kms I L Kamasau +kmt I L Kemtuik +kmu I L Kanite +kmv I L Karipúna Creole French +kmw I L Komo (Democratic Republic of Congo) +kmx I L Waboda +kmy I L Koma +kmz I L Khorasani Turkish +kna I L Dera (Nigeria) +knb I L Lubuagan Kalinga +knc I L Central Kanuri +knd I L Konda +kne I L Kankanaey +knf I L Mankanya +kng I L Koongo +kni I L Kanufi +knj I L Western Kanjobal +knk I L Kuranko +knl I L Keninjal +knm I L Kanamarí +knn I L Konkani (individual language) +kno I L Kono (Sierra Leone) +knp I L Kwanja +knq I L Kintaq +knr I L Kaningra +kns I L Kensiu +knt I L Panoan Katukína +knu I L Kono (Guinea) +knv I L Tabo +knw I L Kung-Ekoka +knx I L Kendayan +kny I L Kanyok +knz I L Kalamsé +koa I L Konomala +koc I E Kpati +kod I L Kodi +koe I L Kacipo-Balesi +kof I E Kubi +kog I L Cogui +koh I L Koyo +koi I L Komi-Permyak +koj I L Sara Dunjo +kok kok kok M L Konkani (macrolanguage) +kol I L Kol (Papua New Guinea) +kom kom kom kv M L Komi +kon kon kon kg M L Kongo +koo I L Konzo +kop I L Waube +koq I L Kota (Gabon) +kor kor kor ko I L Korean +kos kos kos I L Kosraean +kot I L Lagwan +kou I L Koke +kov I L Kudu-Camo +kow I L Kugama +kox I E Coxima +koy I L Koyukon +koz I L Korak +kpa I L Kutto +kpb I L Mullu Kurumba +kpc I L Curripaco +kpd I L Koba +kpe kpe kpe M L Kpelle +kpf I L Komba +kpg I L Kapingamarangi +kph I L Kplang +kpi I L Kofei +kpj I L Karajá +kpk I L Kpan +kpl I L Kpala +kpm I L Koho +kpn I E Kepkiriwát +kpo I L Ikposo +kpq I L Korupun-Sela +kpr I L Korafe-Yegha +kps I L Tehit +kpt I L Karata +kpu I L Kafoa +kpv I L Komi-Zyrian +kpw I L Kobon +kpx I L Mountain Koiali +kpy I L Koryak +kpz I L Kupsabiny +kqa I L Mum +kqb I L Kovai +kqc I L Doromu-Koki +kqd I L Koy Sanjaq Surat +kqe I L Kalagan +kqf I L Kakabai +kqg I L Khe +kqh I L Kisankasa +kqi I L Koitabu +kqj I L Koromira +kqk I L Kotafon Gbe +kql I L Kyenele +kqm I L Khisa +kqn I L Kaonde +kqo I L Eastern Krahn +kqp I L Kimré +kqq I L Krenak +kqr I L Kimaragang +kqs I L Northern Kissi +kqt I L Klias River Kadazan +kqu I E Seroa +kqv I L Okolod +kqw I L Kandas +kqx I L Mser +kqy I L Koorete +kqz I E Korana +kra I L Kumhali +krb I E Karkin +krc krc krc I L Karachay-Balkar +krd I L Kairui-Midiki +kre I L Panará +krf I L Koro (Vanuatu) +krh I L Kurama +kri I L Krio +krj I L Kinaray-A +krk I E Kerek +krl krl krl I L Karelian +krm I L Krim +krn I L Sapo +krp I L Korop +krr I L Kru'ng 2 +krs I L Gbaya (Sudan) +krt I L Tumari Kanuri +kru kru kru I L Kurukh +krv I L Kavet +krw I L Western Krahn +krx I L Karon +kry I L Kryts +krz I L Sota Kanum +ksa I L Shuwa-Zamani +ksb I L Shambala +ksc I L Southern Kalinga +ksd I L Kuanua +kse I L Kuni +ksf I L Bafia +ksg I L Kusaghe +ksh I L Kölsch +ksi I L Krisa +ksj I L Uare +ksk I L Kansa +ksl I L Kumalu +ksm I L Kumba +ksn I L Kasiguranin +kso I L Kofa +ksp I L Kaba +ksq I L Kwaami +ksr I L Borong +kss I L Southern Kisi +kst I L Winyé +ksu I L Khamyang +ksv I L Kusu +ksw I L S'gaw Karen +ksx I L Kedang +ksy I L Kharia Thar +ksz I L Kodaku +kta I L Katua +ktb I L Kambaata +ktc I L Kholok +ktd I L Kokata +kte I L Nubri +ktf I L Kwami +ktg I E Kalkutung +kth I L Karanga +kti I L North Muyu +ktj I L Plapo Krumen +ktk I E Kaniet +ktl I L Koroshi +ktm I L Kurti +ktn I L Karitiâna +kto I L Kuot +ktp I L Kaduo +ktq I E Katabaga +ktr I L Kota Marudu Tinagas +kts I L South Muyu +ktt I L Ketum +ktu I L Kituba (Democratic Republic of Congo) +ktv I L Eastern Katu +ktw I E Kato +ktx I L Kaxararí +kty I L Kango (Bas-Uélé District) +ktz I L Ju/'hoan +kua kua kua kj I L Kuanyama +kub I L Kutep +kuc I L Kwinsu +kud I L 'Auhelawa +kue I L Kuman +kuf I L Western Katu +kug I L Kupa +kuh I L Kushi +kui I L Kuikúro-Kalapálo +kuj I L Kuria +kuk I L Kepo' +kul I L Kulere +kum kum kum I L Kumyk +kun I L Kunama +kuo I L Kumukio +kup I L Kunimaipa +kuq I L Karipuna +kur kur kur ku M L Kurdish +kus I L Kusaal +kut kut kut I L Kutenai +kuu I L Upper Kuskokwim +kuv I L Kur +kuw I L Kpagua +kux I L Kukatja +kuy I L Kuuku-Ya'u +kuz I E Kunza +kva I L Bagvalal +kvb I L Kubu +kvc I L Kove +kvd I L Kui (Indonesia) +kve I L Kalabakan +kvf I L Kabalai +kvg I L Kuni-Boazi +kvh I L Komodo +kvi I L Kwang +kvj I L Psikye +kvk I L Korean Sign Language +kvl I L Kayaw +kvm I L Kendem +kvn I L Border Kuna +kvo I L Dobel +kvp I L Kompane +kvq I L Geba Karen +kvr I L Kerinci +kvs I L Kunggara +kvt I L Lahta Karen +kvu I L Yinbaw Karen +kvv I L Kola +kvw I L Wersing +kvx I L Parkari Koli +kvy I L Yintale Karen +kvz I L Tsakwambo +kwa I L Dâw +kwb I L Kwa +kwc I L Likwala +kwd I L Kwaio +kwe I L Kwerba +kwf I L Kwara'ae +kwg I L Sara Kaba Deme +kwh I L Kowiai +kwi I L Awa-Cuaiquer +kwj I L Kwanga +kwk I L Kwakiutl +kwl I L Kofyar +kwm I L Kwambi +kwn I L Kwangali +kwo I L Kwomtari +kwp I L Kodia +kwq I L Kwak +kwr I L Kwer +kws I L Kwese +kwt I L Kwesten +kwu I L Kwakum +kwv I L Sara Kaba Náà +kww I L Kwinti +kwx I L Khirwar +kwy I L San Salvador Kongo +kwz I E Kwadi +kxa I L Kairiru +kxb I L Krobu +kxc I L Konso +kxd I L Brunei +kxe I L Kakihum +kxf I L Manumanaw Karen +kxh I L Karo (Ethiopia) +kxi I L Keningau Murut +kxj I L Kulfa +kxk I L Zayein Karen +kxl I L Nepali Kurux +kxm I L Northern Khmer +kxn I L Kanowit-Tanjong Melanau +kxo I E Kanoé +kxp I L Wadiyara Koli +kxq I L Smärky Kanum +kxr I L Koro (Papua New Guinea) +kxs I L Kangjia +kxt I L Koiwat +kxu I L Kui (India) +kxv I L Kuvi +kxw I L Konai +kxx I L Likuba +kxy I L Kayong +kxz I L Kerewo +kya I L Kwaya +kyb I L Butbut Kalinga +kyc I L Kyaka +kyd I L Karey +kye I L Krache +kyf I L Kouya +kyg I L Keyagana +kyh I L Karok +kyi I L Kiput +kyj I L Karao +kyk I L Kamayo +kyl I L Kalapuya +kym I L Kpatili +kyn I L Northern Binukidnon +kyo I L Kelon +kyp I L Kang +kyq I L Kenga +kyr I L Kuruáya +kys I L Baram Kayan +kyt I L Kayagar +kyu I L Western Kayah +kyv I L Kayort +kyw I L Kudmali +kyx I L Rapoisi +kyy I L Kambaira +kyz I L Kayabí +kza I L Western Karaboro +kzb I L Kaibobo +kzc I L Bondoukou Kulango +kzd I L Kadai +kze I L Kosena +kzf I L Da'a Kaili +kzg I L Kikai +kzi I L Kelabit +kzj I L Coastal Kadazan +kzk I E Kazukuru +kzl I L Kayeli +kzm I L Kais +kzn I L Kokola +kzo I L Kaningi +kzp I L Kaidipang +kzq I L Kaike +kzr I L Karang +kzs I L Sugut Dusun +kzt I L Tambunan Dusun +kzu I L Kayupulau +kzv I L Komyandaret +kzw I E Karirí-Xocó +kzx I L Kamarian +kzy I L Kango (Tshopo District) +kzz I L Kalabra +laa I L Southern Subanen +lab I A Linear A +lac I L Lacandon +lad lad lad I L Ladino +lae I L Pattani +laf I L Lafofa +lag I L Langi +lah lah lah M L Lahnda +lai I L Lambya +laj I L Lango (Uganda) +lak I L Laka (Nigeria) +lal I L Lalia +lam lam lam I L Lamba +lan I L Laru +lao lao lao lo I L Lao +lap I L Laka (Chad) +laq I L Qabiao +lar I L Larteh +las I L Lama (Togo) +lat lat lat la I A Latin +lau I L Laba +lav lav lav lv M L Latvian +law I L Lauje +lax I L Tiwa +lay I L Lama (Myanmar) +laz I E Aribwatsa +lba I E Lui +lbb I L Label +lbc I L Lakkia +lbe I L Lak +lbf I L Tinani +lbg I L Laopang +lbi I L La'bi +lbj I L Ladakhi +lbk I L Central Bontok +lbl I L Libon Bikol +lbm I L Lodhi +lbn I L Lamet +lbo I L Laven +lbq I L Wampar +lbr I L Lohorung +lbs I L Libyan Sign Language +lbt I L Lachi +lbu I L Labu +lbv I L Lavatbura-Lamusong +lbw I L Tolaki +lbx I L Lawangan +lby I E Lamu-Lamu +lbz I L Lardil +lcc I L Legenyem +lcd I L Lola +lce I L Loncong +lcf I L Lubu +lch I L Luchazi +lcl I L Lisela +lcm I L Tungag +lcp I L Western Lawa +lcq I L Luhu +lcs I L Lisabata-Nuniali +lda I L Kla-Dan +ldb I L Dũya +ldd I L Luri +ldg I L Lenyima +ldh I L Lamja-Dengsa-Tola +ldi I L Laari +ldj I L Lemoro +ldk I L Leelau +ldl I L Kaan +ldm I L Landoma +ldn I C Láadan +ldo I L Loo +ldp I L Tso +ldq I L Lufu +lea I L Lega-Shabunda +leb I L Lala-Bisa +lec I L Leco +led I L Lendu +lee I L Lyélé +lef I L Lelemi +leg I L Lengua +leh I L Lenje +lei I L Lemio +lej I L Lengola +lek I L Leipon +lel I L Lele (Democratic Republic of Congo) +lem I L Nomaande +len I E Lenca +leo I L Leti (Cameroon) +lep I L Lepcha +leq I L Lembena +ler I L Lenkau +les I L Lese +let I L Lesing-Gelimi +leu I L Kara (Papua New Guinea) +lev I L Lamma +lew I L Ledo Kaili +lex I L Luang +ley I L Lemolang +lez lez lez I L Lezghian +lfa I L Lefa +lfn I C Lingua Franca Nova +lga I L Lungga +lgb I L Laghu +lgg I L Lugbara +lgh I L Laghuu +lgi I L Lengilu +lgk I L Lingarak +lgl I L Wala +lgm I L Lega-Mwenga +lgn I L Opuuo +lgq I L Logba +lgr I L Lengo +lgt I L Pahi +lgu I L Longgu +lgz I L Ligenza +lha I L Laha (Viet Nam) +lhh I L Laha (Indonesia) +lhi I L Lahu Shi +lhl I L Lahul Lohar +lhm I L Lhomi +lhn I L Lahanan +lhp I L Lhokpu +lhs I E Mlahsö +lht I L Lo-Toga +lhu I L Lahu +lia I L West-Central Limba +lib I L Likum +lic I L Hlai +lid I L Nyindrou +lie I L Likila +lif I L Limbu +lig I L Ligbi +lih I L Lihir +lii I L Lingkhim +lij I L Ligurian +lik I L Lika +lil I L Lillooet +lim lim lim li I L Limburgan +lin lin lin ln I L Lingala +lio I L Liki +lip I L Sekpele +liq I L Libido +lir I L Liberian English +lis I L Lisu +lit lit lit lt I L Lithuanian +liu I L Logorik +liv I L Liv +liw I L Col +lix I L Liabuku +liy I L Banda-Bambari +liz I L Libinza +lja I E Golpa +lje I L Rampi +lji I L Laiyolo +ljl I L Li'o +ljp I L Lampung Api +ljw I L Yirandali +ljx I E Yuru +lka I L Lakalei +lkb I L Kabras +lkc I L Kucong +lkd I L Lakondê +lke I L Kenyi +lkh I L Lakha +lki I L Laki +lkj I L Remun +lkl I L Laeko-Libuat +lkm I E Kalaamaya +lkn I L Lakon +lko I L Khayo +lkr I L Päri +lks I L Kisa +lkt I L Lakota +lku I E Kungkari +lky I L Lokoya +lla I L Lala-Roba +llb I L Lolo +llc I L Lele (Guinea) +lld I L Ladin +lle I L Lele (Papua New Guinea) +llf I E Hermit +llg I L Lole +llh I L Lamu +lli I L Teke-Laali +llj I E Ladji Ladji +llk I E Lelak +lll I L Lilau +llm I L Lasalimu +lln I L Lele (Chad) +llo I L Khlor +llp I L North Efate +llq I L Lolak +lls I L Lithuanian Sign Language +llu I L Lau +llx I L Lauan +lma I L East Limba +lmb I L Merei +lmc I E Limilngan +lmd I L Lumun +lme I L Pévé +lmf I L South Lembata +lmg I L Lamogai +lmh I L Lambichhong +lmi I L Lombi +lmj I L West Lembata +lmk I L Lamkang +lml I L Hano +lmm I L Lamam +lmn I L Lambadi +lmo I L Lombard +lmp I L Limbum +lmq I L Lamatuka +lmr I L Lamalera +lmu I L Lamenu +lmv I L Lomaiviti +lmw I L Lake Miwok +lmx I L Laimbue +lmy I L Lamboya +lmz I E Lumbee +lna I L Langbashe +lnb I L Mbalanhu +lnd I L Lundayeh +lng I A Langobardic +lnh I L Lanoh +lni I L Daantanai' +lnj I E Leningitij +lnl I L South Central Banda +lnm I L Langam +lnn I L Lorediakarkar +lno I L Lango (Sudan) +lns I L Lamnso' +lnu I L Longuda +lnw I E Lanima +lnz I L Lonzo +loa I L Loloda +lob I L Lobi +loc I L Inonhan +loe I L Saluan +lof I L Logol +log I L Logo +loh I L Narim +loi I L Loma (Côte d'Ivoire) +loj I L Lou +lok I L Loko +lol lol lol I L Mongo +lom I L Loma (Liberia) +lon I L Malawi Lomwe +loo I L Lombo +lop I L Lopa +loq I L Lobala +lor I L Téén +los I L Loniu +lot I L Otuho +lou I L Louisiana Creole French +lov I L Lopi +low I L Tampias Lobu +lox I L Loun +loy I L Loke +loz loz loz I L Lozi +lpa I L Lelepa +lpe I L Lepki +lpn I L Long Phuri Naga +lpo I L Lipo +lpx I L Lopit +lra I L Rara Bakati' +lrc I L Northern Luri +lre I E Laurentian +lrg I E Laragia +lri I L Marachi +lrk I L Loarki +lrl I L Lari +lrm I L Marama +lrn I L Lorang +lro I L Laro +lrr I L Southern Yamphu +lrt I L Larantuka Malay +lrv I L Larevat +lrz I L Lemerig +lsa I L Lasgerdi +lsd I L Lishana Deni +lse I L Lusengo +lsg I L Lyons Sign Language +lsh I L Lish +lsi I L Lashi +lsl I L Latvian Sign Language +lsm I L Saamia +lso I L Laos Sign Language +lsp I L Panamanian Sign Language +lsr I L Aruop +lss I L Lasi +lst I L Trinidad and Tobago Sign Language +lsy I L Mauritian Sign Language +ltc I H Late Middle Chinese +ltg I L Latgalian +lti I L Leti (Indonesia) +ltn I L Latundê +lto I L Tsotso +lts I L Tachoni +ltu I L Latu +ltz ltz ltz lb I L Luxembourgish +lua lua lua I L Luba-Lulua +lub lub lub lu I L Luba-Katanga +luc I L Aringa +lud I L Ludian +lue I L Luvale +luf I L Laua +lug lug lug lg I L Ganda +lui lui lui I L Luiseno +luj I L Luna +luk I L Lunanakha +lul I L Olu'bo +lum I L Luimbi +lun lun lun I L Lunda +luo luo luo I L Luo (Kenya and Tanzania) +lup I L Lumbu +luq I L Lucumi +lur I L Laura +lus lus lus I L Lushai +lut I L Lushootseed +luu I L Lumba-Yakkha +luv I L Luwati +luw I L Luo (Cameroon) +luy M L Luyia +luz I L Southern Luri +lva I L Maku'a +lvk I L Lavukaleve +lvs I L Standard Latvian +lvu I L Levuka +lwa I L Lwalu +lwe I L Lewo Eleng +lwg I L Wanga +lwh I L White Lachi +lwl I L Eastern Lawa +lwm I L Laomian +lwo I L Luwo +lwt I L Lewotobi +lwu I L Lawu +lww I L Lewo +lya I L Layakha +lyg I L Lyngngam +lyn I L Luyana +lzh I H Literary Chinese +lzl I L Litzlitz +lzn I L Leinong Naga +lzz I L Laz +maa I L San Jerónimo Tecóatl Mazatec +mab I L Yutanduchi Mixtec +mad mad mad I L Madurese +mae I L Bo-Rukul +maf I L Mafa +mag mag mag I L Magahi +mah mah mah mh I L Marshallese +mai mai mai I L Maithili +maj I L Jalapa De Díaz Mazatec +mak mak mak I L Makasar +mal mal mal ml I L Malayalam +mam I L Mam +man man man M L Mandingo +maq I L Chiquihuitlán Mazatec +mar mar mar mr I L Marathi +mas mas mas I L Masai +mat I L San Francisco Matlatzinca +mau I L Huautla Mazatec +mav I L Sateré-Mawé +maw I L Mampruli +max I L North Moluccan Malay +maz I L Central Mazahua +mba I L Higaonon +mbb I L Western Bukidnon Manobo +mbc I L Macushi +mbd I L Dibabawon Manobo +mbe I E Molale +mbf I L Baba Malay +mbh I L Mangseng +mbi I L Ilianen Manobo +mbj I L Nadëb +mbk I L Malol +mbl I L Maxakalí +mbm I L Ombamba +mbn I L Macaguán +mbo I L Mbo (Cameroon) +mbp I L Malayo +mbq I L Maisin +mbr I L Nukak Makú +mbs I L Sarangani Manobo +mbt I L Matigsalug Manobo +mbu I L Mbula-Bwazza +mbv I L Mbulungish +mbw I L Maring +mbx I L Mari (East Sepik Province) +mby I L Memoni +mbz I L Amoltepec Mixtec +mca I L Maca +mcb I L Machiguenga +mcc I L Bitur +mcd I L Sharanahua +mce I L Itundujia Mixtec +mcf I L Matsés +mcg I L Mapoyo +mch I L Maquiritari +mci I L Mese +mcj I L Mvanip +mck I L Mbunda +mcl I E Macaguaje +mcm I L Malaccan Creole Portuguese +mcn I L Masana +mco I L Coatlán Mixe +mcp I L Makaa +mcq I L Ese +mcr I L Menya +mcs I L Mambai +mct I L Mengisa +mcu I L Cameroon Mambila +mcv I L Minanibai +mcw I L Mawa (Chad) +mcx I L Mpiemo +mcy I L South Watut +mcz I L Mawan +mda I L Mada (Nigeria) +mdb I L Morigi +mdc I L Male (Papua New Guinea) +mdd I L Mbum +mde I L Maba (Chad) +mdf mdf mdf I L Moksha +mdg I L Massalat +mdh I L Maguindanaon +mdi I L Mamvu +mdj I L Mangbetu +mdk I L Mangbutu +mdl I L Maltese Sign Language +mdm I L Mayogo +mdn I L Mbati +mdp I L Mbala +mdq I L Mbole +mdr mdr mdr I L Mandar +mds I L Maria (Papua New Guinea) +mdt I L Mbere +mdu I L Mboko +mdv I L Santa Lucía Monteverde Mixtec +mdw I L Mbosi +mdx I L Dizin +mdy I L Male (Ethiopia) +mdz I L Suruí Do Pará +mea I L Menka +meb I L Ikobi +mec I L Mara +med I L Melpa +mee I L Mengen +mef I L Megam +meh I L Southwestern Tlaxiaco Mixtec +mei I L Midob +mej I L Meyah +mek I L Mekeo +mel I L Central Melanau +mem I E Mangala +men men men I L Mende (Sierra Leone) +meo I L Kedah Malay +mep I L Miriwung +meq I L Merey +mer I L Meru +mes I L Masmaje +met I L Mato +meu I L Motu +mev I L Mano +mew I L Maaka +mey I L Hassaniyya +mez I L Menominee +mfa I L Pattani Malay +mfb I L Bangka +mfc I L Mba +mfd I L Mendankwe-Nkwen +mfe I L Morisyen +mff I L Naki +mfg I L Mogofin +mfh I L Matal +mfi I L Wandala +mfj I L Mefele +mfk I L North Mofu +mfl I L Putai +mfm I L Marghi South +mfn I L Cross River Mbembe +mfo I L Mbe +mfp I L Makassar Malay +mfq I L Moba +mfr I L Marithiel +mfs I L Mexican Sign Language +mft I L Mokerang +mfu I L Mbwela +mfv I L Mandjak +mfw I E Mulaha +mfx I L Melo +mfy I L Mayo +mfz I L Mabaan +mga mga mga I H Middle Irish (900-1200) +mgb I L Mararit +mgc I L Morokodo +mgd I L Moru +mge I L Mango +mgf I L Maklew +mgg I L Mpumpong +mgh I L Makhuwa-Meetto +mgi I L Lijili +mgj I L Abureni +mgk I L Mawes +mgl I L Maleu-Kilenge +mgm I L Mambae +mgn I L Mbangi +mgo I L Meta' +mgp I L Eastern Magar +mgq I L Malila +mgr I L Mambwe-Lungu +mgs I L Manda (Tanzania) +mgt I L Mongol +mgu I L Mailu +mgv I L Matengo +mgw I L Matumbi +mgy I L Mbunga +mgz I L Mbugwe +mha I L Manda (India) +mhb I L Mahongwe +mhc I L Mocho +mhd I L Mbugu +mhe I L Besisi +mhf I L Mamaa +mhg I L Margu +mhh I L Maskoy Pidgin +mhi I L Ma'di +mhj I L Mogholi +mhk I L Mungaka +mhl I L Mauwake +mhm I L Makhuwa-Moniga +mhn I L Mócheno +mho I L Mashi (Zambia) +mhp I L Balinese Malay +mhq I L Mandan +mhr I L Eastern Mari +mhs I L Buru (Indonesia) +mht I L Mandahuaca +mhu I L Digaro-Mishmi +mhw I L Mbukushu +mhx I L Maru +mhy I L Ma'anyan +mhz I L Mor (Mor Islands) +mia I L Miami +mib I L Atatláhuca Mixtec +mic mic mic I L Mi'kmaq +mid I L Mandaic +mie I L Ocotepec Mixtec +mif I L Mofu-Gudur +mig I L San Miguel El Grande Mixtec +mih I L Chayuco Mixtec +mii I L Chigmecatitlán Mixtec +mij I L Abar +mik I L Mikasuki +mil I L Peñoles Mixtec +mim I L Alacatlatzala Mixtec +min min min I L Minangkabau +mio I L Pinotepa Nacional Mixtec +mip I L Apasco-Apoala Mixtec +miq I L Mískito +mir I L Isthmus Mixe +mis mis mis S S Uncoded languages +mit I L Southern Puebla Mixtec +miu I L Cacaloxtepec Mixtec +miw I L Akoye +mix I L Mixtepec Mixtec +miy I L Ayutla Mixtec +miz I L Coatzospan Mixtec +mjc I L San Juan Colorado Mixtec +mjd I L Northwest Maidu +mje I E Muskum +mjg I L Tu +mjh I L Mwera (Nyasa) +mji I L Kim Mun +mjj I L Mawak +mjk I L Matukar +mjl I L Mandeali +mjm I L Medebur +mjn I L Ma (Papua New Guinea) +mjo I L Malankuravan +mjp I L Malapandaram +mjq I E Malaryan +mjr I L Malavedan +mjs I L Miship +mjt I L Sauria Paharia +mju I L Manna-Dora +mjv I L Mannan +mjw I L Karbi +mjx I L Mahali +mjy I E Mahican +mjz I L Majhi +mka I L Mbre +mkb I L Mal Paharia +mkc I L Siliput +mkd mac mkd mk I L Macedonian +mke I L Mawchi +mkf I L Miya +mkg I L Mak (China) +mki I L Dhatki +mkj I L Mokilese +mkk I L Byep +mkl I L Mokole +mkm I L Moklen +mkn I L Kupang Malay +mko I L Mingang Doso +mkp I L Moikodi +mkq I E Bay Miwok +mkr I L Malas +mks I L Silacayoapan Mixtec +mkt I L Vamale +mku I L Konyanka Maninka +mkv I L Mafea +mkw I L Kituba (Congo) +mkx I L Kinamiging Manobo +mky I L East Makian +mkz I L Makasae +mla I L Malo +mlb I L Mbule +mlc I L Cao Lan +mle I L Manambu +mlf I L Mal +mlg mlg mlg mg M L Malagasy +mlh I L Mape +mli I L Malimpung +mlj I L Miltu +mlk I L Ilwana +mll I L Malua Bay +mlm I L Mulam +mln I L Malango +mlo I L Mlomp +mlp I L Bargam +mlq I L Western Maninkakan +mlr I L Vame +mls I L Masalit +mlt mlt mlt mt I L Maltese +mlu I L To'abaita +mlv I L Motlav +mlw I L Moloko +mlx I L Malfaxal +mlz I L Malaynon +mma I L Mama +mmb I L Momina +mmc I L Michoacán Mazahua +mmd I L Maonan +mme I L Mae +mmf I L Mundat +mmg I L North Ambrym +mmh I L Mehináku +mmi I L Musar +mmj I L Majhwar +mmk I L Mukha-Dora +mml I L Man Met +mmm I L Maii +mmn I L Mamanwa +mmo I L Mangga Buang +mmp I L Siawi +mmq I L Musak +mmr I L Western Xiangxi Miao +mmt I L Malalamai +mmu I L Mmaala +mmv I E Miriti +mmw I L Emae +mmx I L Madak +mmy I L Migaama +mmz I L Mabaale +mna I L Mbula +mnb I L Muna +mnc mnc mnc I L Manchu +mnd I L Mondé +mne I L Naba +mnf I L Mundani +mng I L Eastern Mnong +mnh I L Mono (Democratic Republic of Congo) +mni mni mni I L Manipuri +mnj I L Munji +mnk I L Mandinka +mnl I L Tiale +mnm I L Mapena +mnn I L Southern Mnong +mnp I L Min Bei Chinese +mnq I L Minriq +mnr I L Mono (USA) +mns I L Mansi +mnu I L Mer +mnv I L Rennell-Bellona +mnw I L Mon +mnx I L Manikion +mny I L Manyawa +mnz I L Moni +moa I L Mwan +moc I L Mocoví +mod I E Mobilian +moe I L Montagnais +mog I L Mongondow +moh moh moh I L Mohawk +moi I L Mboi +moj I L Monzombo +mok I L Morori +mom I E Mangue +mon mon mon mn M L Mongolian +moo I L Monom +mop I L Mopán Maya +moq I L Mor (Bomberai Peninsula) +mor I L Moro +mos mos mos I L Mossi +mot I L Barí +mou I L Mogum +mov I L Mohave +mow I L Moi (Congo) +mox I L Molima +moy I L Shekkacho +moz I L Mukulu +mpa I L Mpoto +mpb I L Mullukmulluk +mpc I L Mangarayi +mpd I L Machinere +mpe I L Majang +mpg I L Marba +mph I L Maung +mpi I L Mpade +mpj I L Martu Wangka +mpk I L Mbara (Chad) +mpl I L Middle Watut +mpm I L Yosondúa Mixtec +mpn I L Mindiri +mpo I L Miu +mpp I L Migabac +mpq I L Matís +mpr I L Vangunu +mps I L Dadibi +mpt I L Mian +mpu I L Makuráp +mpv I L Mungkip +mpw I L Mapidian +mpx I L Misima-Panaeati +mpy I L Mapia +mpz I L Mpi +mqa I L Maba (Indonesia) +mqb I L Mbuko +mqc I L Mangole +mqe I L Matepi +mqf I L Momuna +mqg I L Kota Bangun Kutai Malay +mqh I L Tlazoyaltepec Mixtec +mqi I L Mariri +mqj I L Mamasa +mqk I L Rajah Kabunsuwan Manobo +mql I L Mbelime +mqm I L South Marquesan +mqn I L Moronene +mqo I L Modole +mqp I L Manipa +mqq I L Minokok +mqr I L Mander +mqs I L West Makian +mqt I L Mok +mqu I L Mandari +mqv I L Mosimo +mqw I L Murupi +mqx I L Mamuju +mqy I L Manggarai +mqz I L Pano +mra I L Mlabri +mrb I L Marino +mrc I L Maricopa +mrd I L Western Magar +mre I E Martha's Vineyard Sign Language +mrf I L Elseng +mrg I L Mising +mrh I L Mara Chin +mri mao mri mi I L Maori +mrj I L Western Mari +mrk I L Hmwaveke +mrl I L Mortlockese +mrm I L Merlav +mrn I L Cheke Holo +mro I L Mru +mrp I L Morouas +mrq I L North Marquesan +mrr I L Maria (India) +mrs I L Maragus +mrt I L Marghi Central +mru I L Mono (Cameroon) +mrv I L Mangareva +mrw I L Maranao +mrx I L Maremgi +mry I L Mandaya +mrz I L Marind +msa may msa ms M L Malay (macrolanguage) +msb I L Masbatenyo +msc I L Sankaran Maninka +msd I L Yucatec Maya Sign Language +mse I L Musey +msf I L Mekwei +msg I L Moraid +msh I L Masikoro Malagasy +msi I L Sabah Malay +msj I L Ma (Democratic Republic of Congo) +msk I L Mansaka +msl I L Molof +msm I L Agusan Manobo +msn I L Vurës +mso I L Mombum +msp I E Maritsauá +msq I L Caac +msr I L Mongolian Sign Language +mss I L West Masela +msu I L Musom +msv I L Maslam +msw I L Mansoanka +msx I L Moresada +msy I L Aruamu +msz I L Momare +mta I L Cotabato Manobo +mtb I L Anyin Morofo +mtc I L Munit +mtd I L Mualang +mte I L Mono (Solomon Islands) +mtf I L Murik (Papua New Guinea) +mtg I L Una +mth I L Munggui +mti I L Maiwa (Papua New Guinea) +mtj I L Moskona +mtk I L Mbe' +mtl I L Montol +mtm I E Mator +mtn I E Matagalpa +mto I L Totontepec Mixe +mtp I L Wichí Lhamtés Nocten +mtq I L Muong +mtr I L Mewari +mts I L Yora +mtt I L Mota +mtu I L Tututepec Mixtec +mtv I L Asaro'o +mtw I L Southern Binukidnon +mtx I L Tidaá Mixtec +mty I L Nabi +mua I L Mundang +mub I L Mubi +muc I L Ajumbu +mud I L Mednyj Aleut +mue I L Media Lengua +mug I L Musgu +muh I L Mündü +mui I L Musi +muj I L Mabire +muk I L Mugom +mul mul mul S S Multiple languages +mum I L Maiwala +muo I L Nyong +mup I L Malvi +muq I L Eastern Xiangxi Miao +mur I L Murle +mus mus mus I L Creek +mut I L Western Muria +muu I L Yaaku +muv I L Muthuvan +mux I L Bo-Ung +muy I L Muyang +muz I L Mursi +mva I L Manam +mvb I E Mattole +mvd I L Mamboru +mve I L Marwari (Pakistan) +mvf I L Peripheral Mongolian +mvg I L Yucuañe Mixtec +mvh I L Mulgi +mvi I L Miyako +mvk I L Mekmek +mvl I E Mbara (Australia) +mvm I L Muya +mvn I L Minaveha +mvo I L Marovo +mvp I L Duri +mvq I L Moere +mvr I L Marau +mvs I L Massep +mvt I L Mpotovoro +mvu I L Marfa +mvv I L Tagal Murut +mvw I L Machinga +mvx I L Meoswar +mvy I L Indus Kohistani +mvz I L Mesqan +mwa I L Mwatebu +mwb I L Juwal +mwc I L Are +mwe I L Mwera (Chimwera) +mwf I L Murrinh-Patha +mwg I L Aiklep +mwh I L Mouk-Aria +mwi I L Labo +mwj I L Maligo +mwk I L Kita Maninkakan +mwl mwl mwl I L Mirandese +mwm I L Sar +mwn I L Nyamwanga +mwo I L Central Maewo +mwp I L Kala Lagaw Ya +mwq I L Mün Chin +mwr mwr mwr M L Marwari +mws I L Mwimbi-Muthambi +mwt I L Moken +mwu I E Mittu +mwv I L Mentawai +mww I L Hmong Daw +mwx I L Mediak +mwy I L Mosiro +mwz I L Moingi +mxa I L Northwest Oaxaca Mixtec +mxb I L Tezoatlán Mixtec +mxc I L Manyika +mxd I L Modang +mxe I L Mele-Fila +mxf I L Malgbe +mxg I L Mbangala +mxh I L Mvuba +mxi I E Mozarabic +mxj I L Miju-Mishmi +mxk I L Monumbo +mxl I L Maxi Gbe +mxm I L Meramera +mxn I L Moi (Indonesia) +mxo I L Mbowe +mxp I L Tlahuitoltepec Mixe +mxq I L Juquila Mixe +mxr I L Murik (Malaysia) +mxs I L Huitepec Mixtec +mxt I L Jamiltepec Mixtec +mxu I L Mada (Cameroon) +mxv I L Metlatónoc Mixtec +mxw I L Namo +mxx I L Mahou +mxy I L Southeastern Nochixtlán Mixtec +mxz I L Central Masela +mya bur mya my I L Burmese +myb I L Mbay +myc I L Mayeka +myd I L Maramba +mye I L Myene +myf I L Bambassi +myg I L Manta +myh I L Makah +myi I L Mina (India) +myj I L Mangayat +myk I L Mamara Senoufo +myl I L Moma +mym I L Me'en +myo I L Anfillo +myp I L Pirahã +myr I L Muniche +mys I E Mesmes +myu I L Mundurukú +myv myv myv I L Erzya +myw I L Muyuw +myx I L Masaaba +myy I L Macuna +myz I H Classical Mandaic +mza I L Santa María Zacatepec Mixtec +mzb I L Tumzabt +mzc I L Madagascar Sign Language +mzd I L Malimba +mze I L Morawa +mzg I L Monastic Sign Language +mzh I L Wichí Lhamtés Güisnay +mzi I L Ixcatlán Mazatec +mzj I L Manya +mzk I L Nigeria Mambila +mzl I L Mazatlán Mixe +mzm I L Mumuye +mzn I L Mazanderani +mzo I E Matipuhy +mzp I L Movima +mzq I L Mori Atas +mzr I L Marúbo +mzs I L Macanese +mzt I L Mintil +mzu I L Inapang +mzv I L Manza +mzw I L Deg +mzx I L Mawayana +mzy I L Mozambican Sign Language +mzz I L Maiadomu +naa I L Namla +nab I L Southern Nambikuára +nac I L Narak +nad I L Nijadali +nae I L Naka'ela +naf I L Nabak +nag I L Naga Pidgin +naj I L Nalu +nak I L Nakanai +nal I L Nalik +nam I L Ngan'gityemerri +nan I L Min Nan Chinese +nao I L Naaba +nap nap nap I L Neapolitan +naq I L Nama (Namibia) +nar I L Iguta +nas I L Naasioi +nat I L Hungworo +nau nau nau na I L Nauru +nav nav nav nv I L Navajo +naw I L Nawuri +nax I L Nakwi +nay I E Narrinyeri +naz I L Coatepec Nahuatl +nba I L Nyemba +nbb I L Ndoe +nbc I L Chang Naga +nbd I L Ngbinda +nbe I L Konyak Naga +nbg I L Nagarchal +nbh I L Ngamo +nbi I L Mao Naga +nbj I L Ngarinman +nbk I L Nake +nbl nbl nbl nr I L South Ndebele +nbm I L Ngbaka Ma'bo +nbn I L Kuri +nbo I L Nkukoli +nbp I L Nnam +nbq I L Nggem +nbr I L Numana-Nunku-Gbantu-Numbu +nbs I L Namibian Sign Language +nbt I L Na +nbu I L Rongmei Naga +nbv I L Ngamambo +nbw I L Southern Ngbandi +nby I L Ningera +nca I L Iyo +ncb I L Central Nicobarese +ncc I L Ponam +ncd I L Nachering +nce I L Yale +ncf I L Notsi +ncg I L Nisga'a +nch I L Central Huasteca Nahuatl +nci I H Classical Nahuatl +ncj I L Northern Puebla Nahuatl +nck I L Nakara +ncl I L Michoacán Nahuatl +ncm I L Nambo +ncn I L Nauna +nco I L Sibe +ncp I L Ndaktup +ncr I L Ncane +ncs I L Nicaraguan Sign Language +nct I L Chothe Naga +ncu I L Chumburung +ncx I L Central Puebla Nahuatl +ncz I E Natchez +nda I L Ndasa +ndb I L Kenswei Nsei +ndc I L Ndau +ndd I L Nde-Nsele-Nta +nde nde nde nd I L North Ndebele +ndf I E Nadruvian +ndg I L Ndengereko +ndh I L Ndali +ndi I L Samba Leko +ndj I L Ndamba +ndk I L Ndaka +ndl I L Ndolo +ndm I L Ndam +ndn I L Ngundi +ndo ndo ndo ng I L Ndonga +ndp I L Ndo +ndq I L Ndombe +ndr I L Ndoola +nds nds nds I L Low German +ndt I L Ndunga +ndu I L Dugun +ndv I L Ndut +ndw I L Ndobo +ndx I L Nduga +ndy I L Lutos +ndz I L Ndogo +nea I L Eastern Ngad'a +neb I L Toura (Côte d'Ivoire) +nec I L Nedebang +ned I L Nde-Gbite +nee I L Nêlêmwa-Nixumwak +nef I L Nefamese +neg I L Negidal +neh I L Nyenkha +nei I A Neo-Hittite +nej I L Neko +nek I L Neku +nem I L Nemi +nen I L Nengone +neo I L Ná-Meo +nep nep nep ne M L Nepali (macrolanguage) +neq I L North Central Mixe +ner I L Yahadian +nes I L Bhoti Kinnauri +net I L Nete +neu I C Neo +nev I L Nyaheun +new new new I L Newari +nex I L Neme +ney I L Neyo +nez I L Nez Perce +nfa I L Dhao +nfd I L Ahwai +nfl I L Ayiwo +nfr I L Nafaanra +nfu I L Mfumte +nga I L Ngbaka +ngb I L Northern Ngbandi +ngc I L Ngombe (Democratic Republic of Congo) +ngd I L Ngando (Central African Republic) +nge I L Ngemba +ngg I L Ngbaka Manza +ngh I L N/u +ngi I L Ngizim +ngj I L Ngie +ngk I L Dalabon +ngl I L Lomwe +ngm I L Ngatik Men's Creole +ngn I L Ngwo +ngo I L Ngoni +ngp I L Ngulu +ngq I L Ngurimi +ngr I L Engdewu +ngs I L Gvoko +ngt I L Ngeq +ngu I L Guerrero Nahuatl +ngv I E Nagumi +ngw I L Ngwaba +ngx I L Nggwahyi +ngy I L Tibea +ngz I L Ngungwel +nha I L Nhanda +nhb I L Beng +nhc I E Tabasco Nahuatl +nhd I L Chiripá +nhe I L Eastern Huasteca Nahuatl +nhf I L Nhuwala +nhg I L Tetelcingo Nahuatl +nhh I L Nahari +nhi I L Zacatlán-Ahuacatlán-Tepetzintla Nahuatl +nhk I L Isthmus-Cosoleacaque Nahuatl +nhm I L Morelos Nahuatl +nhn I L Central Nahuatl +nho I L Takuu +nhp I L Isthmus-Pajapan Nahuatl +nhq I L Huaxcaleca Nahuatl +nhr I L Naro +nht I L Ometepec Nahuatl +nhu I L Noone +nhv I L Temascaltepec Nahuatl +nhw I L Western Huasteca Nahuatl +nhx I L Isthmus-Mecayapan Nahuatl +nhy I L Northern Oaxaca Nahuatl +nhz I L Santa María La Alta Nahuatl +nia nia nia I L Nias +nib I L Nakame +nid I E Ngandi +nie I L Niellim +nif I L Nek +nig I E Ngalakan +nih I L Nyiha (Tanzania) +nii I L Nii +nij I L Ngaju +nik I L Southern Nicobarese +nil I L Nila +nim I L Nilamba +nin I L Ninzo +nio I L Nganasan +niq I L Nandi +nir I L Nimboran +nis I L Nimi +nit I L Southeastern Kolami +niu niu niu I L Niuean +niv I L Gilyak +niw I L Nimo +nix I L Hema +niy I L Ngiti +niz I L Ningil +nja I L Nzanyi +njb I L Nocte Naga +njd I L Ndonde Hamba +njh I L Lotha Naga +nji I L Gudanji +njj I L Njen +njl I L Njalgulgule +njm I L Angami Naga +njn I L Liangmai Naga +njo I L Ao Naga +njr I L Njerep +njs I L Nisa +njt I L Ndyuka-Trio Pidgin +nju I L Ngadjunmaya +njx I L Kunyi +njy I L Njyem +njz I L Nyishi +nka I L Nkoya +nkb I L Khoibu Naga +nkc I L Nkongho +nkd I L Koireng +nke I L Duke +nkf I L Inpui Naga +nkg I L Nekgini +nkh I L Khezha Naga +nki I L Thangal Naga +nkj I L Nakai +nkk I L Nokuku +nkm I L Namat +nkn I L Nkangala +nko I L Nkonya +nkp I E Niuatoputapu +nkq I L Nkami +nkr I L Nukuoro +nks I L North Asmat +nkt I L Nyika (Tanzania) +nku I L Bouna Kulango +nkv I L Nyika (Malawi and Zambia) +nkw I L Nkutu +nkx I L Nkoroo +nkz I L Nkari +nla I L Ngombale +nlc I L Nalca +nld dut nld nl I L Dutch +nle I L East Nyala +nlg I L Gela +nli I L Grangali +nlj I L Nyali +nlk I L Ninia Yali +nll I L Nihali +nlo I L Ngul +nlq I L Lao Naga +nlu I L Nchumbulu +nlv I L Orizaba Nahuatl +nlw I E Walangama +nlx I L Nahali +nly I L Nyamal +nlz I L Nalögo +nma I L Maram Naga +nmb I L Big Nambas +nmc I L Ngam +nmd I L Ndumu +nme I L Mzieme Naga +nmf I L Tangkhul Naga (India) +nmg I L Kwasio +nmh I L Monsang Naga +nmi I L Nyam +nmj I L Ngombe (Central African Republic) +nmk I L Namakura +nml I L Ndemli +nmm I L Manangba +nmn I L !Xóõ +nmo I L Moyon Naga +nmp I E Nimanbur +nmq I L Nambya +nmr I E Nimbari +nms I L Letemboi +nmt I L Namonuito +nmu I L Northeast Maidu +nmv I E Ngamini +nmw I L Nimoa +nmx I L Nama (Papua New Guinea) +nmy I L Namuyi +nmz I L Nawdm +nna I L Nyangumarta +nnb I L Nande +nnc I L Nancere +nnd I L West Ambae +nne I L Ngandyera +nnf I L Ngaing +nng I L Maring Naga +nnh I L Ngiemboon +nni I L North Nuaulu +nnj I L Nyangatom +nnk I L Nankina +nnl I L Northern Rengma Naga +nnm I L Namia +nnn I L Ngete +nno nno nno nn I L Norwegian Nynorsk +nnp I L Wancho Naga +nnq I L Ngindo +nnr I E Narungga +nns I L Ningye +nnt I E Nanticoke +nnu I L Dwang +nnv I E Nugunu (Australia) +nnw I L Southern Nuni +nnx I L Ngong +nny I E Nyangga +nnz I L Nda'nda' +noa I L Woun Meu +nob nob nob nb I L Norwegian Bokmål +noc I L Nuk +nod I L Northern Thai +noe I L Nimadi +nof I L Nomane +nog nog nog I L Nogai +noh I L Nomu +noi I L Noiri +noj I L Nonuya +nok I E Nooksack +nol I E Nomlaki +nom I E Nocamán +non non non I H Old Norse +nop I L Numanggang +noq I L Ngongo +nor nor nor no M L Norwegian +nos I L Eastern Nisu +not I L Nomatsiguenga +nou I L Ewage-Notu +nov I C Novial +now I L Nyambo +noy I L Noy +noz I L Nayi +npa I L Nar Phu +npb I L Nupbikha +npg I L Ponyo-Gongwang Naga +nph I L Phom Naga +npi I L Nepali (individual language) +npl I L Southeastern Puebla Nahuatl +npn I L Mondropolon +npo I L Pochuri Naga +nps I L Nipsan +npu I L Puimei Naga +npy I L Napu +nqg I L Southern Nago +nqk I L Kura Ede Nago +nqm I L Ndom +nqn I L Nen +nqo nqo nqo I L N'Ko +nqq I L Kyan-Karyaw Naga +nqy I L Akyaung Ari Naga +nra I L Ngom +nrb I L Nara +nrc I A Noric +nre I L Southern Rengma Naga +nrg I L Narango +nri I L Chokri Naga +nrk I L Ngarla +nrl I L Ngarluma +nrm I L Narom +nrn I E Norn +nrp I A North Picene +nrr I E Norra +nrt I E Northern Kalapuya +nru I L Narua +nrx I E Ngurmbur +nrz I L Lala +nsa I L Sangtam Naga +nsc I L Nshi +nsd I L Southern Nisu +nse I L Nsenga +nsf I L Northwestern Nisu +nsg I L Ngasa +nsh I L Ngoshie +nsi I L Nigerian Sign Language +nsk I L Naskapi +nsl I L Norwegian Sign Language +nsm I L Sumi Naga +nsn I L Nehan +nso nso nso I L Pedi +nsp I L Nepalese Sign Language +nsq I L Northern Sierra Miwok +nsr I L Maritime Sign Language +nss I L Nali +nst I L Tase Naga +nsu I L Sierra Negra Nahuatl +nsv I L Southwestern Nisu +nsw I L Navut +nsx I L Nsongo +nsy I L Nasal +nsz I L Nisenan +nte I L Nathembo +ntg I E Ngantangarra +nti I L Natioro +ntj I L Ngaanyatjarra +ntk I L Ikoma-Nata-Isenye +ntm I L Nateni +nto I L Ntomba +ntp I L Northern Tepehuan +ntr I L Delo +nts I E Natagaimas +ntu I L Natügu +ntw I E Nottoway +ntx I L Tangkhul Naga (Myanmar) +nty I L Mantsi +ntz I L Natanzi +nua I L Yuanga +nuc I E Nukuini +nud I L Ngala +nue I L Ngundu +nuf I L Nusu +nug I E Nungali +nuh I L Ndunda +nui I L Ngumbi +nuj I L Nyole +nuk I L Nuu-chah-nulth +nul I L Nusa Laut +num I L Niuafo'ou +nun I L Anong +nuo I L Nguôn +nup I L Nupe-Nupe-Tako +nuq I L Nukumanu +nur I L Nukuria +nus I L Nuer +nut I L Nung (Viet Nam) +nuu I L Ngbundu +nuv I L Northern Nuni +nuw I L Nguluwan +nux I L Mehek +nuy I L Nunggubuyu +nuz I L Tlamacazapa Nahuatl +nvh I L Nasarian +nvm I L Namiae +nvo I L Nyokon +nwa I E Nawathinehena +nwb I L Nyabwa +nwc nwc nwc I H Classical Newari +nwe I L Ngwe +nwg I E Ngayawung +nwi I L Southwest Tanna +nwm I L Nyamusa-Molo +nwo I E Nauo +nwr I L Nawaru +nwx I H Middle Newar +nwy I E Nottoway-Meherrin +nxa I L Nauete +nxd I L Ngando (Democratic Republic of Congo) +nxe I L Nage +nxg I L Ngad'a +nxi I L Nindi +nxk I L Koki Naga +nxl I L South Nuaulu +nxm I A Numidian +nxn I E Ngawun +nxq I L Naxi +nxr I L Ninggerum +nxu I E Narau +nxx I L Nafri +nya nya nya ny I L Nyanja +nyb I L Nyangbo +nyc I L Nyanga-li +nyd I L Nyore +nye I L Nyengo +nyf I L Giryama +nyg I L Nyindu +nyh I L Nyigina +nyi I L Ama (Sudan) +nyj I L Nyanga +nyk I L Nyaneka +nyl I L Nyeu +nym nym nym I L Nyamwezi +nyn nyn nyn I L Nyankole +nyo nyo nyo I L Nyoro +nyp I E Nyang'i +nyq I L Nayini +nyr I L Nyiha (Malawi) +nys I L Nyunga +nyt I E Nyawaygi +nyu I L Nyungwe +nyv I E Nyulnyul +nyw I L Nyaw +nyx I E Nganyaywana +nyy I L Nyakyusa-Ngonde +nza I L Tigon Mbembe +nzb I L Njebi +nzi nzi nzi I L Nzima +nzk I L Nzakara +nzm I L Zeme Naga +nzs I L New Zealand Sign Language +nzu I L Teke-Nzikou +nzy I L Nzakambay +nzz I L Nanga Dama Dogon +oaa I L Orok +oac I L Oroch +oar I A Old Aramaic (up to 700 BCE) +oav I H Old Avar +obi I E Obispeño +obk I L Southern Bontok +obl I L Oblo +obm I A Moabite +obo I L Obo Manobo +obr I H Old Burmese +obt I H Old Breton +obu I L Obulom +oca I L Ocaina +och I A Old Chinese +oci oci oci oc I L Occitan (post 1500) +oco I H Old Cornish +ocu I L Atzingo Matlatzinca +oda I L Odut +odk I L Od +odt I H Old Dutch +odu I L Odual +ofo I E Ofo +ofs I H Old Frisian +ofu I L Efutop +ogb I L Ogbia +ogc I L Ogbah +oge I H Old Georgian +ogg I L Ogbogolo +ogo I L Khana +ogu I L Ogbronuagum +oht I A Old Hittite +ohu I H Old Hungarian +oia I L Oirata +oin I L Inebu One +ojb I L Northwestern Ojibwa +ojc I L Central Ojibwa +ojg I L Eastern Ojibwa +oji oji oji oj M L Ojibwa +ojp I H Old Japanese +ojs I L Severn Ojibwa +ojv I L Ontong Java +ojw I L Western Ojibwa +oka I L Okanagan +okb I L Okobo +okd I L Okodia +oke I L Okpe (Southwestern Edo) +okg I E Koko Babangk +okh I L Koresh-e Rostam +oki I L Okiek +okj I E Oko-Juwoi +okk I L Kwamtim One +okl I E Old Kentish Sign Language +okm I H Middle Korean (10th-16th cent.) +okn I L Oki-No-Erabu +oko I H Old Korean (3rd-9th cent.) +okr I L Kirike +oks I L Oko-Eni-Osayen +oku I L Oku +okv I L Orokaiva +okx I L Okpe (Northwestern Edo) +ola I L Walungge +old I L Mochi +ole I L Olekha +olk I E Olkol +olm I L Oloma +olo I L Livvi +olr I L Olrat +oma I L Omaha-Ponca +omb I L East Ambae +omc I E Mochica +ome I E Omejes +omg I L Omagua +omi I L Omi +omk I E Omok +oml I L Ombo +omn I A Minoan +omo I L Utarmbung +omp I H Old Manipuri +omr I H Old Marathi +omt I L Omotik +omu I E Omurano +omw I L South Tairora +omx I H Old Mon +ona I L Ona +onb I L Lingao +one I L Oneida +ong I L Olo +oni I L Onin +onj I L Onjob +onk I L Kabore One +onn I L Onobasulu +ono I L Onondaga +onp I L Sartang +onr I L Northern One +ons I L Ono +ont I L Ontenu +onu I L Unua +onw I H Old Nubian +onx I L Onin Based Pidgin +ood I L Tohono O'odham +oog I L Ong +oon I L Önge +oor I L Oorlams +oos I A Old Ossetic +opa I L Okpamheri +opk I L Kopkaka +opm I L Oksapmin +opo I L Opao +opt I E Opata +opy I L Ofayé +ora I L Oroha +orc I L Orma +ore I L Orejón +org I L Oring +orh I L Oroqen +ori ori ori or M L Oriya (macrolanguage) +orm orm orm om M L Oromo +orn I L Orang Kanaq +oro I L Orokolo +orr I L Oruma +ors I L Orang Seletar +ort I L Adivasi Oriya +oru I L Ormuri +orv I H Old Russian +orw I L Oro Win +orx I L Oro +ory I L Oriya (individual language) +orz I L Ormu +osa osa osa I L Osage +osc I A Oscan +osi I L Osing +oso I L Ososo +osp I H Old Spanish +oss oss oss os I L Ossetian +ost I L Osatu +osu I L Southern One +osx I H Old Saxon +ota ota ota I H Ottoman Turkish (1500-1928) +otb I H Old Tibetan +otd I L Ot Danum +ote I L Mezquital Otomi +oti I E Oti +otk I H Old Turkish +otl I L Tilapa Otomi +otm I L Eastern Highland Otomi +otn I L Tenango Otomi +otq I L Querétaro Otomi +otr I L Otoro +ots I L Estado de México Otomi +ott I L Temoaya Otomi +otu I E Otuke +otw I L Ottawa +otx I L Texcatepec Otomi +oty I A Old Tamil +otz I L Ixtenco Otomi +oua I L Tagargrent +oub I L Glio-Oubi +oue I L Oune +oui I H Old Uighur +oum I E Ouma +oun I L !O!ung +owi I L Owiniga +owl I H Old Welsh +oyb I L Oy +oyd I L Oyda +oym I L Wayampi +oyy I L Oya'oya +ozm I L Koonzime +pab I L Parecís +pac I L Pacoh +pad I L Paumarí +pae I L Pagibete +paf I E Paranawát +pag pag pag I L Pangasinan +pah I L Tenharim +pai I L Pe +pak I L Parakanã +pal pal pal I A Pahlavi +pam pam pam I L Pampanga +pan pan pan pa I L Panjabi +pao I L Northern Paiute +pap pap pap I L Papiamento +paq I L Parya +par I L Panamint +pas I L Papasena +pat I L Papitalai +pau pau pau I L Palauan +pav I L Pakaásnovos +paw I L Pawnee +pax I E Pankararé +pay I L Pech +paz I E Pankararú +pbb I L Páez +pbc I L Patamona +pbe I L Mezontla Popoloca +pbf I L Coyotepec Popoloca +pbg I E Paraujano +pbh I L E'ñapa Woromaipu +pbi I L Parkwa +pbl I L Mak (Nigeria) +pbn I L Kpasam +pbo I L Papel +pbp I L Badyara +pbr I L Pangwa +pbs I L Central Pame +pbt I L Southern Pashto +pbu I L Northern Pashto +pbv I L Pnar +pby I L Pyu +pca I L Santa Inés Ahuatempan Popoloca +pcb I L Pear +pcc I L Bouyei +pcd I L Picard +pce I L Ruching Palaung +pcf I L Paliyan +pcg I L Paniya +pch I L Pardhan +pci I L Duruwa +pcj I L Parenga +pck I L Paite Chin +pcl I L Pardhi +pcm I L Nigerian Pidgin +pcn I L Piti +pcp I L Pacahuara +pcw I L Pyapun +pda I L Anam +pdc I L Pennsylvania German +pdi I L Pa Di +pdn I L Podena +pdo I L Padoe +pdt I L Plautdietsch +pdu I L Kayan +pea I L Peranakan Indonesian +peb I E Eastern Pomo +ped I L Mala (Papua New Guinea) +pee I L Taje +pef I E Northeastern Pomo +peg I L Pengo +peh I L Bonan +pei I L Chichimeca-Jonaz +pej I E Northern Pomo +pek I L Penchal +pel I L Pekal +pem I L Phende +peo peo peo I H Old Persian (ca. 600-400 B.C.) +pep I L Kunja +peq I L Southern Pomo +pes I L Iranian Persian +pev I L Pémono +pex I L Petats +pey I L Petjo +pez I L Eastern Penan +pfa I L Pááfang +pfe I L Peere +pfl I L Pfaelzisch +pga I L Sudanese Creole Arabic +pgg I L Pangwali +pgi I L Pagi +pgk I L Rerep +pgl I A Primitive Irish +pgn I A Paelignian +pgs I L Pangseng +pgu I L Pagu +pha I L Pa-Hng +phd I L Phudagi +phg I L Phuong +phh I L Phukha +phk I L Phake +phl I L Phalura +phm I L Phimbi +phn phn phn I A Phoenician +pho I L Phunoi +phq I L Phana' +phr I L Pahari-Potwari +pht I L Phu Thai +phu I L Phuan +phv I L Pahlavani +phw I L Phangduwali +pia I L Pima Bajo +pib I L Yine +pic I L Pinji +pid I L Piaroa +pie I E Piro +pif I L Pingelapese +pig I L Pisabo +pih I L Pitcairn-Norfolk +pii I L Pini +pij I E Pijao +pil I L Yom +pim I E Powhatan +pin I L Piame +pio I L Piapoco +pip I L Pero +pir I L Piratapuyo +pis I L Pijin +pit I E Pitta Pitta +piu I L Pintupi-Luritja +piv I L Pileni +piw I L Pimbwe +pix I L Piu +piy I L Piya-Kwonci +piz I L Pije +pjt I L Pitjantjatjara +pka I H Ardhamāgadhī Prākrit +pkb I L Pokomo +pkc I E Paekche +pkg I L Pak-Tong +pkh I L Pankhu +pkn I L Pakanha +pko I L Pökoot +pkp I L Pukapuka +pkr I L Attapady Kurumba +pks I L Pakistan Sign Language +pkt I L Maleng +pku I L Paku +pla I L Miani +plb I L Polonombauk +plc I L Central Palawano +pld I L Polari +ple I L Palu'e +plg I L Pilagá +plh I L Paulohi +pli pli pli pi I A Pali +plj I L Polci +plk I L Kohistani Shina +pll I L Shwe Palaung +pln I L Palenquero +plo I L Oluta Popoluca +plp I L Palpa +plq I A Palaic +plr I L Palaka Senoufo +pls I L San Marcos Tlalcoyalco Popoloca +plt I L Plateau Malagasy +plu I L Palikúr +plv I L Southwest Palawano +plw I L Brooke's Point Palawano +ply I L Bolyu +plz I L Paluan +pma I L Paama +pmb I L Pambia +pmc I E Palumata +pmd I E Pallanganmiddang +pme I L Pwaamei +pmf I L Pamona +pmh I H Māhārāṣṭri Prākrit +pmi I L Northern Pumi +pmj I L Southern Pumi +pmk I E Pamlico +pml I E Lingua Franca +pmm I L Pomo +pmn I L Pam +pmo I L Pom +pmq I L Northern Pame +pmr I L Paynamar +pms I L Piemontese +pmt I L Tuamotuan +pmu I L Mirpur Panjabi +pmw I L Plains Miwok +pmx I L Poumei Naga +pmy I L Papuan Malay +pmz I E Southern Pame +pna I L Punan Bah-Biau +pnb I L Western Panjabi +pnc I L Pannei +pne I L Western Penan +png I L Pongu +pnh I L Penrhyn +pni I L Aoheng +pnj I E Pinjarup +pnk I L Paunaka +pnl I L Paleni +pnm I L Punan Batu 1 +pnn I L Pinai-Hagahai +pno I E Panobo +pnp I L Pancana +pnq I L Pana (Burkina Faso) +pnr I L Panim +pns I L Ponosakan +pnt I L Pontic +pnu I L Jiongnai Bunu +pnv I L Pinigura +pnw I L Panytyima +pnx I L Phong-Kniang +pny I L Pinyin +pnz I L Pana (Central African Republic) +poc I L Poqomam +pod I E Ponares +poe I L San Juan Atzingo Popoloca +pof I L Poke +pog I E Potiguára +poh I L Poqomchi' +poi I L Highland Popoluca +pok I L Pokangá +pol pol pol pl I L Polish +pom I L Southeastern Pomo +pon pon pon I L Pohnpeian +poo I L Central Pomo +pop I L Pwapwâ +poq I L Texistepec Popoluca +por por por pt I L Portuguese +pos I L Sayula Popoluca +pot I L Potawatomi +pov I L Upper Guinea Crioulo +pow I L San Felipe Otlaltepec Popoloca +pox I E Polabian +poy I L Pogolo +ppa I L Pao +ppe I L Papi +ppi I L Paipai +ppk I L Uma +ppl I L Pipil +ppm I L Papuma +ppn I L Papapana +ppo I L Folopa +ppp I L Pelende +ppq I L Pei +pps I L San Luís Temalacayuca Popoloca +ppt I L Pare +ppu I E Papora +pqa I L Pa'a +pqm I L Malecite-Passamaquoddy +prb I L Lua' +prc I L Parachi +prd I L Parsi-Dari +pre I L Principense +prf I L Paranan +prg I L Prussian +prh I L Porohanon +pri I L Paicî +prk I L Parauk +prl I L Peruvian Sign Language +prm I L Kibiri +prn I L Prasuni +pro pro pro I H Old Provençal (to 1500) +prp I L Parsi +prq I L Ashéninka Perené +prr I E Puri +prs I L Dari +prt I L Phai +pru I L Puragi +prw I L Parawen +prx I L Purik +pry I L Pray 3 +prz I L Providencia Sign Language +psa I L Asue Awyu +psc I L Persian Sign Language +psd I L Plains Indian Sign Language +pse I L Central Malay +psg I L Penang Sign Language +psh I L Southwest Pashayi +psi I L Southeast Pashayi +psl I L Puerto Rican Sign Language +psm I E Pauserna +psn I L Panasuan +pso I L Polish Sign Language +psp I L Philippine Sign Language +psq I L Pasi +psr I L Portuguese Sign Language +pss I L Kaulong +pst I L Central Pashto +psu I H Sauraseni Prākrit +psw I L Port Sandwich +psy I E Piscataway +pta I L Pai Tavytera +pth I E Pataxó Hã-Ha-Hãe +pti I L Pintiini +ptn I L Patani +pto I L Zo'é +ptp I L Patep +ptr I L Piamatsina +ptt I L Enrekang +ptu I L Bambam +ptv I L Port Vato +ptw I E Pentlatch +pty I L Pathiya +pua I L Western Highland Purepecha +pub I L Purum +puc I L Punan Merap +pud I L Punan Aput +pue I L Puelche +puf I L Punan Merah +pug I L Phuie +pui I L Puinave +puj I L Punan Tubu +puk I L Pu Ko +pum I L Puma +puo I L Puoc +pup I L Pulabu +puq I E Puquina +pur I L Puruborá +pus pus pus ps M L Pushto +put I L Putoh +puu I L Punu +puw I L Puluwatese +pux I L Puare +puy I E Purisimeño +puz I L Purum Naga +pwa I L Pawaia +pwb I L Panawa +pwg I L Gapapaiwa +pwi I E Patwin +pwm I L Molbog +pwn I L Paiwan +pwo I L Pwo Western Karen +pwr I L Powari +pww I L Pwo Northern Karen +pxm I L Quetzaltepec Mixe +pye I L Pye Krumen +pym I L Fyam +pyn I L Poyanáwa +pys I L Paraguayan Sign Language +pyu I L Puyuma +pyx I A Pyu (Myanmar) +pyy I L Pyen +pzn I L Para Naga +qua I L Quapaw +qub I L Huallaga Huánuco Quechua +quc I L K'iche' +qud I L Calderón Highland Quichua +que que que qu M L Quechua +quf I L Lambayeque Quechua +qug I L Chimborazo Highland Quichua +quh I L South Bolivian Quechua +qui I L Quileute +quk I L Chachapoyas Quechua +qul I L North Bolivian Quechua +qum I L Sipacapense +qun I E Quinault +qup I L Southern Pastaza Quechua +quq I L Quinqui +qur I L Yanahuanca Pasco Quechua +qus I L Santiago del Estero Quichua +quv I L Sacapulteco +quw I L Tena Lowland Quichua +qux I L Yauyos Quechua +quy I L Ayacucho Quechua +quz I L Cusco Quechua +qva I L Ambo-Pasco Quechua +qvc I L Cajamarca Quechua +qve I L Eastern Apurímac Quechua +qvh I L Huamalíes-Dos de Mayo Huánuco Quechua +qvi I L Imbabura Highland Quichua +qvj I L Loja Highland Quichua +qvl I L Cajatambo North Lima Quechua +qvm I L Margos-Yarowilca-Lauricocha Quechua +qvn I L North Junín Quechua +qvo I L Napo Lowland Quechua +qvp I L Pacaraos Quechua +qvs I L San Martín Quechua +qvw I L Huaylla Wanca Quechua +qvy I L Queyu +qvz I L Northern Pastaza Quichua +qwa I L Corongo Ancash Quechua +qwc I H Classical Quechua +qwh I L Huaylas Ancash Quechua +qwm I E Kuman (Russia) +qws I L Sihuas Ancash Quechua +qwt I E Kwalhioqua-Tlatskanai +qxa I L Chiquián Ancash Quechua +qxc I L Chincha Quechua +qxh I L Panao Huánuco Quechua +qxl I L Salasaca Highland Quichua +qxn I L Northern Conchucos Ancash Quechua +qxo I L Southern Conchucos Ancash Quechua +qxp I L Puno Quechua +qxq I L Qashqa'i +qxr I L Cañar Highland Quichua +qxs I L Southern Qiang +qxt I L Santa Ana de Tusi Pasco Quechua +qxu I L Arequipa-La Unión Quechua +qxw I L Jauja Wanca Quechua +qya I C Quenya +qyp I E Quiripi +raa I L Dungmali +rab I L Camling +rac I L Rasawa +rad I L Rade +raf I L Western Meohang +rag I L Logooli +rah I L Rabha +rai I L Ramoaaina +raj raj raj M L Rajasthani +rak I L Tulu-Bohuai +ral I L Ralte +ram I L Canela +ran I L Riantana +rao I L Rao +rap rap rap I L Rapanui +raq I L Saam +rar rar rar I L Rarotongan +ras I L Tegali +rat I L Razajerdi +rau I L Raute +rav I L Sampang +raw I L Rawang +rax I L Rang +ray I L Rapa +raz I L Rahambuu +rbb I L Rumai Palaung +rbk I L Northern Bontok +rbl I L Miraya Bikol +rbp I E Barababaraba +rcf I L Réunion Creole French +rdb I L Rudbari +rea I L Rerau +reb I L Rembong +ree I L Rejang Kayan +reg I L Kara (Tanzania) +rei I L Reli +rej I L Rejang +rel I L Rendille +rem I E Remo +ren I L Rengao +rer I E Rer Bare +res I L Reshe +ret I L Retta +rey I L Reyesano +rga I L Roria +rge I L Romano-Greek +rgk I E Rangkas +rgn I L Romagnol +rgr I L Resígaro +rgs I L Southern Roglai +rgu I L Ringgou +rhg I L Rohingya +rhp I L Yahang +ria I L Riang (India) +rie I L Rien +rif I L Tarifit +ril I L Riang (Myanmar) +rim I L Nyaturu +rin I L Nungu +rir I L Ribun +rit I L Ritarungo +riu I L Riung +rjg I L Rajong +rji I L Raji +rjs I L Rajbanshi +rka I L Kraol +rkb I L Rikbaktsa +rkh I L Rakahanga-Manihiki +rki I L Rakhine +rkm I L Marka +rkt I L Rangpuri +rkw I E Arakwal +rma I L Rama +rmb I L Rembarunga +rmc I L Carpathian Romani +rmd I E Traveller Danish +rme I L Angloromani +rmf I L Kalo Finnish Romani +rmg I L Traveller Norwegian +rmh I L Murkim +rmi I L Lomavren +rmk I L Romkun +rml I L Baltic Romani +rmm I L Roma +rmn I L Balkan Romani +rmo I L Sinte Romani +rmp I L Rempi +rmq I L Caló +rms I L Romanian Sign Language +rmt I L Domari +rmu I L Tavringer Romani +rmv I C Romanova +rmw I L Welsh Romani +rmx I L Romam +rmy I L Vlax Romani +rmz I L Marma +rna I E Runa +rnd I L Ruund +rng I L Ronga +rnl I L Ranglong +rnn I L Roon +rnp I L Rongpo +rnr I E Nari Nari +rnw I L Rungwa +rob I L Tae' +roc I L Cacgia Roglai +rod I L Rogo +roe I L Ronji +rof I L Rombo +rog I L Northern Roglai +roh roh roh rm I L Romansh +rol I L Romblomanon +rom rom rom M L Romany +ron rum ron ro I L Romanian +roo I L Rotokas +rop I L Kriol +ror I L Rongga +rou I L Runga +row I L Dela-Oenale +rpn I L Repanbitip +rpt I L Rapting +rri I L Ririo +rro I L Waima +rrt I E Arritinngithigh +rsb I L Romano-Serbian +rsi I L Rennellese Sign Language +rsl I L Russian Sign Language +rtc I L Rungtu Chin +rth I L Ratahan +rtm I L Rotuman +rtw I L Rathawi +rub I L Gungu +ruc I L Ruuli +rue I L Rusyn +ruf I L Luguru +rug I L Roviana +ruh I L Ruga +rui I L Rufiji +ruk I L Che +run run run rn I L Rundi +ruo I L Istro Romanian +rup rup rup I L Macedo-Romanian +ruq I L Megleno Romanian +rus rus rus ru I L Russian +rut I L Rutul +ruu I L Lanas Lobu +ruy I L Mala (Nigeria) +ruz I L Ruma +rwa I L Rawo +rwk I L Rwa +rwm I L Amba (Uganda) +rwo I L Rawa +rwr I L Marwari (India) +rxd I L Ngardi +rxw I E Karuwali +ryn I L Northern Amami-Oshima +rys I L Yaeyama +ryu I L Central Okinawan +saa I L Saba +sab I L Buglere +sac I L Meskwaki +sad sad sad I L Sandawe +sae I L Sabanê +saf I L Safaliba +sag sag sag sg I L Sango +sah sah sah I L Yakut +saj I L Sahu +sak I L Sake +sam sam sam I E Samaritan Aramaic +san san san sa I A Sanskrit +sao I L Sause +sap I L Sanapaná +saq I L Samburu +sar I E Saraveca +sas sas sas I L Sasak +sat sat sat I L Santali +sau I L Saleman +sav I L Saafi-Saafi +saw I L Sawi +sax I L Sa +say I L Saya +saz I L Saurashtra +sba I L Ngambay +sbb I L Simbo +sbc I L Kele (Papua New Guinea) +sbd I L Southern Samo +sbe I L Saliba +sbf I L Shabo +sbg I L Seget +sbh I L Sori-Harengan +sbi I L Seti +sbj I L Surbakhal +sbk I L Safwa +sbl I L Botolan Sambal +sbm I L Sagala +sbn I L Sindhi Bhil +sbo I L Sabüm +sbp I L Sangu (Tanzania) +sbq I L Sileibi +sbr I L Sembakung Murut +sbs I L Subiya +sbt I L Kimki +sbu I L Stod Bhoti +sbv I A Sabine +sbw I L Simba +sbx I L Seberuang +sby I L Soli +sbz I L Sara Kaba +scb I L Chut +sce I L Dongxiang +scf I L San Miguel Creole French +scg I L Sanggau +sch I L Sakachep +sci I L Sri Lankan Creole Malay +sck I L Sadri +scl I L Shina +scn scn scn I L Sicilian +sco sco sco I L Scots +scp I L Helambu Sherpa +scq I L Sa'och +scs I L North Slavey +scu I L Shumcho +scv I L Sheni +scw I L Sha +scx I A Sicel +sda I L Toraja-Sa'dan +sdb I L Shabak +sdc I L Sassarese Sardinian +sde I L Surubu +sdf I L Sarli +sdg I L Savi +sdh I L Southern Kurdish +sdj I L Suundi +sdk I L Sos Kundi +sdl I L Saudi Arabian Sign Language +sdm I L Semandang +sdn I L Gallurese Sardinian +sdo I L Bukar-Sadung Bidayuh +sdp I L Sherdukpen +sdr I L Oraon Sadri +sds I E Sened +sdt I E Shuadit +sdu I L Sarudu +sdx I L Sibu Melanau +sdz I L Sallands +sea I L Semai +seb I L Shempire Senoufo +sec I L Sechelt +sed I L Sedang +see I L Seneca +sef I L Cebaara Senoufo +seg I L Segeju +seh I L Sena +sei I L Seri +sej I L Sene +sek I L Sekani +sel sel sel I L Selkup +sen I L Nanerigé Sénoufo +seo I L Suarmin +sep I L Sìcìté Sénoufo +seq I L Senara Sénoufo +ser I L Serrano +ses I L Koyraboro Senni Songhai +set I L Sentani +seu I L Serui-Laut +sev I L Nyarafolo Senoufo +sew I L Sewa Bay +sey I L Secoya +sez I L Senthang Chin +sfb I L Langue des signes de Belgique Francophone +sfe I L Eastern Subanen +sfm I L Small Flowery Miao +sfs I L South African Sign Language +sfw I L Sehwi +sga sga sga I H Old Irish (to 900) +sgb I L Mag-antsi Ayta +sgc I L Kipsigis +sgd I L Surigaonon +sge I L Segai +sgg I L Swiss-German Sign Language +sgh I L Shughni +sgi I L Suga +sgj I L Surgujia +sgk I L Sangkong +sgm I E Singa +sgo I L Songa +sgp I L Singpho +sgr I L Sangisari +sgs I L Samogitian +sgt I L Brokpake +sgu I L Salas +sgw I L Sebat Bet Gurage +sgx I L Sierra Leone Sign Language +sgy I L Sanglechi +sgz I L Sursurunga +sha I L Shall-Zwall +shb I L Ninam +shc I L Sonde +shd I L Kundal Shahi +she I L Sheko +shg I L Shua +shh I L Shoshoni +shi I L Tachelhit +shj I L Shatt +shk I L Shilluk +shl I L Shendu +shm I L Shahrudi +shn shn shn I L Shan +sho I L Shanga +shp I L Shipibo-Conibo +shq I L Sala +shr I L Shi +shs I L Shuswap +sht I E Shasta +shu I L Chadian Arabic +shv I L Shehri +shw I L Shwai +shx I L She +shy I L Tachawit +shz I L Syenara Senoufo +sia I E Akkala Sami +sib I L Sebop +sid sid sid I L Sidamo +sie I L Simaa +sif I L Siamou +sig I L Paasaal +sih I L Zire +sii I L Shom Peng +sij I L Numbami +sik I L Sikiana +sil I L Tumulung Sisaala +sim I L Mende (Papua New Guinea) +sin sin sin si I L Sinhala +sip I L Sikkimese +siq I L Sonia +sir I L Siri +sis I E Siuslaw +siu I L Sinagen +siv I L Sumariup +siw I L Siwai +six I L Sumau +siy I L Sivandi +siz I L Siwi +sja I L Epena +sjb I L Sajau Basap +sjd I L Kildin Sami +sje I L Pite Sami +sjg I L Assangori +sjk I E Kemi Sami +sjl I L Sajalong +sjm I L Mapun +sjn I C Sindarin +sjo I L Xibe +sjp I L Surjapuri +sjr I L Siar-Lak +sjs I E Senhaja De Srair +sjt I L Ter Sami +sju I L Ume Sami +sjw I L Shawnee +ska I L Skagit +skb I L Saek +skc I L Ma Manda +skd I L Southern Sierra Miwok +ske I L Seke (Vanuatu) +skf I L Sakirabiá +skg I L Sakalava Malagasy +skh I L Sikule +ski I L Sika +skj I L Seke (Nepal) +skk I L Sok +skm I L Kutong +skn I L Kolibugan Subanon +sko I L Seko Tengah +skp I L Sekapan +skq I L Sininkere +skr I L Seraiki +sks I L Maia +skt I L Sakata +sku I L Sakao +skv I L Skou +skw I E Skepi Creole Dutch +skx I L Seko Padang +sky I L Sikaiana +skz I L Sekar +slc I L Sáliba +sld I L Sissala +sle I L Sholaga +slf I L Swiss-Italian Sign Language +slg I L Selungai Murut +slh I L Southern Puget Sound Salish +sli I L Lower Silesian +slj I L Salumá +slk slo slk sk I L Slovak +sll I L Salt-Yui +slm I L Pangutaran Sama +sln I E Salinan +slp I L Lamaholot +slq I L Salchuq +slr I L Salar +sls I L Singapore Sign Language +slt I L Sila +slu I L Selaru +slv slv slv sl I L Slovenian +slw I L Sialum +slx I L Salampasu +sly I L Selayar +slz I L Ma'ya +sma sma sma I L Southern Sami +smb I L Simbari +smc I E Som +smd I L Sama +sme sme sme se I L Northern Sami +smf I L Auwe +smg I L Simbali +smh I L Samei +smj smj smj I L Lule Sami +smk I L Bolinao +sml I L Central Sama +smm I L Musasa +smn smn smn I L Inari Sami +smo smo smo sm I L Samoan +smp I E Samaritan +smq I L Samo +smr I L Simeulue +sms sms sms I L Skolt Sami +smt I L Simte +smu I E Somray +smv I L Samvedi +smw I L Sumbawa +smx I L Samba +smy I L Semnani +smz I L Simeku +sna sna sna sn I L Shona +snb I L Sebuyau +snc I L Sinaugoro +snd snd snd sd I L Sindhi +sne I L Bau Bidayuh +snf I L Noon +sng I L Sanga (Democratic Republic of Congo) +snh I E Shinabo +sni I E Sensi +snj I L Riverain Sango +snk snk snk I L Soninke +snl I L Sangil +snm I L Southern Ma'di +snn I L Siona +sno I L Snohomish +snp I L Siane +snq I L Sangu (Gabon) +snr I L Sihan +sns I L South West Bay +snu I L Senggi +snv I L Sa'ban +snw I L Selee +snx I L Sam +sny I L Saniyo-Hiyewe +snz I L Sinsauru +soa I L Thai Song +sob I L Sobei +soc I L So (Democratic Republic of Congo) +sod I L Songoora +soe I L Songomeno +sog sog sog I A Sogdian +soh I L Aka +soi I L Sonha +soj I L Soi +sok I L Sokoro +sol I L Solos +som som som so I L Somali +soo I L Songo +sop I L Songe +soq I L Kanasi +sor I L Somrai +sos I L Seeku +sot sot sot st I L Southern Sotho +sou I L Southern Thai +sov I L Sonsorol +sow I L Sowanda +sox I L Swo +soy I L Miyobe +soz I L Temi +spa spa spa es I L Spanish +spb I L Sepa (Indonesia) +spc I L Sapé +spd I L Saep +spe I L Sepa (Papua New Guinea) +spg I L Sian +spi I L Saponi +spk I L Sengo +spl I L Selepet +spm I L Akukem +spo I L Spokane +spp I L Supyire Senoufo +spq I L Loreto-Ucayali Spanish +spr I L Saparua +sps I L Saposa +spt I L Spiti Bhoti +spu I L Sapuan +spv I L Sambalpuri +spx I A South Picene +spy I L Sabaot +sqa I L Shama-Sambuga +sqh I L Shau +sqi alb sqi sq M L Albanian +sqk I L Albanian Sign Language +sqm I L Suma +sqn I E Susquehannock +sqo I L Sorkhei +sqq I L Sou +sqr I H Siculo Arabic +sqs I L Sri Lankan Sign Language +sqt I L Soqotri +squ I L Squamish +sra I L Saruga +srb I L Sora +src I L Logudorese Sardinian +srd srd srd sc M L Sardinian +sre I L Sara +srf I L Nafi +srg I L Sulod +srh I L Sarikoli +sri I L Siriano +srk I L Serudung Murut +srl I L Isirawa +srm I L Saramaccan +srn srn srn I L Sranan Tongo +sro I L Campidanese Sardinian +srp srp srp sr I L Serbian +srq I L Sirionó +srr srr srr I L Serer +srs I L Sarsi +srt I L Sauri +sru I L Suruí +srv I L Southern Sorsoganon +srw I L Serua +srx I L Sirmauri +sry I L Sera +srz I L Shahmirzadi +ssb I L Southern Sama +ssc I L Suba-Simbiti +ssd I L Siroi +sse I L Balangingi +ssf I L Thao +ssg I L Seimat +ssh I L Shihhi Arabic +ssi I L Sansi +ssj I L Sausi +ssk I L Sunam +ssl I L Western Sisaala +ssm I L Semnam +ssn I L Waata +sso I L Sissano +ssp I L Spanish Sign Language +ssq I L So'a +ssr I L Swiss-French Sign Language +sss I L Sô +sst I L Sinasina +ssu I L Susuami +ssv I L Shark Bay +ssw ssw ssw ss I L Swati +ssx I L Samberigi +ssy I L Saho +ssz I L Sengseng +sta I L Settla +stb I L Northern Subanen +std I L Sentinel +ste I L Liana-Seti +stf I L Seta +stg I L Trieng +sth I L Shelta +sti I L Bulo Stieng +stj I L Matya Samo +stk I L Arammba +stl I L Stellingwerfs +stm I L Setaman +stn I L Owa +sto I L Stoney +stp I L Southeastern Tepehuan +stq I L Saterfriesisch +str I L Straits Salish +sts I L Shumashti +stt I L Budeh Stieng +stu I L Samtao +stv I L Silt'e +stw I L Satawalese +sty I L Siberian Tatar +sua I L Sulka +sub I L Suku +suc I L Western Subanon +sue I L Suena +sug I L Suganga +sui I L Suki +suj I L Shubi +suk suk suk I L Sukuma +sun sun sun su I L Sundanese +suq I L Suri +sur I L Mwaghavul +sus sus sus I L Susu +sut I E Subtiaba +suv I L Puroik +suw I L Sumbwa +sux sux sux I A Sumerian +suy I L Suyá +suz I L Sunwar +sva I L Svan +svb I L Ulau-Suain +svc I L Vincentian Creole English +sve I L Serili +svk I L Slovakian Sign Language +svm I L Slavomolisano +svr I L Savara +svs I L Savosavo +svx I E Skalvian +swa swa swa sw M L Swahili (macrolanguage) +swb I L Maore Comorian +swc I L Congo Swahili +swe swe swe sv I L Swedish +swf I L Sere +swg I L Swabian +swh I L Swahili (individual language) +swi I L Sui +swj I L Sira +swk I L Malawi Sena +swl I L Swedish Sign Language +swm I L Samosa +swn I L Sawknah +swo I L Shanenawa +swp I L Suau +swq I L Sharwa +swr I L Saweru +sws I L Seluwasan +swt I L Sawila +swu I L Suwawa +swv I L Shekhawati +sww I E Sowa +swx I L Suruahá +swy I L Sarua +sxb I L Suba +sxc I A Sicanian +sxe I L Sighu +sxg I L Shixing +sxk I E Southern Kalapuya +sxl I E Selian +sxm I L Samre +sxn I L Sangir +sxo I A Sorothaptic +sxr I L Saaroa +sxs I L Sasaru +sxu I L Upper Saxon +sxw I L Saxwe Gbe +sya I L Siang +syb I L Central Subanen +syc syc syc I H Classical Syriac +syi I L Seki +syk I L Sukur +syl I L Sylheti +sym I L Maya Samo +syn I L Senaya +syo I L Suoy +syr syr syr M L Syriac +sys I L Sinyar +syw I L Kagate +syy I L Al-Sayyid Bedouin Sign Language +sza I L Semelai +szb I L Ngalum +szc I L Semaq Beri +szd I E Seru +sze I L Seze +szg I L Sengele +szl I L Silesian +szn I L Sula +szp I L Suabo +szv I L Isu (Fako Division) +szw I L Sawai +taa I L Lower Tanana +tab I L Tabassaran +tac I L Lowland Tarahumara +tad I L Tause +tae I L Tariana +taf I L Tapirapé +tag I L Tagoi +tah tah tah ty I L Tahitian +taj I L Eastern Tamang +tak I L Tala +tal I L Tal +tam tam tam ta I L Tamil +tan I L Tangale +tao I L Yami +tap I L Taabwa +taq I L Tamasheq +tar I L Central Tarahumara +tas I E Tay Boi +tat tat tat tt I L Tatar +tau I L Upper Tanana +tav I L Tatuyo +taw I L Tai +tax I L Tamki +tay I L Atayal +taz I L Tocho +tba I L Aikanã +tbb I E Tapeba +tbc I L Takia +tbd I L Kaki Ae +tbe I L Tanimbili +tbf I L Mandara +tbg I L North Tairora +tbh I E Thurawal +tbi I L Gaam +tbj I L Tiang +tbk I L Calamian Tagbanwa +tbl I L Tboli +tbm I L Tagbu +tbn I L Barro Negro Tunebo +tbo I L Tawala +tbp I L Taworta +tbr I L Tumtum +tbs I L Tanguat +tbt I L Tembo (Kitembo) +tbu I E Tubar +tbv I L Tobo +tbw I L Tagbanwa +tbx I L Kapin +tby I L Tabaru +tbz I L Ditammari +tca I L Ticuna +tcb I L Tanacross +tcc I L Datooga +tcd I L Tafi +tce I L Southern Tutchone +tcf I L Malinaltepec Me'phaa +tcg I L Tamagario +tch I L Turks And Caicos Creole English +tci I L Wára +tck I L Tchitchege +tcl I E Taman (Myanmar) +tcm I L Tanahmerah +tcn I L Tichurong +tco I L Taungyo +tcp I L Tawr Chin +tcq I L Kaiy +tcs I L Torres Strait Creole +tct I L T'en +tcu I L Southeastern Tarahumara +tcw I L Tecpatlán Totonac +tcx I L Toda +tcy I L Tulu +tcz I L Thado Chin +tda I L Tagdal +tdb I L Panchpargania +tdc I L Emberá-Tadó +tdd I L Tai Nüa +tde I L Tiranige Diga Dogon +tdf I L Talieng +tdg I L Western Tamang +tdh I L Thulung +tdi I L Tomadino +tdj I L Tajio +tdk I L Tambas +tdl I L Sur +tdn I L Tondano +tdo I L Teme +tdq I L Tita +tdr I L Todrah +tds I L Doutai +tdt I L Tetun Dili +tdu I L Tempasuk Dusun +tdv I L Toro +tdx I L Tandroy-Mahafaly Malagasy +tdy I L Tadyawan +tea I L Temiar +teb I E Tetete +tec I L Terik +ted I L Tepo Krumen +tee I L Huehuetla Tepehua +tef I L Teressa +teg I L Teke-Tege +teh I L Tehuelche +tei I L Torricelli +tek I L Ibali Teke +tel tel tel te I L Telugu +tem tem tem I L Timne +ten I E Tama (Colombia) +teo I L Teso +tep I E Tepecano +teq I L Temein +ter ter ter I L Tereno +tes I L Tengger +tet tet tet I L Tetum +teu I L Soo +tev I L Teor +tew I L Tewa (USA) +tex I L Tennet +tey I L Tulishi +tfi I L Tofin Gbe +tfn I L Tanaina +tfo I L Tefaro +tfr I L Teribe +tft I L Ternate +tga I L Sagalla +tgb I L Tobilung +tgc I L Tigak +tgd I L Ciwogai +tge I L Eastern Gorkha Tamang +tgf I L Chalikha +tgh I L Tobagonian Creole English +tgi I L Lawunuia +tgj I L Tagin +tgk tgk tgk tg I L Tajik +tgl tgl tgl tl I L Tagalog +tgn I L Tandaganon +tgo I L Sudest +tgp I L Tangoa +tgq I L Tring +tgr I L Tareng +tgs I L Nume +tgt I L Central Tagbanwa +tgu I L Tanggu +tgv I E Tingui-Boto +tgw I L Tagwana Senoufo +tgx I L Tagish +tgy I E Togoyo +tgz I E Tagalaka +tha tha tha th I L Thai +thc I L Tai Hang Tong +thd I L Thayore +the I L Chitwania Tharu +thf I L Thangmi +thh I L Northern Tarahumara +thi I L Tai Long +thk I L Tharaka +thl I L Dangaura Tharu +thm I L Aheu +thn I L Thachanadan +thp I L Thompson +thq I L Kochila Tharu +thr I L Rana Tharu +ths I L Thakali +tht I L Tahltan +thu I L Thuri +thv I L Tahaggart Tamahaq +thw I L Thudam +thx I L The +thy I L Tha +thz I L Tayart Tamajeq +tia I L Tidikelt Tamazight +tic I L Tira +tid I L Tidong +tif I L Tifal +tig tig tig I L Tigre +tih I L Timugon Murut +tii I L Tiene +tij I L Tilung +tik I L Tikar +til I E Tillamook +tim I L Timbe +tin I L Tindi +tio I L Teop +tip I L Trimuris +tiq I L Tiéfo +tir tir tir ti I L Tigrinya +tis I L Masadiit Itneg +tit I L Tinigua +tiu I L Adasen +tiv tiv tiv I L Tiv +tiw I L Tiwi +tix I L Southern Tiwa +tiy I L Tiruray +tiz I L Tai Hongjin +tja I L Tajuasohn +tjg I L Tunjung +tji I L Northern Tujia +tjl I L Tai Laing +tjm I E Timucua +tjn I E Tonjon +tjo I L Temacine Tamazight +tjs I L Southern Tujia +tju I E Tjurruru +tjw I L Djabwurrung +tka I E Truká +tkb I L Buksa +tkd I L Tukudede +tke I L Takwane +tkf I E Tukumanféd +tkg I L Tesaka Malagasy +tkl tkl tkl I L Tokelau +tkm I E Takelma +tkn I L Toku-No-Shima +tkp I L Tikopia +tkq I L Tee +tkr I L Tsakhur +tks I L Takestani +tkt I L Kathoriya Tharu +tku I L Upper Necaxa Totonac +tkw I L Teanu +tkx I L Tangko +tkz I L Takua +tla I L Southwestern Tepehuan +tlb I L Tobelo +tlc I L Yecuatla Totonac +tld I L Talaud +tlf I L Telefol +tlg I L Tofanma +tlh tlh tlh I C Klingon +tli tli tli I L Tlingit +tlj I L Talinga-Bwisi +tlk I L Taloki +tll I L Tetela +tlm I L Tolomako +tln I L Talondo' +tlo I L Talodi +tlp I L Filomena Mata-Coahuitlán Totonac +tlq I L Tai Loi +tlr I L Talise +tls I L Tambotalo +tlt I L Teluti +tlu I L Tulehu +tlv I L Taliabu +tlx I L Khehek +tly I L Talysh +tma I L Tama (Chad) +tmb I L Katbol +tmc I L Tumak +tmd I L Haruai +tme I E Tremembé +tmf I L Toba-Maskoy +tmg I E Ternateño +tmh tmh tmh M L Tamashek +tmi I L Tutuba +tmj I L Samarokena +tmk I L Northwestern Tamang +tml I L Tamnim Citak +tmm I L Tai Thanh +tmn I L Taman (Indonesia) +tmo I L Temoq +tmp I L Tai Mène +tmq I L Tumleo +tmr I E Jewish Babylonian Aramaic (ca. 200-1200 CE) +tms I L Tima +tmt I L Tasmate +tmu I L Iau +tmv I L Tembo (Motembo) +tmw I L Temuan +tmy I L Tami +tmz I E Tamanaku +tna I L Tacana +tnb I L Western Tunebo +tnc I L Tanimuca-Retuarã +tnd I L Angosturas Tunebo +tne I L Tinoc Kallahan +tng I L Tobanga +tnh I L Maiani +tni I L Tandia +tnk I L Kwamera +tnl I L Lenakel +tnm I L Tabla +tnn I L North Tanna +tno I L Toromono +tnp I L Whitesands +tnq I E Taino +tnr I L Ménik +tns I L Tenis +tnt I L Tontemboan +tnu I L Tay Khang +tnv I L Tangchangya +tnw I L Tonsawang +tnx I L Tanema +tny I L Tongwe +tnz I L Tonga (Thailand) +tob I L Toba +toc I L Coyutla Totonac +tod I L Toma +toe I E Tomedes +tof I L Gizrra +tog tog tog I L Tonga (Nyasa) +toh I L Gitonga +toi I L Tonga (Zambia) +toj I L Tojolabal +tol I L Tolowa +tom I L Tombulu +ton ton ton to I L Tonga (Tonga Islands) +too I L Xicotepec De Juárez Totonac +top I L Papantla Totonac +toq I L Toposa +tor I L Togbo-Vara Banda +tos I L Highland Totonac +tou I L Tho +tov I L Upper Taromi +tow I L Jemez +tox I L Tobian +toy I L Topoiyo +toz I L To +tpa I L Taupota +tpc I L Azoyú Me'phaa +tpe I L Tippera +tpf I L Tarpia +tpg I L Kula +tpi tpi tpi I L Tok Pisin +tpj I L Tapieté +tpk I E Tupinikin +tpl I L Tlacoapa Me'phaa +tpm I L Tampulma +tpn I E Tupinambá +tpo I L Tai Pao +tpp I L Pisaflores Tepehua +tpq I L Tukpa +tpr I L Tuparí +tpt I L Tlachichilco Tepehua +tpu I L Tampuan +tpv I L Tanapag +tpw I E Tupí +tpx I L Acatepec Me'phaa +tpy I L Trumai +tpz I L Tinputz +tqb I L Tembé +tql I L Lehali +tqm I L Turumsa +tqn I L Tenino +tqo I L Toaripi +tqp I L Tomoip +tqq I L Tunni +tqr I E Torona +tqt I L Western Totonac +tqu I L Touo +tqw I E Tonkawa +tra I L Tirahi +trb I L Terebu +trc I L Copala Triqui +trd I L Turi +tre I L East Tarangan +trf I L Trinidadian Creole English +trg I L Lishán Didán +trh I L Turaka +tri I L Trió +trj I L Toram +trl I L Traveller Scottish +trm I L Tregami +trn I L Trinitario +tro I L Tarao Naga +trp I L Kok Borok +trq I L San Martín Itunyoso Triqui +trr I L Taushiro +trs I L Chicahuaxtla Triqui +trt I L Tunggare +tru I L Turoyo +trv I L Taroko +trw I L Torwali +trx I L Tringgus-Sembaan Bidayuh +try I E Turung +trz I E Torá +tsa I L Tsaangi +tsb I L Tsamai +tsc I L Tswa +tsd I L Tsakonian +tse I L Tunisian Sign Language +tsf I L Southwestern Tamang +tsg I L Tausug +tsh I L Tsuvan +tsi tsi tsi I L Tsimshian +tsj I L Tshangla +tsk I L Tseku +tsl I L Ts'ün-Lao +tsm I L Turkish Sign Language +tsn tsn tsn tn I L Tswana +tso tso tso ts I L Tsonga +tsp I L Northern Toussian +tsq I L Thai Sign Language +tsr I L Akei +tss I L Taiwan Sign Language +tst I L Tondi Songway Kiini +tsu I L Tsou +tsv I L Tsogo +tsw I L Tsishingini +tsx I L Mubami +tsy I L Tebul Sign Language +tsz I L Purepecha +tta I E Tutelo +ttb I L Gaa +ttc I L Tektiteko +ttd I L Tauade +tte I L Bwanabwana +ttf I L Tuotomb +ttg I L Tutong +tth I L Upper Ta'oih +tti I L Tobati +ttj I L Tooro +ttk I L Totoro +ttl I L Totela +ttm I L Northern Tutchone +ttn I L Towei +tto I L Lower Ta'oih +ttp I L Tombelala +ttq I L Tawallammat Tamajaq +ttr I L Tera +tts I L Northeastern Thai +ttt I L Muslim Tat +ttu I L Torau +ttv I L Titan +ttw I L Long Wat +tty I L Sikaritai +ttz I L Tsum +tua I L Wiarumus +tub I L Tübatulabal +tuc I L Mutu +tud I E Tuxá +tue I L Tuyuca +tuf I L Central Tunebo +tug I L Tunia +tuh I L Taulil +tui I L Tupuri +tuj I L Tugutil +tuk tuk tuk tk I L Turkmen +tul I L Tula +tum tum tum I L Tumbuka +tun I E Tunica +tuo I L Tucano +tuq I L Tedaga +tur tur tur tr I L Turkish +tus I L Tuscarora +tuu I L Tututni +tuv I L Turkana +tux I E Tuxináwa +tuy I L Tugen +tuz I L Turka +tva I L Vaghua +tvd I L Tsuvadi +tve I L Te'un +tvk I L Southeast Ambrym +tvl tvl tvl I L Tuvalu +tvm I L Tela-Masbuar +tvn I L Tavoyan +tvo I L Tidore +tvs I L Taveta +tvt I L Tutsa Naga +tvu I L Tunen +tvw I L Sedoa +tvy I E Timor Pidgin +twa I E Twana +twb I L Western Tawbuid +twc I E Teshenawa +twd I L Twents +twe I L Tewa (Indonesia) +twf I L Northern Tiwa +twg I L Tereweng +twh I L Tai Dón +twi twi twi tw I L Twi +twl I L Tawara +twm I L Tawang Monpa +twn I L Twendi +two I L Tswapong +twp I L Ere +twq I L Tasawaq +twr I L Southwestern Tarahumara +twt I E Turiwára +twu I L Termanu +tww I L Tuwari +twx I L Tewe +twy I L Tawoyan +txa I L Tombonuo +txb I A Tokharian B +txc I E Tsetsaut +txe I L Totoli +txg I A Tangut +txh I A Thracian +txi I L Ikpeng +txm I L Tomini +txn I L West Tarangan +txo I L Toto +txq I L Tii +txr I A Tartessian +txs I L Tonsea +txt I L Citak +txu I L Kayapó +txx I L Tatana +txy I L Tanosy Malagasy +tya I L Tauya +tye I L Kyanga +tyh I L O'du +tyi I L Teke-Tsaayi +tyj I L Tai Do +tyl I L Thu Lao +tyn I L Kombai +typ I E Thaypan +tyr I L Tai Daeng +tys I L Tày Sa Pa +tyt I L Tày Tac +tyu I L Kua +tyv tyv tyv I L Tuvinian +tyx I L Teke-Tyee +tyz I L Tày +tza I L Tanzanian Sign Language +tzh I L Tzeltal +tzj I L Tz'utujil +tzl I C Talossan +tzm I L Central Atlas Tamazight +tzn I L Tugun +tzo I L Tzotzil +tzx I L Tabriak +uam I E Uamué +uan I L Kuan +uar I L Tairuma +uba I L Ubang +ubi I L Ubi +ubl I L Buhi'non Bikol +ubr I L Ubir +ubu I L Umbu-Ungu +uby I E Ubykh +uda I L Uda +ude I L Udihe +udg I L Muduga +udi I L Udi +udj I L Ujir +udl I L Wuzlam +udm udm udm I L Udmurt +udu I L Uduk +ues I L Kioko +ufi I L Ufim +uga uga uga I A Ugaritic +ugb I E Kuku-Ugbanh +uge I L Ughele +ugn I L Ugandan Sign Language +ugo I L Ugong +ugy I L Uruguayan Sign Language +uha I L Uhami +uhn I L Damal +uig uig uig ug I L Uighur +uis I L Uisai +uiv I L Iyive +uji I L Tanjijili +uka I L Kaburi +ukg I L Ukuriguma +ukh I L Ukhwejo +ukl I L Ukrainian Sign Language +ukp I L Ukpe-Bayobiri +ukq I L Ukwa +ukr ukr ukr uk I L Ukrainian +uks I L Urubú-Kaapor Sign Language +uku I L Ukue +ukw I L Ukwuani-Aboh-Ndoni +uky I E Kuuk-Yak +ula I L Fungwa +ulb I L Ulukwumi +ulc I L Ulch +ule I E Lule +ulf I L Usku +uli I L Ulithian +ulk I L Meriam +ull I L Ullatan +ulm I L Ulumanda' +uln I L Unserdeutsch +ulu I L Uma' Lung +ulw I L Ulwa +uma I L Umatilla +umb umb umb I L Umbundu +umc I A Marrucinian +umd I E Umbindhamu +umg I E Umbuygamu +umi I L Ukit +umm I L Umon +umn I L Makyan Naga +umo I E Umotína +ump I L Umpila +umr I E Umbugarla +ums I L Pendau +umu I L Munsee +una I L North Watut +und und und S S Undetermined +une I L Uneme +ung I L Ngarinyin +unk I L Enawené-Nawé +unm I E Unami +unn I L Kurnai +unr I L Mundari +unu I L Unubahe +unx I L Munda +unz I L Unde Kaili +uok I L Uokha +upi I L Umeda +upv I L Uripiv-Wala-Rano-Atchin +ura I L Urarina +urb I L Urubú-Kaapor +urc I E Urningangg +urd urd urd ur I L Urdu +ure I L Uru +urf I E Uradhi +urg I L Urigina +urh I L Urhobo +uri I L Urim +urk I L Urak Lawoi' +url I L Urali +urm I L Urapmin +urn I L Uruangnirin +uro I L Ura (Papua New Guinea) +urp I L Uru-Pa-In +urr I L Lehalurup +urt I L Urat +uru I E Urumi +urv I E Uruava +urw I L Sop +urx I L Urimo +ury I L Orya +urz I L Uru-Eu-Wau-Wau +usa I L Usarufa +ush I L Ushojo +usi I L Usui +usk I L Usaghade +usp I L Uspanteco +usu I L Uya +uta I L Otank +ute I L Ute-Southern Paiute +utp I L Amba (Solomon Islands) +utr I L Etulo +utu I L Utu +uum I L Urum +uun I L Kulon-Pazeh +uur I L Ura (Vanuatu) +uuu I L U +uve I L West Uvean +uvh I L Uri +uvl I L Lote +uwa I L Kuku-Uwanh +uya I L Doko-Uyanga +uzb uzb uzb uz M L Uzbek +uzn I L Northern Uzbek +uzs I L Southern Uzbek +vaa I L Vaagri Booli +vae I L Vale +vaf I L Vafsi +vag I L Vagla +vah I L Varhadi-Nagpuri +vai vai vai I L Vai +vaj I L Vasekela Bushman +val I L Vehes +vam I L Vanimo +van I L Valman +vao I L Vao +vap I L Vaiphei +var I L Huarijio +vas I L Vasavi +vau I L Vanuma +vav I L Varli +vay I L Wayu +vbb I L Southeast Babar +vbk I L Southwestern Bontok +vec I L Venetian +ved I L Veddah +vel I L Veluws +vem I L Vemgo-Mabas +ven ven ven ve I L Venda +veo I E Ventureño +vep I L Veps +ver I L Mom Jango +vgr I L Vaghri +vgt I L Vlaamse Gebarentaal +vic I L Virgin Islands Creole English +vid I L Vidunda +vie vie vie vi I L Vietnamese +vif I L Vili +vig I L Viemo +vil I L Vilela +vin I L Vinza +vis I L Vishavan +vit I L Viti +viv I L Iduna +vka I E Kariyarra +vki I L Ija-Zuba +vkj I L Kujarge +vkk I L Kaur +vkl I L Kulisusu +vkm I E Kamakan +vko I L Kodeoha +vkp I L Korlai Creole Portuguese +vkt I L Tenggarong Kutai Malay +vku I L Kurrama +vlp I L Valpei +vls I L Vlaams +vma I L Martuyhunira +vmb I E Barbaram +vmc I L Juxtlahuaca Mixtec +vmd I L Mudu Koraga +vme I L East Masela +vmf I L Mainfränkisch +vmg I L Lungalunga +vmh I L Maraghei +vmi I E Miwa +vmj I L Ixtayutla Mixtec +vmk I L Makhuwa-Shirima +vml I E Malgana +vmm I L Mitlatongo Mixtec +vmp I L Soyaltepec Mazatec +vmq I L Soyaltepec Mixtec +vmr I L Marenje +vms I E Moksela +vmu I E Muluridyi +vmv I E Valley Maidu +vmw I L Makhuwa +vmx I L Tamazola Mixtec +vmy I L Ayautla Mazatec +vmz I L Mazatlán Mazatec +vnk I L Vano +vnm I L Vinmavis +vnp I L Vunapu +vol vol vol vo I C Volapük +vor I L Voro +vot vot vot I L Votic +vra I L Vera'a +vro I L Võro +vrs I L Varisi +vrt I L Burmbar +vsi I L Moldova Sign Language +vsl I L Venezuelan Sign Language +vsv I L Valencian Sign Language +vto I L Vitou +vum I L Vumbu +vun I L Vunjo +vut I L Vute +vwa I L Awa (China) +waa I L Walla Walla +wab I L Wab +wac I L Wasco-Wishram +wad I L Wandamen +wae I L Walser +waf I E Wakoná +wag I L Wa'ema +wah I L Watubela +wai I L Wares +waj I L Waffa +wal wal wal I L Wolaytta +wam I E Wampanoag +wan I L Wan +wao I E Wappo +wap I L Wapishana +waq I L Wageman +war war war I L Waray (Philippines) +was was was I L Washo +wat I L Kaninuwa +wau I L Waurá +wav I L Waka +waw I L Waiwai +wax I L Watam +way I L Wayana +waz I L Wampur +wba I L Warao +wbb I L Wabo +wbe I L Waritai +wbf I L Wara +wbh I L Wanda +wbi I L Vwanji +wbj I L Alagwa +wbk I L Waigali +wbl I L Wakhi +wbm I L Wa +wbp I L Warlpiri +wbq I L Waddar +wbr I L Wagdi +wbt I L Wanman +wbv I L Wajarri +wbw I L Woi +wca I L Yanomámi +wci I L Waci Gbe +wdd I L Wandji +wdg I L Wadaginam +wdj I L Wadjiginy +wdk I E Wadikali +wdu I E Wadjigu +wdy I E Wadjabangayi +wea I E Wewaw +wec I L Wè Western +wed I L Wedau +weg I L Wergaia +weh I L Weh +wei I L Kiunum +wem I L Weme Gbe +weo I L Wemale +wep I L Westphalien +wer I L Weri +wes I L Cameroon Pidgin +wet I L Perai +weu I L Rawngtu Chin +wew I L Wejewa +wfg I L Yafi +wga I E Wagaya +wgb I L Wagawaga +wgg I E Wangganguru +wgi I L Wahgi +wgo I L Waigeo +wgu I E Wirangu +wgy I L Warrgamay +wha I L Manusela +whg I L North Wahgi +whk I L Wahau Kenyah +whu I L Wahau Kayan +wib I L Southern Toussian +wic I L Wichita +wie I E Wik-Epa +wif I E Wik-Keyangan +wig I L Wik-Ngathana +wih I L Wik-Me'anha +wii I L Minidien +wij I L Wik-Iiyanh +wik I L Wikalkan +wil I E Wilawila +wim I L Wik-Mungkan +win I L Ho-Chunk +wir I E Wiraféd +wiu I L Wiru +wiv I L Vitu +wiy I E Wiyot +wja I L Waja +wji I L Warji +wka I E Kw'adza +wkb I L Kumbaran +wkd I L Wakde +wkl I L Kalanadi +wku I L Kunduvadi +wkw I E Wakawaka +wky I E Wangkayutyuru +wla I L Walio +wlc I L Mwali Comorian +wle I L Wolane +wlg I L Kunbarlang +wli I L Waioli +wlk I E Wailaki +wll I L Wali (Sudan) +wlm I H Middle Welsh +wln wln wln wa I L Walloon +wlo I L Wolio +wlr I L Wailapa +wls I L Wallisian +wlu I E Wuliwuli +wlv I L Wichí Lhamtés Vejoz +wlw I L Walak +wlx I L Wali (Ghana) +wly I E Waling +wma I E Mawa (Nigeria) +wmb I L Wambaya +wmc I L Wamas +wmd I L Mamaindé +wme I L Wambule +wmh I L Waima'a +wmi I E Wamin +wmm I L Maiwa (Indonesia) +wmn I E Waamwang +wmo I L Wom (Papua New Guinea) +wms I L Wambon +wmt I L Walmajarri +wmw I L Mwani +wmx I L Womo +wnb I L Wanambre +wnc I L Wantoat +wnd I E Wandarang +wne I L Waneci +wng I L Wanggom +wni I L Ndzwani Comorian +wnk I L Wanukaka +wnm I E Wanggamala +wnn I E Wunumara +wno I L Wano +wnp I L Wanap +wnu I L Usan +wnw I L Wintu +wny I L Wanyi +woa I L Tyaraity +wob I L Wè Northern +woc I L Wogeo +wod I L Wolani +woe I L Woleaian +wof I L Gambian Wolof +wog I L Wogamusin +woi I L Kamang +wok I L Longto +wol wol wol wo I L Wolof +wom I L Wom (Nigeria) +won I L Wongo +woo I L Manombai +wor I L Woria +wos I L Hanga Hundi +wow I L Wawonii +woy I E Weyto +wpc I L Maco +wra I L Warapu +wrb I E Warluwara +wrd I L Warduji +wrg I E Warungu +wrh I E Wiradhuri +wri I E Wariyangga +wrk I L Garrwa +wrl I L Warlmanpa +wrm I L Warumungu +wrn I L Warnang +wro I E Worrorra +wrp I L Waropen +wrr I L Wardaman +wrs I L Waris +wru I L Waru +wrv I L Waruna +wrw I E Gugu Warra +wrx I L Wae Rana +wry I L Merwari +wrz I E Waray (Australia) +wsa I L Warembori +wsi I L Wusi +wsk I L Waskia +wsr I L Owenia +wss I L Wasa +wsu I E Wasu +wsv I E Wotapuri-Katarqalai +wtf I L Watiwa +wth I E Wathawurrung +wti I L Berta +wtk I L Watakataui +wtm I L Mewati +wtw I L Wotu +wua I L Wikngenchera +wub I L Wunambal +wud I L Wudu +wuh I L Wutunhua +wul I L Silimo +wum I L Wumbvu +wun I L Bungu +wur I E Wurrugu +wut I L Wutung +wuu I L Wu Chinese +wuv I L Wuvulu-Aua +wux I L Wulna +wuy I L Wauyai +wwa I L Waama +wwb I E Wakabunga +wwo I L Wetamut +wwr I E Warrwa +www I L Wawa +wxa I L Waxianghua +wxw I E Wardandi +wya I L Wyandot +wyb I L Wangaaybuwan-Ngiyambaa +wyi I E Woiwurrung +wym I L Wymysorys +wyr I L Wayoró +wyy I L Western Fijian +xaa I H Andalusian Arabic +xab I L Sambe +xac I L Kachari +xad I E Adai +xae I A Aequian +xag I E Aghwan +xai I E Kaimbé +xal xal xal I L Kalmyk +xam I E /Xam +xan I L Xamtanga +xao I L Khao +xap I E Apalachee +xaq I A Aquitanian +xar I E Karami +xas I E Kamas +xat I L Katawixi +xau I L Kauwera +xav I L Xavánte +xaw I L Kawaiisu +xay I L Kayan Mahakam +xba I E Kamba (Brazil) +xbb I E Lower Burdekin +xbc I A Bactrian +xbd I E Bindal +xbe I E Bigambal +xbg I E Bunganditj +xbi I L Kombio +xbj I E Birrpayi +xbm I H Middle Breton +xbn I E Kenaboi +xbo I E Bolgarian +xbp I E Bibbulman +xbr I L Kambera +xbw I E Kambiwá +xbx I E Kabixí +xby I L Batyala +xcb I E Cumbric +xcc I A Camunic +xce I A Celtiberian +xcg I A Cisalpine Gaulish +xch I E Chemakum +xcl I H Classical Armenian +xcm I E Comecrudo +xcn I E Cotoname +xco I A Chorasmian +xcr I A Carian +xct I H Classical Tibetan +xcu I E Curonian +xcv I E Chuvantsy +xcw I E Coahuilteco +xcy I E Cayuse +xda I L Darkinyung +xdc I A Dacian +xdk I E Dharuk +xdm I A Edomite +xdy I L Malayic Dayak +xeb I A Eblan +xed I L Hdi +xeg I E //Xegwi +xel I L Kelo +xem I L Kembayan +xep I A Epi-Olmec +xer I L Xerénte +xes I L Kesawai +xet I L Xetá +xeu I L Keoru-Ahia +xfa I A Faliscan +xga I A Galatian +xgb I E Gbin +xgd I E Gudang +xgf I E Gabrielino-Fernandeño +xgg I E Goreng +xgi I E Garingbal +xgl I E Galindan +xgm I E Guwinmal +xgr I E Garza +xgu I L Unggumi +xgw I E Guwa +xha I A Harami +xhc I E Hunnic +xhd I A Hadrami +xhe I L Khetrani +xho xho xho xh I L Xhosa +xhr I A Hernican +xht I A Hattic +xhu I A Hurrian +xhv I L Khua +xib I A Iberian +xii I L Xiri +xil I A Illyrian +xin I E Xinca +xip I E Xipináwa +xir I E Xiriâna +xiv I A Indus Valley Language +xiy I L Xipaya +xjb I E Minjungbal +xjt I E Jaitmatang +xka I L Kalkoti +xkb I L Northern Nago +xkc I L Kho'ini +xkd I L Mendalam Kayan +xke I L Kereho +xkf I L Khengkha +xkg I L Kagoro +xkh I L Karahawyana +xki I L Kenyan Sign Language +xkj I L Kajali +xkk I L Kaco' +xkl I L Mainstream Kenyah +xkn I L Kayan River Kayan +xko I L Kiorr +xkp I L Kabatei +xkq I L Koroni +xkr I E Xakriabá +xks I L Kumbewaha +xkt I L Kantosi +xku I L Kaamba +xkv I L Kgalagadi +xkw I L Kembra +xkx I L Karore +xky I L Uma' Lasan +xkz I L Kurtokha +xla I L Kamula +xlb I E Loup B +xlc I A Lycian +xld I A Lydian +xle I A Lemnian +xlg I A Ligurian (Ancient) +xli I A Liburnian +xln I A Alanic +xlo I E Loup A +xlp I A Lepontic +xls I A Lusitanian +xlu I A Cuneiform Luwian +xly I A Elymian +xma I L Mushungulu +xmb I L Mbonga +xmc I L Makhuwa-Marrevone +xmd I L Mbudum +xme I A Median +xmf I L Mingrelian +xmg I L Mengaka +xmh I L Kuku-Muminh +xmj I L Majera +xmk I A Ancient Macedonian +xml I L Malaysian Sign Language +xmm I L Manado Malay +xmn I H Manichaean Middle Persian +xmo I L Morerebi +xmp I E Kuku-Mu'inh +xmq I E Kuku-Mangk +xmr I A Meroitic +xms I L Moroccan Sign Language +xmt I L Matbat +xmu I E Kamu +xmv I L Antankarana Malagasy +xmw I L Tsimihety Malagasy +xmx I L Maden +xmy I L Mayaguduna +xmz I L Mori Bawah +xna I A Ancient North Arabian +xnb I L Kanakanabu +xng I H Middle Mongolian +xnh I L Kuanhua +xni I E Ngarigu +xnk I E Nganakarti +xnn I L Northern Kankanay +xno I H Anglo-Norman +xnr I L Kangri +xns I L Kanashi +xnt I E Narragansett +xnu I E Nukunul +xny I L Nyiyaparli +xnz I L Kenzi +xoc I E O'chi'chi' +xod I L Kokoda +xog I L Soga +xoi I L Kominimung +xok I L Xokleng +xom I L Komo (Sudan) +xon I L Konkomba +xoo I E Xukurú +xop I L Kopar +xor I L Korubo +xow I L Kowaki +xpa I E Pirriya +xpc I E Pecheneg +xpe I L Liberia Kpelle +xpg I A Phrygian +xpi I E Pictish +xpj I E Mpalitjanh +xpk I L Kulina Pano +xpm I E Pumpokol +xpn I E Kapinawá +xpo I E Pochutec +xpp I E Puyo-Paekche +xpq I E Mohegan-Pequot +xpr I A Parthian +xps I E Pisidian +xpt I E Punthamara +xpu I A Punic +xpy I E Puyo +xqa I H Karakhanid +xqt I A Qatabanian +xra I L Krahô +xrb I L Eastern Karaboro +xrd I E Gundungurra +xre I L Kreye +xrg I E Minang +xri I L Krikati-Timbira +xrm I E Armazic +xrn I E Arin +xrq I E Karranga +xrr I A Raetic +xrt I E Aranama-Tamique +xru I L Marriammu +xrw I L Karawa +xsa I A Sabaean +xsb I L Sambal +xsc I A Scythian +xsd I A Sidetic +xse I L Sempan +xsh I L Shamang +xsi I L Sio +xsj I L Subi +xsl I L South Slavey +xsm I L Kasem +xsn I L Sanga (Nigeria) +xso I E Solano +xsp I L Silopi +xsq I L Makhuwa-Saka +xsr I L Sherpa +xss I E Assan +xsu I L Sanumá +xsv I E Sudovian +xsy I L Saisiyat +xta I L Alcozauca Mixtec +xtb I L Chazumba Mixtec +xtc I L Katcha-Kadugli-Miri +xtd I L Diuxi-Tilantongo Mixtec +xte I L Ketengban +xtg I A Transalpine Gaulish +xth I E Yitha Yitha +xti I L Sinicahua Mixtec +xtj I L San Juan Teita Mixtec +xtl I L Tijaltepec Mixtec +xtm I L Magdalena Peñasco Mixtec +xtn I L Northern Tlaxiaco Mixtec +xto I A Tokharian A +xtp I L San Miguel Piedras Mixtec +xtq I H Tumshuqese +xtr I A Early Tripuri +xts I L Sindihui Mixtec +xtt I L Tacahua Mixtec +xtu I L Cuyamecalco Mixtec +xtv I E Thawa +xtw I L Tawandê +xty I L Yoloxochitl Mixtec +xtz I E Tasmanian +xua I L Alu Kurumba +xub I L Betta Kurumba +xud I E Umiida +xug I L Kunigami +xuj I L Jennu Kurumba +xul I E Ngunawal +xum I A Umbrian +xun I E Unggaranggu +xuo I L Kuo +xup I E Upper Umpqua +xur I A Urartian +xut I E Kuthant +xuu I L Kxoe +xve I A Venetic +xvi I L Kamviri +xvn I A Vandalic +xvo I A Volscian +xvs I A Vestinian +xwa I L Kwaza +xwc I E Woccon +xwd I E Wadi Wadi +xwe I L Xwela Gbe +xwg I L Kwegu +xwj I E Wajuk +xwk I E Wangkumara +xwl I L Western Xwla Gbe +xwo I E Written Oirat +xwr I L Kwerba Mamberamo +xwt I E Wotjobaluk +xww I E Wemba Wemba +xxb I E Boro (Ghana) +xxk I L Ke'o +xxm I E Minkin +xxr I E Koropó +xxt I E Tambora +xya I E Yaygir +xyb I E Yandjibara +xyj I E Mayi-Yapi +xyk I E Mayi-Kulan +xyl I E Yalakalore +xyt I E Mayi-Thakurti +xyy I L Yorta Yorta +xzh I A Zhang-Zhung +xzm I E Zemgalian +xzp I H Ancient Zapotec +yaa I L Yaminahua +yab I L Yuhup +yac I L Pass Valley Yali +yad I L Yagua +yae I L Pumé +yaf I L Yaka (Democratic Republic of Congo) +yag I L Yámana +yah I L Yazgulyam +yai I L Yagnobi +yaj I L Banda-Yangere +yak I L Yakama +yal I L Yalunka +yam I L Yamba +yan I L Mayangna +yao yao yao I L Yao +yap yap yap I L Yapese +yaq I L Yaqui +yar I L Yabarana +yas I L Nugunu (Cameroon) +yat I L Yambeta +yau I L Yuwana +yav I L Yangben +yaw I L Yawalapití +yax I L Yauma +yay I L Agwagwune +yaz I L Lokaa +yba I L Yala +ybb I L Yemba +ybe I L West Yugur +ybh I L Yakha +ybi I L Yamphu +ybj I L Hasha +ybk I L Bokha +ybl I L Yukuben +ybm I L Yaben +ybn I E Yabaâna +ybo I L Yabong +ybx I L Yawiyo +yby I L Yaweyuha +ych I L Chesu +ycl I L Lolopo +ycn I L Yucuna +ycp I L Chepya +yda I E Yanda +ydd I L Eastern Yiddish +yde I L Yangum Dey +ydg I L Yidgha +ydk I L Yoidik +yds I L Yiddish Sign Language +yea I L Ravula +yec I L Yeniche +yee I L Yimas +yei I E Yeni +yej I L Yevanic +yel I L Yela +yer I L Tarok +yes I L Nyankpa +yet I L Yetfa +yeu I L Yerukula +yev I L Yapunda +yey I L Yeyi +yga I E Malyangapa +ygi I E Yiningayi +ygl I L Yangum Gel +ygm I L Yagomi +ygp I L Gepo +ygr I L Yagaria +ygu I L Yugul +ygw I L Yagwoia +yha I L Baha Buyang +yhd I L Judeo-Iraqi Arabic +yhl I L Hlepho Phowa +yia I L Yinggarda +yid yid yid yi M L Yiddish +yif I L Ache +yig I L Wusa Nasu +yih I L Western Yiddish +yii I L Yidiny +yij I L Yindjibarndi +yik I L Dongshanba Lalo +yil I E Yindjilandji +yim I L Yimchungru Naga +yin I L Yinchia +yip I L Pholo +yiq I L Miqie +yir I L North Awyu +yis I L Yis +yit I L Eastern Lalu +yiu I L Awu +yiv I L Northern Nisu +yix I L Axi Yi +yiz I L Azhe +yka I L Yakan +ykg I L Northern Yukaghir +yki I L Yoke +ykk I L Yakaikeke +ykl I L Khlula +ykm I L Kap +ykn I L Kua-nsi +yko I L Yasa +ykr I L Yekora +ykt I L Kathu +yku I L Kuamasi +yky I L Yakoma +yla I L Yaul +ylb I L Yaleba +yle I L Yele +ylg I L Yelogu +yli I L Angguruk Yali +yll I L Yil +ylm I L Limi +yln I L Langnian Buyang +ylo I L Naluo Yi +ylr I E Yalarnnga +ylu I L Aribwaung +yly I L Nyâlayu +ymb I L Yambes +ymc I L Southern Muji +ymd I L Muda +yme I E Yameo +ymg I L Yamongeri +ymh I L Mili +ymi I L Moji +ymk I L Makwe +yml I L Iamalele +ymm I L Maay +ymn I L Yamna +ymo I L Yangum Mon +ymp I L Yamap +ymq I L Qila Muji +ymr I L Malasar +yms I A Mysian +ymt I E Mator-Taygi-Karagas +ymx I L Northern Muji +ymz I L Muzi +yna I L Aluo +ynd I E Yandruwandha +yne I L Lang'e +yng I L Yango +ynh I L Yangho +ynk I L Naukan Yupik +ynl I L Yangulam +ynn I E Yana +yno I L Yong +ynq I L Yendang +yns I L Yansi +ynu I E Yahuna +yob I E Yoba +yog I L Yogad +yoi I L Yonaguni +yok I L Yokuts +yol I E Yola +yom I L Yombe +yon I L Yongkom +yor yor yor yo I L Yoruba +yot I L Yotti +yox I L Yoron +yoy I L Yoy +ypa I L Phala +ypb I L Labo Phowa +ypg I L Phola +yph I L Phupha +ypm I L Phuma +ypn I L Ani Phowa +ypo I L Alo Phola +ypp I L Phupa +ypz I L Phuza +yra I L Yerakai +yrb I L Yareba +yre I L Yaouré +yri I L Yarí +yrk I L Nenets +yrl I L Nhengatu +yrm I L Yirrk-Mel +yrn I L Yerong +yrs I L Yarsun +yrw I L Yarawata +yry I L Yarluyandi +ysc I E Yassic +ysd I L Samatao +ysg I L Sonaga +ysl I L Yugoslavian Sign Language +ysn I L Sani +yso I L Nisi (China) +ysp I L Southern Lolopo +ysr I E Sirenik Yupik +yss I L Yessan-Mayo +ysy I L Sanie +yta I L Talu +ytl I L Tanglang +ytp I L Thopho +ytw I L Yout Wam +yty I E Yatay +yua I L Yucateco +yub I E Yugambal +yuc I L Yuchi +yud I L Judeo-Tripolitanian Arabic +yue I L Yue Chinese +yuf I L Havasupai-Walapai-Yavapai +yug I E Yug +yui I L Yurutí +yuj I L Karkar-Yuri +yuk I E Yuki +yul I L Yulu +yum I L Quechan +yun I L Bena (Nigeria) +yup I L Yukpa +yuq I L Yuqui +yur I L Yurok +yut I L Yopno +yuu I L Yugh +yuw I L Yau (Morobe Province) +yux I L Southern Yukaghir +yuy I L East Yugur +yuz I L Yuracare +yva I L Yawa +yvt I E Yavitero +ywa I L Kalou +ywg I L Yinhawangka +ywl I L Western Lalu +ywn I L Yawanawa +ywq I L Wuding-Luquan Yi +ywr I L Yawuru +ywt I L Xishanba Lalo +ywu I L Wumeng Nasu +yww I E Yawarawarga +yxa I E Mayawali +yxg I E Yagara +yxl I E Yardliyawarra +yxm I E Yinwum +yxu I E Yuyu +yxy I E Yabula Yabula +yyr I E Yir Yoront +yyu I L Yau (Sandaun Province) +yyz I L Ayizi +yzg I L E'ma Buyang +yzk I L Zokhuo +zaa I L Sierra de Juárez Zapotec +zab I L San Juan Guelavía Zapotec +zac I L Ocotlán Zapotec +zad I L Cajonos Zapotec +zae I L Yareni Zapotec +zaf I L Ayoquesco Zapotec +zag I L Zaghawa +zah I L Zangwal +zai I L Isthmus Zapotec +zaj I L Zaramo +zak I L Zanaki +zal I L Zauzou +zam I L Miahuatlán Zapotec +zao I L Ozolotepec Zapotec +zap zap zap M L Zapotec +zaq I L Aloápam Zapotec +zar I L Rincón Zapotec +zas I L Santo Domingo Albarradas Zapotec +zat I L Tabaa Zapotec +zau I L Zangskari +zav I L Yatzachi Zapotec +zaw I L Mitla Zapotec +zax I L Xadani Zapotec +zay I L Zayse-Zergulla +zaz I L Zari +zbc I L Central Berawan +zbe I L East Berawan +zbl zbl zbl I C Blissymbols +zbt I L Batui +zbw I L West Berawan +zca I L Coatecas Altas Zapotec +zch I L Central Hongshuihe Zhuang +zdj I L Ngazidja Comorian +zea I L Zeeuws +zeg I L Zenag +zeh I L Eastern Hongshuihe Zhuang +zen zen zen I L Zenaga +zga I L Kinga +zgb I L Guibei Zhuang +zgh I L Standard Moroccan Tamazight +zgm I L Minz Zhuang +zgn I L Guibian Zhuang +zgr I L Magori +zha zha zha za M L Zhuang +zhb I L Zhaba +zhd I L Dai Zhuang +zhi I L Zhire +zhn I L Nong Zhuang +zho chi zho zh M L Chinese +zhw I L Zhoa +zia I L Zia +zib I L Zimbabwe Sign Language +zik I L Zimakani +zil I L Zialo +zim I L Mesme +zin I L Zinza +zir I E Ziriya +ziw I L Zigula +ziz I L Zizilivakan +zka I L Kaimbulawa +zkb I E Koibal +zkd I L Kadu +zkg I E Koguryo +zkh I E Khorezmian +zkk I E Karankawa +zkn I L Kanan +zko I E Kott +zkp I E São Paulo Kaingáng +zkr I L Zakhring +zkt I E Kitan +zku I E Kaurna +zkv I E Krevinian +zkz I E Khazar +zlj I L Liujiang Zhuang +zlm I L Malay (individual language) +zln I L Lianshan Zhuang +zlq I L Liuqian Zhuang +zma I L Manda (Australia) +zmb I L Zimba +zmc I E Margany +zmd I L Maridan +zme I E Mangerr +zmf I L Mfinu +zmg I L Marti Ke +zmh I E Makolkol +zmi I L Negeri Sembilan Malay +zmj I L Maridjabin +zmk I E Mandandanyi +zml I L Madngele +zmm I L Marimanindji +zmn I L Mbangwe +zmo I L Molo +zmp I L Mpuono +zmq I L Mituku +zmr I L Maranunggu +zms I L Mbesa +zmt I L Maringarr +zmu I E Muruwari +zmv I E Mbariman-Gudhinma +zmw I L Mbo (Democratic Republic of Congo) +zmx I L Bomitaba +zmy I L Mariyedi +zmz I L Mbandja +zna I L Zan Gula +zne I L Zande (individual language) +zng I L Mang +znk I E Manangkari +zns I L Mangas +zoc I L Copainalá Zoque +zoh I L Chimalapa Zoque +zom I L Zou +zoo I L Asunción Mixtepec Zapotec +zoq I L Tabasco Zoque +zor I L Rayón Zoque +zos I L Francisco León Zoque +zpa I L Lachiguiri Zapotec +zpb I L Yautepec Zapotec +zpc I L Choapan Zapotec +zpd I L Southeastern Ixtlán Zapotec +zpe I L Petapa Zapotec +zpf I L San Pedro Quiatoni Zapotec +zpg I L Guevea De Humboldt Zapotec +zph I L Totomachapan Zapotec +zpi I L Santa María Quiegolani Zapotec +zpj I L Quiavicuzas Zapotec +zpk I L Tlacolulita Zapotec +zpl I L Lachixío Zapotec +zpm I L Mixtepec Zapotec +zpn I L Santa Inés Yatzechi Zapotec +zpo I L Amatlán Zapotec +zpp I L El Alto Zapotec +zpq I L Zoogocho Zapotec +zpr I L Santiago Xanica Zapotec +zps I L Coatlán Zapotec +zpt I L San Vicente Coatlán Zapotec +zpu I L Yalálag Zapotec +zpv I L Chichicapan Zapotec +zpw I L Zaniza Zapotec +zpx I L San Baltazar Loxicha Zapotec +zpy I L Mazaltepec Zapotec +zpz I L Texmelucan Zapotec +zqe I L Qiubei Zhuang +zra I E Kara (Korea) +zrg I L Mirgan +zrn I L Zerenkel +zro I L Záparo +zrp I E Zarphatic +zrs I L Mairasi +zsa I L Sarasira +zsk I A Kaskean +zsl I L Zambian Sign Language +zsm I L Standard Malay +zsr I L Southern Rincon Zapotec +zsu I L Sukurum +zte I L Elotepec Zapotec +ztg I L Xanaguía Zapotec +ztl I L Lapaguía-Guivini Zapotec +ztm I L San Agustín Mixtepec Zapotec +ztn I L Santa Catarina Albarradas Zapotec +ztp I L Loxicha Zapotec +ztq I L Quioquitani-Quierí Zapotec +zts I L Tilquiapan Zapotec +ztt I L Tejalapan Zapotec +ztu I L Güilá Zapotec +ztx I L Zaachila Zapotec +zty I L Yatee Zapotec +zua I L Zeem +zuh I L Tokano +zul zul zul zu I L Zulu +zum I L Kumzari +zun zun zun I L Zuni +zuy I L Zumaya +zwa I L Zay +zxx zxx zxx S S No linguistic content +zyb I L Yongbei Zhuang +zyg I L Yang Zhuang +zyj I L Youjiang Zhuang +zyn I L Yongnan Zhuang +zyp I L Zyphe Chin +zza zza zza M L Zaza +zzj I L Zuojiang Zhuang \ No newline at end of file diff --git a/lib/babelfish/data/iso15924-utf8-20131012.txt b/lib/babelfish/data/iso15924-utf8-20131012.txt new file mode 100755 index 00000000..4b6ff471 --- /dev/null +++ b/lib/babelfish/data/iso15924-utf8-20131012.txt @@ -0,0 +1,176 @@ +# +# ISO 15924 - Codes for the representation of names of scripts +# Codes pour la représentation des noms d’écritures +# Format: +# Code;N°;English Name;Nom français;PVA;Date +# + +Afak;439;Afaka;afaka;;2010-12-21 +Aghb;239;Caucasian Albanian;aghbanien;;2012-10-16 +Ahom;338;Ahom, Tai Ahom;âhom;;2012-11-01 +Arab;160;Arabic;arabe;Arabic;2004-05-01 +Armi;124;Imperial Aramaic;araméen impérial;Imperial_Aramaic;2009-06-01 +Armn;230;Armenian;arménien;Armenian;2004-05-01 +Avst;134;Avestan;avestique;Avestan;2009-06-01 +Bali;360;Balinese;balinais;Balinese;2006-10-10 +Bamu;435;Bamum;bamoum;Bamum;2009-06-01 +Bass;259;Bassa Vah;bassa;;2010-03-26 +Batk;365;Batak;batik;Batak;2010-07-23 +Beng;325;Bengali;bengalî;Bengali;2004-05-01 +Blis;550;Blissymbols;symboles Bliss;;2004-05-01 +Bopo;285;Bopomofo;bopomofo;Bopomofo;2004-05-01 +Brah;300;Brahmi;brahma;Brahmi;2010-07-23 +Brai;570;Braille;braille;Braille;2004-05-01 +Bugi;367;Buginese;bouguis;Buginese;2006-06-21 +Buhd;372;Buhid;bouhide;Buhid;2004-05-01 +Cakm;349;Chakma;chakma;Chakma;2012-02-06 +Cans;440;Unified Canadian Aboriginal Syllabics;syllabaire autochtone canadien unifié;Canadian_Aboriginal;2004-05-29 +Cari;201;Carian;carien;Carian;2007-07-02 +Cham;358;Cham;cham (čam, tcham);Cham;2009-11-11 +Cher;445;Cherokee;tchérokî;Cherokee;2004-05-01 +Cirt;291;Cirth;cirth;;2004-05-01 +Copt;204;Coptic;copte;Coptic;2006-06-21 +Cprt;403;Cypriot;syllabaire chypriote;Cypriot;2004-05-01 +Cyrl;220;Cyrillic;cyrillique;Cyrillic;2004-05-01 +Cyrs;221;Cyrillic (Old Church Slavonic variant);cyrillique (variante slavonne);;2004-05-01 +Deva;315;Devanagari (Nagari);dévanâgarî;Devanagari;2004-05-01 +Dsrt;250;Deseret (Mormon);déseret (mormon);Deseret;2004-05-01 +Dupl;755;Duployan shorthand, Duployan stenography;sténographie Duployé;;2010-07-18 +Egyd;070;Egyptian demotic;démotique égyptien;;2004-05-01 +Egyh;060;Egyptian hieratic;hiératique égyptien;;2004-05-01 +Egyp;050;Egyptian hieroglyphs;hiéroglyphes égyptiens;Egyptian_Hieroglyphs;2009-06-01 +Elba;226;Elbasan;elbasan;;2010-07-18 +Ethi;430;Ethiopic (Geʻez);éthiopien (geʻez, guèze);Ethiopic;2004-10-25 +Geor;240;Georgian (Mkhedruli);géorgien (mkhédrouli);Georgian;2004-05-29 +Geok;241;Khutsuri (Asomtavruli and Nuskhuri);khoutsouri (assomtavrouli et nouskhouri);Georgian;2012-10-16 +Glag;225;Glagolitic;glagolitique;Glagolitic;2006-06-21 +Goth;206;Gothic;gotique;Gothic;2004-05-01 +Gran;343;Grantha;grantha;;2009-11-11 +Grek;200;Greek;grec;Greek;2004-05-01 +Gujr;320;Gujarati;goudjarâtî (gujrâtî);Gujarati;2004-05-01 +Guru;310;Gurmukhi;gourmoukhî;Gurmukhi;2004-05-01 +Hang;286;Hangul (Hangŭl, Hangeul);hangûl (hangŭl, hangeul);Hangul;2004-05-29 +Hani;500;Han (Hanzi, Kanji, Hanja);idéogrammes han (sinogrammes);Han;2009-02-23 +Hano;371;Hanunoo (Hanunóo);hanounóo;Hanunoo;2004-05-29 +Hans;501;Han (Simplified variant);idéogrammes han (variante simplifiée);;2004-05-29 +Hant;502;Han (Traditional variant);idéogrammes han (variante traditionnelle);;2004-05-29 +Hatr;127;Hatran;hatrénien;;2012-11-01 +Hebr;125;Hebrew;hébreu;Hebrew;2004-05-01 +Hira;410;Hiragana;hiragana;Hiragana;2004-05-01 +Hluw;080;Anatolian Hieroglyphs (Luwian Hieroglyphs, Hittite Hieroglyphs);hiéroglyphes anatoliens (hiéroglyphes louvites, hiéroglyphes hittites);;2011-12-09 +Hmng;450;Pahawh Hmong;pahawh hmong;;2004-05-01 +Hrkt;412;Japanese syllabaries (alias for Hiragana + Katakana);syllabaires japonais (alias pour hiragana + katakana);Katakana_Or_Hiragana;2011-06-21 +Hung;176;Old Hungarian (Hungarian Runic);runes hongroises (ancien hongrois);;2012-10-16 +Inds;610;Indus (Harappan);indus;;2004-05-01 +Ital;210;Old Italic (Etruscan, Oscan, etc.);ancien italique (étrusque, osque, etc.);Old_Italic;2004-05-29 +Java;361;Javanese;javanais;Javanese;2009-06-01 +Jpan;413;Japanese (alias for Han + Hiragana + Katakana);japonais (alias pour han + hiragana + katakana);;2006-06-21 +Jurc;510;Jurchen;jurchen;;2010-12-21 +Kali;357;Kayah Li;kayah li;Kayah_Li;2007-07-02 +Kana;411;Katakana;katakana;Katakana;2004-05-01 +Khar;305;Kharoshthi;kharochthî;Kharoshthi;2006-06-21 +Khmr;355;Khmer;khmer;Khmer;2004-05-29 +Khoj;322;Khojki;khojkî;;2011-06-21 +Knda;345;Kannada;kannara (canara);Kannada;2004-05-29 +Kore;287;Korean (alias for Hangul + Han);coréen (alias pour hangûl + han);;2007-06-13 +Kpel;436;Kpelle;kpèllé;;2010-03-26 +Kthi;317;Kaithi;kaithî;Kaithi;2009-06-01 +Lana;351;Tai Tham (Lanna);taï tham (lanna);Tai_Tham;2009-06-01 +Laoo;356;Lao;laotien;Lao;2004-05-01 +Latf;217;Latin (Fraktur variant);latin (variante brisée);;2004-05-01 +Latg;216;Latin (Gaelic variant);latin (variante gaélique);;2004-05-01 +Latn;215;Latin;latin;Latin;2004-05-01 +Lepc;335;Lepcha (Róng);lepcha (róng);Lepcha;2007-07-02 +Limb;336;Limbu;limbou;Limbu;2004-05-29 +Lina;400;Linear A;linéaire A;;2004-05-01 +Linb;401;Linear B;linéaire B;Linear_B;2004-05-29 +Lisu;399;Lisu (Fraser);lisu (Fraser);Lisu;2009-06-01 +Loma;437;Loma;loma;;2010-03-26 +Lyci;202;Lycian;lycien;Lycian;2007-07-02 +Lydi;116;Lydian;lydien;Lydian;2007-07-02 +Mahj;314;Mahajani;mahâjanî;;2012-10-16 +Mand;140;Mandaic, Mandaean;mandéen;Mandaic;2010-07-23 +Mani;139;Manichaean;manichéen;;2007-07-15 +Maya;090;Mayan hieroglyphs;hiéroglyphes mayas;;2004-05-01 +Mend;438;Mende Kikakui;mendé kikakui;;2013-10-12 +Merc;101;Meroitic Cursive;cursif méroïtique;Meroitic_Cursive;2012-02-06 +Mero;100;Meroitic Hieroglyphs;hiéroglyphes méroïtiques;Meroitic_Hieroglyphs;2012-02-06 +Mlym;347;Malayalam;malayâlam;Malayalam;2004-05-01 +Modi;323;Modi, Moḍī;modî;;2013-10-12 +Moon;218;Moon (Moon code, Moon script, Moon type);écriture Moon;;2006-12-11 +Mong;145;Mongolian;mongol;Mongolian;2004-05-01 +Mroo;199;Mro, Mru;mro;;2010-12-21 +Mtei;337;Meitei Mayek (Meithei, Meetei);meitei mayek;Meetei_Mayek;2009-06-01 +Mult;323; Multani;multanî;;2012-11-01 +Mymr;350;Myanmar (Burmese);birman;Myanmar;2004-05-01 +Narb;106;Old North Arabian (Ancient North Arabian);nord-arabique;;2010-03-26 +Nbat;159;Nabataean;nabatéen;;2010-03-26 +Nkgb;420;Nakhi Geba ('Na-'Khi ²Ggŏ-¹baw, Naxi Geba);nakhi géba;;2009-02-23 +Nkoo;165;N’Ko;n’ko;Nko;2006-10-10 +Nshu;499;Nüshu;nüshu;;2010-12-21 +Ogam;212;Ogham;ogam;Ogham;2004-05-01 +Olck;261;Ol Chiki (Ol Cemet’, Ol, Santali);ol tchiki;Ol_Chiki;2007-07-02 +Orkh;175;Old Turkic, Orkhon Runic;orkhon;Old_Turkic;2009-06-01 +Orya;327;Oriya;oriyâ;Oriya;2004-05-01 +Osma;260;Osmanya;osmanais;Osmanya;2004-05-01 +Palm;126;Palmyrene;palmyrénien;;2010-03-26 +Pauc;263;Pau Cin Hau;paou chin haou;;2013-10-12 +Perm;227;Old Permic;ancien permien;;2004-05-01 +Phag;331;Phags-pa;’phags pa;Phags_Pa;2006-10-10 +Phli;131;Inscriptional Pahlavi;pehlevi des inscriptions;Inscriptional_Pahlavi;2009-06-01 +Phlp;132;Psalter Pahlavi;pehlevi des psautiers;;2007-11-26 +Phlv;133;Book Pahlavi;pehlevi des livres;;2007-07-15 +Phnx;115;Phoenician;phénicien;Phoenician;2006-10-10 +Plrd;282;Miao (Pollard);miao (Pollard);Miao;2012-02-06 +Prti;130;Inscriptional Parthian;parthe des inscriptions;Inscriptional_Parthian;2009-06-01 +Qaaa;900;Reserved for private use (start);réservé à l’usage privé (début);;2004-05-29 +Qabx;949;Reserved for private use (end);réservé à l’usage privé (fin);;2004-05-29 +Rjng;363;Rejang (Redjang, Kaganga);redjang (kaganga);Rejang;2009-02-23 +Roro;620;Rongorongo;rongorongo;;2004-05-01 +Runr;211;Runic;runique;Runic;2004-05-01 +Samr;123;Samaritan;samaritain;Samaritan;2009-06-01 +Sara;292;Sarati;sarati;;2004-05-29 +Sarb;105;Old South Arabian;sud-arabique, himyarite;Old_South_Arabian;2009-06-01 +Saur;344;Saurashtra;saurachtra;Saurashtra;2007-07-02 +Sgnw;095;SignWriting;SignÉcriture, SignWriting;;2006-10-10 +Shaw;281;Shavian (Shaw);shavien (Shaw);Shavian;2004-05-01 +Shrd;319;Sharada, Śāradā;charada, shard;Sharada;2012-02-06 +Sidd;302;Siddham, Siddhaṃ, Siddhamātṛkā;siddham;;2013-10-12 +Sind;318;Khudawadi, Sindhi;khoudawadî, sindhî;;2010-12-21 +Sinh;348;Sinhala;singhalais;Sinhala;2004-05-01 +Sora;398;Sora Sompeng;sora sompeng;Sora_Sompeng;2012-02-06 +Sund;362;Sundanese;sundanais;Sundanese;2007-07-02 +Sylo;316;Syloti Nagri;sylotî nâgrî;Syloti_Nagri;2006-06-21 +Syrc;135;Syriac;syriaque;Syriac;2004-05-01 +Syre;138;Syriac (Estrangelo variant);syriaque (variante estranghélo);;2004-05-01 +Syrj;137;Syriac (Western variant);syriaque (variante occidentale);;2004-05-01 +Syrn;136;Syriac (Eastern variant);syriaque (variante orientale);;2004-05-01 +Tagb;373;Tagbanwa;tagbanoua;Tagbanwa;2004-05-01 +Takr;321;Takri, Ṭākrī, Ṭāṅkrī;tâkrî;Takri;2012-02-06 +Tale;353;Tai Le;taï-le;Tai_Le;2004-10-25 +Talu;354;New Tai Lue;nouveau taï-lue;New_Tai_Lue;2006-06-21 +Taml;346;Tamil;tamoul;Tamil;2004-05-01 +Tang;520;Tangut;tangoute;;2010-12-21 +Tavt;359;Tai Viet;taï viêt;Tai_Viet;2009-06-01 +Telu;340;Telugu;télougou;Telugu;2004-05-01 +Teng;290;Tengwar;tengwar;;2004-05-01 +Tfng;120;Tifinagh (Berber);tifinagh (berbère);Tifinagh;2006-06-21 +Tglg;370;Tagalog (Baybayin, Alibata);tagal (baybayin, alibata);Tagalog;2009-02-23 +Thaa;170;Thaana;thâna;Thaana;2004-05-01 +Thai;352;Thai;thaï;Thai;2004-05-01 +Tibt;330;Tibetan;tibétain;Tibetan;2004-05-01 +Tirh;326;Tirhuta;tirhouta;;2011-12-09 +Ugar;040;Ugaritic;ougaritique;Ugaritic;2004-05-01 +Vaii;470;Vai;vaï;Vai;2007-07-02 +Visp;280;Visible Speech;parole visible;;2004-05-01 +Wara;262;Warang Citi (Varang Kshiti);warang citi;;2009-11-11 +Wole;480;Woleai;woléaï;;2010-12-21 +Xpeo;030;Old Persian;cunéiforme persépolitain;Old_Persian;2006-06-21 +Xsux;020;Cuneiform, Sumero-Akkadian;cunéiforme suméro-akkadien;Cuneiform;2006-10-10 +Yiii;460;Yi;yi;Yi;2004-05-01 +Zinh;994;Code for inherited script;codet pour écriture héritée;Inherited;2009-02-23 +Zmth;995;Mathematical notation;notation mathématique;;2007-11-26 +Zsym;996;Symbols;symboles;;2007-11-26 +Zxxx;997;Code for unwritten documents;codet pour les documents non écrits;;2011-06-21 +Zyyy;998;Code for undetermined script;codet pour écriture indéterminée;Common;2004-05-29 +Zzzz;999;Code for uncoded script;codet pour écriture non codée;Unknown;2006-10-10 diff --git a/lib/babelfish/data/opensubtitles_languages.txt b/lib/babelfish/data/opensubtitles_languages.txt new file mode 100755 index 00000000..1bd35063 --- /dev/null +++ b/lib/babelfish/data/opensubtitles_languages.txt @@ -0,0 +1,474 @@ +IdSubLanguage ISO639 LanguageName UploadEnabled WebEnabled +aar aa Afar, afar 0 0 +abk ab Abkhazian 0 0 +ace Achinese 0 0 +ach Acoli 0 0 +ada Adangme 0 0 +ady adyghé 0 0 +afa Afro-Asiatic (Other) 0 0 +afh Afrihili 0 0 +afr af Afrikaans 1 0 +ain Ainu 0 0 +aka ak Akan 0 0 +akk Akkadian 0 0 +alb sq Albanian 1 1 +ale Aleut 0 0 +alg Algonquian languages 0 0 +alt Southern Altai 0 0 +amh am Amharic 0 0 +ang English, Old (ca.450-1100) 0 0 +apa Apache languages 0 0 +ara ar Arabic 1 1 +arc Aramaic 0 0 +arg an Aragonese 0 0 +arm hy Armenian 1 0 +arn Araucanian 0 0 +arp Arapaho 0 0 +art Artificial (Other) 0 0 +arw Arawak 0 0 +asm as Assamese 0 0 +ast Asturian, Bable 0 0 +ath Athapascan languages 0 0 +aus Australian languages 0 0 +ava av Avaric 0 0 +ave ae Avestan 0 0 +awa Awadhi 0 0 +aym ay Aymara 0 0 +aze az Azerbaijani 0 0 +bad Banda 0 0 +bai Bamileke languages 0 0 +bak ba Bashkir 0 0 +bal Baluchi 0 0 +bam bm Bambara 0 0 +ban Balinese 0 0 +baq eu Basque 1 1 +bas Basa 0 0 +bat Baltic (Other) 0 0 +bej Beja 0 0 +bel be Belarusian 0 0 +bem Bemba 0 0 +ben bn Bengali 1 0 +ber Berber (Other) 0 0 +bho Bhojpuri 0 0 +bih bh Bihari 0 0 +bik Bikol 0 0 +bin Bini 0 0 +bis bi Bislama 0 0 +bla Siksika 0 0 +bnt Bantu (Other) 0 0 +bos bs Bosnian 1 0 +bra Braj 0 0 +bre br Breton 1 0 +btk Batak (Indonesia) 0 0 +bua Buriat 0 0 +bug Buginese 0 0 +bul bg Bulgarian 1 1 +bur my Burmese 1 0 +byn Blin 0 0 +cad Caddo 0 0 +cai Central American Indian (Other) 0 0 +car Carib 0 0 +cat ca Catalan 1 1 +cau Caucasian (Other) 0 0 +ceb Cebuano 0 0 +cel Celtic (Other) 0 0 +cha ch Chamorro 0 0 +chb Chibcha 0 0 +che ce Chechen 0 0 +chg Chagatai 0 0 +chi zh Chinese 1 1 +chk Chuukese 0 0 +chm Mari 0 0 +chn Chinook jargon 0 0 +cho Choctaw 0 0 +chp Chipewyan 0 0 +chr Cherokee 0 0 +chu cu Church Slavic 0 0 +chv cv Chuvash 0 0 +chy Cheyenne 0 0 +cmc Chamic languages 0 0 +cop Coptic 0 0 +cor kw Cornish 0 0 +cos co Corsican 0 0 +cpe Creoles and pidgins, English based (Other) 0 0 +cpf Creoles and pidgins, French-based (Other) 0 0 +cpp Creoles and pidgins, Portuguese-based (Other) 0 0 +cre cr Cree 0 0 +crh Crimean Tatar 0 0 +crp Creoles and pidgins (Other) 0 0 +csb Kashubian 0 0 +cus Cushitic (Other)' couchitiques, autres langues 0 0 +cze cs Czech 1 1 +dak Dakota 0 0 +dan da Danish 1 1 +dar Dargwa 0 0 +day Dayak 0 0 +del Delaware 0 0 +den Slave (Athapascan) 0 0 +dgr Dogrib 0 0 +din Dinka 0 0 +div dv Divehi 0 0 +doi Dogri 0 0 +dra Dravidian (Other) 0 0 +dua Duala 0 0 +dum Dutch, Middle (ca.1050-1350) 0 0 +dut nl Dutch 1 1 +dyu Dyula 0 0 +dzo dz Dzongkha 0 0 +efi Efik 0 0 +egy Egyptian (Ancient) 0 0 +eka Ekajuk 0 0 +elx Elamite 0 0 +eng en English 1 1 +enm English, Middle (1100-1500) 0 0 +epo eo Esperanto 1 0 +est et Estonian 1 1 +ewe ee Ewe 0 0 +ewo Ewondo 0 0 +fan Fang 0 0 +fao fo Faroese 0 0 +fat Fanti 0 0 +fij fj Fijian 0 0 +fil Filipino 0 0 +fin fi Finnish 1 1 +fiu Finno-Ugrian (Other) 0 0 +fon Fon 0 0 +fre fr French 1 1 +frm French, Middle (ca.1400-1600) 0 0 +fro French, Old (842-ca.1400) 0 0 +fry fy Frisian 0 0 +ful ff Fulah 0 0 +fur Friulian 0 0 +gaa Ga 0 0 +gay Gayo 0 0 +gba Gbaya 0 0 +gem Germanic (Other) 0 0 +geo ka Georgian 1 1 +ger de German 1 1 +gez Geez 0 0 +gil Gilbertese 0 0 +gla gd Gaelic 0 0 +gle ga Irish 0 0 +glg gl Galician 1 1 +glv gv Manx 0 0 +gmh German, Middle High (ca.1050-1500) 0 0 +goh German, Old High (ca.750-1050) 0 0 +gon Gondi 0 0 +gor Gorontalo 0 0 +got Gothic 0 0 +grb Grebo 0 0 +grc Greek, Ancient (to 1453) 0 0 +ell el Greek 1 1 +grn gn Guarani 0 0 +guj gu Gujarati 0 0 +gwi Gwich´in 0 0 +hai Haida 0 0 +hat ht Haitian 0 0 +hau ha Hausa 0 0 +haw Hawaiian 0 0 +heb he Hebrew 1 1 +her hz Herero 0 0 +hil Hiligaynon 0 0 +him Himachali 0 0 +hin hi Hindi 1 1 +hit Hittite 0 0 +hmn Hmong 0 0 +hmo ho Hiri Motu 0 0 +hrv hr Croatian 1 1 +hun hu Hungarian 1 1 +hup Hupa 0 0 +iba Iban 0 0 +ibo ig Igbo 0 0 +ice is Icelandic 1 1 +ido io Ido 0 0 +iii ii Sichuan Yi 0 0 +ijo Ijo 0 0 +iku iu Inuktitut 0 0 +ile ie Interlingue 0 0 +ilo Iloko 0 0 +ina ia Interlingua (International Auxiliary Language Asso 0 0 +inc Indic (Other) 0 0 +ind id Indonesian 1 1 +ine Indo-European (Other) 0 0 +inh Ingush 0 0 +ipk ik Inupiaq 0 0 +ira Iranian (Other) 0 0 +iro Iroquoian languages 0 0 +ita it Italian 1 1 +jav jv Javanese 0 0 +jpn ja Japanese 1 1 +jpr Judeo-Persian 0 0 +jrb Judeo-Arabic 0 0 +kaa Kara-Kalpak 0 0 +kab Kabyle 0 0 +kac Kachin 0 0 +kal kl Kalaallisut 0 0 +kam Kamba 0 0 +kan kn Kannada 0 0 +kar Karen 0 0 +kas ks Kashmiri 0 0 +kau kr Kanuri 0 0 +kaw Kawi 0 0 +kaz kk Kazakh 1 0 +kbd Kabardian 0 0 +kha Khasi 0 0 +khi Khoisan (Other) 0 0 +khm km Khmer 1 1 +kho Khotanese 0 0 +kik ki Kikuyu 0 0 +kin rw Kinyarwanda 0 0 +kir ky Kirghiz 0 0 +kmb Kimbundu 0 0 +kok Konkani 0 0 +kom kv Komi 0 0 +kon kg Kongo 0 0 +kor ko Korean 1 1 +kos Kosraean 0 0 +kpe Kpelle 0 0 +krc Karachay-Balkar 0 0 +kro Kru 0 0 +kru Kurukh 0 0 +kua kj Kuanyama 0 0 +kum Kumyk 0 0 +kur ku Kurdish 0 0 +kut Kutenai 0 0 +lad Ladino 0 0 +lah Lahnda 0 0 +lam Lamba 0 0 +lao lo Lao 0 0 +lat la Latin 0 0 +lav lv Latvian 1 0 +lez Lezghian 0 0 +lim li Limburgan 0 0 +lin ln Lingala 0 0 +lit lt Lithuanian 1 0 +lol Mongo 0 0 +loz Lozi 0 0 +ltz lb Luxembourgish 1 0 +lua Luba-Lulua 0 0 +lub lu Luba-Katanga 0 0 +lug lg Ganda 0 0 +lui Luiseno 0 0 +lun Lunda 0 0 +luo Luo (Kenya and Tanzania) 0 0 +lus lushai 0 0 +mac mk Macedonian 1 1 +mad Madurese 0 0 +mag Magahi 0 0 +mah mh Marshallese 0 0 +mai Maithili 0 0 +mak Makasar 0 0 +mal ml Malayalam 1 0 +man Mandingo 0 0 +mao mi Maori 0 0 +map Austronesian (Other) 0 0 +mar mr Marathi 0 0 +mas Masai 0 0 +may ms Malay 1 1 +mdf Moksha 0 0 +mdr Mandar 0 0 +men Mende 0 0 +mga Irish, Middle (900-1200) 0 0 +mic Mi'kmaq 0 0 +min Minangkabau 0 0 +mis Miscellaneous languages 0 0 +mkh Mon-Khmer (Other) 0 0 +mlg mg Malagasy 0 0 +mlt mt Maltese 0 0 +mnc Manchu 0 0 +mni Manipuri 0 0 +mno Manobo languages 0 0 +moh Mohawk 0 0 +mol mo Moldavian 0 0 +mon mn Mongolian 1 0 +mos Mossi 0 0 +mwl Mirandese 0 0 +mul Multiple languages 0 0 +mun Munda languages 0 0 +mus Creek 0 0 +mwr Marwari 0 0 +myn Mayan languages 0 0 +myv Erzya 0 0 +nah Nahuatl 0 0 +nai North American Indian 0 0 +nap Neapolitan 0 0 +nau na Nauru 0 0 +nav nv Navajo 0 0 +nbl nr Ndebele, South 0 0 +nde nd Ndebele, North 0 0 +ndo ng Ndonga 0 0 +nds Low German 0 0 +nep ne Nepali 0 0 +new Nepal Bhasa 0 0 +nia Nias 0 0 +nic Niger-Kordofanian (Other) 0 0 +niu Niuean 0 0 +nno nn Norwegian Nynorsk 0 0 +nob nb Norwegian Bokmal 0 0 +nog Nogai 0 0 +non Norse, Old 0 0 +nor no Norwegian 1 1 +nso Northern Sotho 0 0 +nub Nubian languages 0 0 +nwc Classical Newari 0 0 +nya ny Chichewa 0 0 +nym Nyamwezi 0 0 +nyn Nyankole 0 0 +nyo Nyoro 0 0 +nzi Nzima 0 0 +oci oc Occitan 1 1 +oji oj Ojibwa 0 0 +ori or Oriya 0 0 +orm om Oromo 0 0 +osa Osage 0 0 +oss os Ossetian 0 0 +ota Turkish, Ottoman (1500-1928) 0 0 +oto Otomian languages 0 0 +paa Papuan (Other) 0 0 +pag Pangasinan 0 0 +pal Pahlavi 0 0 +pam Pampanga 0 0 +pan pa Panjabi 0 0 +pap Papiamento 0 0 +pau Palauan 0 0 +peo Persian, Old (ca.600-400 B.C.) 0 0 +per fa Persian 1 1 +phi Philippine (Other) 0 0 +phn Phoenician 0 0 +pli pi Pali 0 0 +pol pl Polish 1 1 +pon Pohnpeian 0 0 +por pt Portuguese 1 1 +pra Prakrit languages 0 0 +pro Provençal, Old (to 1500) 0 0 +pus ps Pushto 0 0 +que qu Quechua 0 0 +raj Rajasthani 0 0 +rap Rapanui 0 0 +rar Rarotongan 0 0 +roa Romance (Other) 0 0 +roh rm Raeto-Romance 0 0 +rom Romany 0 0 +run rn Rundi 0 0 +rup Aromanian 0 0 +rus ru Russian 1 1 +sad Sandawe 0 0 +sag sg Sango 0 0 +sah Yakut 0 0 +sai South American Indian (Other) 0 0 +sal Salishan languages 0 0 +sam Samaritan Aramaic 0 0 +san sa Sanskrit 0 0 +sas Sasak 0 0 +sat Santali 0 0 +scc sr Serbian 1 1 +scn Sicilian 0 0 +sco Scots 0 0 +sel Selkup 0 0 +sem Semitic (Other) 0 0 +sga Irish, Old (to 900) 0 0 +sgn Sign Languages 0 0 +shn Shan 0 0 +sid Sidamo 0 0 +sin si Sinhalese 1 1 +sio Siouan languages 0 0 +sit Sino-Tibetan (Other) 0 0 +sla Slavic (Other) 0 0 +slo sk Slovak 1 1 +slv sl Slovenian 1 1 +sma Southern Sami 0 0 +sme se Northern Sami 0 0 +smi Sami languages (Other) 0 0 +smj Lule Sami 0 0 +smn Inari Sami 0 0 +smo sm Samoan 0 0 +sms Skolt Sami 0 0 +sna sn Shona 0 0 +snd sd Sindhi 0 0 +snk Soninke 0 0 +sog Sogdian 0 0 +som so Somali 0 0 +son Songhai 0 0 +sot st Sotho, Southern 0 0 +spa es Spanish 1 1 +srd sc Sardinian 0 0 +srr Serer 0 0 +ssa Nilo-Saharan (Other) 0 0 +ssw ss Swati 0 0 +suk Sukuma 0 0 +sun su Sundanese 0 0 +sus Susu 0 0 +sux Sumerian 0 0 +swa sw Swahili 1 0 +swe sv Swedish 1 1 +syr Syriac 1 0 +tah ty Tahitian 0 0 +tai Tai (Other) 0 0 +tam ta Tamil 1 0 +tat tt Tatar 0 0 +tel te Telugu 1 0 +tem Timne 0 0 +ter Tereno 0 0 +tet Tetum 0 0 +tgk tg Tajik 0 0 +tgl tl Tagalog 1 1 +tha th Thai 1 1 +tib bo Tibetan 0 0 +tig Tigre 0 0 +tir ti Tigrinya 0 0 +tiv Tiv 0 0 +tkl Tokelau 0 0 +tlh Klingon 0 0 +tli Tlingit 0 0 +tmh Tamashek 0 0 +tog Tonga (Nyasa) 0 0 +ton to Tonga (Tonga Islands) 0 0 +tpi Tok Pisin 0 0 +tsi Tsimshian 0 0 +tsn tn Tswana 0 0 +tso ts Tsonga 0 0 +tuk tk Turkmen 0 0 +tum Tumbuka 0 0 +tup Tupi languages 0 0 +tur tr Turkish 1 1 +tut Altaic (Other) 0 0 +tvl Tuvalu 0 0 +twi tw Twi 0 0 +tyv Tuvinian 0 0 +udm Udmurt 0 0 +uga Ugaritic 0 0 +uig ug Uighur 0 0 +ukr uk Ukrainian 1 1 +umb Umbundu 0 0 +und Undetermined 0 0 +urd ur Urdu 1 0 +uzb uz Uzbek 0 0 +vai Vai 0 0 +ven ve Venda 0 0 +vie vi Vietnamese 1 1 +vol vo Volapük 0 0 +vot Votic 0 0 +wak Wakashan languages 0 0 +wal Walamo 0 0 +war Waray 0 0 +was Washo 0 0 +wel cy Welsh 0 0 +wen Sorbian languages 0 0 +wln wa Walloon 0 0 +wol wo Wolof 0 0 +xal Kalmyk 0 0 +xho xh Xhosa 0 0 +yao Yao 0 0 +yap Yapese 0 0 +yid yi Yiddish 0 0 +yor yo Yoruba 0 0 +ypk Yupik languages 0 0 +zap Zapotec 0 0 +zen Zenaga 0 0 +zha za Zhuang 0 0 +znd Zande 0 0 +zul zu Zulu 0 0 +zun Zuni 0 0 +rum ro Romanian 1 1 +pob pb Brazilian 1 1 +mne Montenegrin 1 0 diff --git a/lib/babelfish/exceptions.py b/lib/babelfish/exceptions.py new file mode 100755 index 00000000..bbc6efe3 --- /dev/null +++ b/lib/babelfish/exceptions.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +from __future__ import unicode_literals + + +class Error(Exception): + """Base class for all exceptions in babelfish""" + pass + + +class LanguageError(Error, AttributeError): + """Base class for all language exceptions in babelfish""" + pass + + +class LanguageConvertError(LanguageError): + """Exception raised by converters when :meth:`~babelfish.converters.LanguageConverter.convert` fails + + :param string alpha3: alpha3 code that failed conversion + :param country: country code that failed conversion, if any + :type country: string or None + :param script: script code that failed conversion, if any + :type script: string or None + + """ + def __init__(self, alpha3, country=None, script=None): + self.alpha3 = alpha3 + self.country = country + self.script = script + + def __str__(self): + s = self.alpha3 + if self.country is not None: + s += '-' + self.country + if self.script is not None: + s += '-' + self.script + return s + + +class LanguageReverseError(LanguageError): + """Exception raised by converters when :meth:`~babelfish.converters.LanguageReverseConverter.reverse` fails + + :param string code: code that failed reverse conversion + + """ + def __init__(self, code): + self.code = code + + def __str__(self): + return repr(self.code) + + +class CountryError(Error, AttributeError): + """Base class for all country exceptions in babelfish""" + pass + + +class CountryConvertError(CountryError): + """Exception raised by converters when :meth:`~babelfish.converters.CountryConverter.convert` fails + + :param string alpha2: alpha2 code that failed conversion + + """ + def __init__(self, alpha2): + self.alpha2 = alpha2 + + def __str__(self): + return self.alpha2 + + +class CountryReverseError(CountryError): + """Exception raised by converters when :meth:`~babelfish.converters.CountryReverseConverter.reverse` fails + + :param string code: code that failed reverse conversion + + """ + def __init__(self, code): + self.code = code + + def __str__(self): + return repr(self.code) diff --git a/lib/babelfish/language.py b/lib/babelfish/language.py new file mode 100755 index 00000000..9b5e7825 --- /dev/null +++ b/lib/babelfish/language.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +from __future__ import unicode_literals +from collections import namedtuple +from functools import partial +import os +# from pkg_resources import resource_stream # @UnresolvedImport +from .converters import ConverterManager +from .country import Country +from .exceptions import LanguageConvertError +from .script import Script +from . import basestr + + +LANGUAGES = set() +LANGUAGE_MATRIX = [] + +#: The namedtuple used in the :data:`LANGUAGE_MATRIX` +IsoLanguage = namedtuple('IsoLanguage', ['alpha3', 'alpha3b', 'alpha3t', 'alpha2', 'scope', 'type', 'name', 'comment']) + +f = open(os.path.join(os.path.dirname(__file__), 'data/iso-639-3.tab')) +f.readline() +for l in f: + iso_language = IsoLanguage(*l.decode('utf-8').split('\t')) + LANGUAGES.add(iso_language.alpha3) + LANGUAGE_MATRIX.append(iso_language) +f.close() + + +class LanguageConverterManager(ConverterManager): + """:class:`~babelfish.converters.ConverterManager` for language converters""" + entry_point = 'babelfish.language_converters' + internal_converters = ['alpha2 = babelfish.converters.alpha2:Alpha2Converter', + 'alpha3b = babelfish.converters.alpha3b:Alpha3BConverter', + 'alpha3t = babelfish.converters.alpha3t:Alpha3TConverter', + 'name = babelfish.converters.name:NameConverter', + 'scope = babelfish.converters.scope:ScopeConverter', + 'type = babelfish.converters.type:LanguageTypeConverter', + 'opensubtitles = babelfish.converters.opensubtitles:OpenSubtitlesConverter'] + +language_converters = LanguageConverterManager() + + +class LanguageMeta(type): + """The :class:`Language` metaclass + + Dynamically redirect :meth:`Language.frommycode` to :meth:`Language.fromcode` with the ``mycode`` `converter` + + """ + def __getattr__(cls, name): + if name.startswith('from'): + return partial(cls.fromcode, converter=name[4:]) + return type.__getattribute__(cls, name) + + +class Language(LanguageMeta(str('LanguageBase'), (object,), {})): + """A human language + + A human language is composed of a language part following the ISO-639 + standard and can be country-specific when a :class:`~babelfish.country.Country` + is specified. + + The :class:`Language` is extensible with custom converters (see :ref:`custom_converters`) + + :param string language: the language as a 3-letter ISO-639-3 code + :param country: the country (if any) as a 2-letter ISO-3166 code or :class:`~babelfish.country.Country` instance + :type country: string or :class:`~babelfish.country.Country` or None + :param script: the script (if any) as a 4-letter ISO-15924 code or :class:`~babelfish.script.Script` instance + :type script: string or :class:`~babelfish.script.Script` or None + :param unknown: the unknown language as a three-letters ISO-639-3 code to use as fallback + :type unknown: string or None + :raise: ValueError if the language could not be recognized and `unknown` is ``None`` + + """ + def __init__(self, language, country=None, script=None, unknown=None): + if unknown is not None and language not in LANGUAGES: + language = unknown + if language not in LANGUAGES: + raise ValueError('%r is not a valid language' % language) + self.alpha3 = language + self.country = None + if isinstance(country, Country): + self.country = country + elif country is None: + self.country = None + else: + self.country = Country(country) + self.script = None + if isinstance(script, Script): + self.script = script + elif script is None: + self.script = None + else: + self.script = Script(script) + + @classmethod + def fromcode(cls, code, converter): + """Create a :class:`Language` by its `code` using `converter` to + :meth:`~babelfish.converters.LanguageReverseConverter.reverse` it + + :param string code: the code to reverse + :param string converter: name of the :class:`~babelfish.converters.LanguageReverseConverter` to use + :return: the corresponding :class:`Language` instance + :rtype: :class:`Language` + + """ + return cls(*language_converters[converter].reverse(code)) + + @classmethod + def fromietf(cls, ietf): + """Create a :class:`Language` by from an IETF language code + + :param string ietf: the ietf code + :return: the corresponding :class:`Language` instance + :rtype: :class:`Language` + + """ + subtags = ietf.split('-') + language_subtag = subtags.pop(0).lower() + if len(language_subtag) == 2: + language = cls.fromalpha2(language_subtag) + else: + language = cls(language_subtag) + while subtags: + subtag = subtags.pop(0) + if len(subtag) == 2: + language.country = Country(subtag.upper()) + else: + language.script = Script(subtag.capitalize()) + if language.script is not None: + if subtags: + raise ValueError('Wrong IETF format. Unmatched subtags: %r' % subtags) + break + return language + + def __getstate__(self): + return self.alpha3, self.country, self.script + + def __setstate__(self, state): + self.alpha3, self.country, self.script = state + + def __getattr__(self, name): + alpha3 = self.alpha3 + country = self.country.alpha2 if self.country is not None else None + script = self.script.code if self.script is not None else None + try: + return language_converters[name].convert(alpha3, country, script) + except KeyError: + raise AttributeError(name) + + def __hash__(self): + return hash(str(self)) + + def __eq__(self, other): + if isinstance(other, basestr): + return str(self) == other + if not isinstance(other, Language): + return False + return (self.alpha3 == other.alpha3 and + self.country == other.country and + self.script == other.script) + + def __ne__(self, other): + return not self == other + + def __bool__(self): + return self.alpha3 != 'und' + __nonzero__ = __bool__ + + def __repr__(self): + return '<Language [%s]>' % self + + def __str__(self): + try: + s = self.alpha2 + except LanguageConvertError: + s = self.alpha3 + if self.country is not None: + s += '-' + str(self.country) + if self.script is not None: + s += '-' + str(self.script) + return s diff --git a/lib/babelfish/script.py b/lib/babelfish/script.py new file mode 100755 index 00000000..5b3970a2 --- /dev/null +++ b/lib/babelfish/script.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +from __future__ import unicode_literals + +import os +from collections import namedtuple +# from pkg_resources import resource_stream # @UnresolvedImport +from . import basestr + +#: Script code to script name mapping +SCRIPTS = {} + +#: List of countries in the ISO-15924 as namedtuple of code, number, name, french_name, pva and date +SCRIPT_MATRIX = [] + +#: The namedtuple used in the :data:`SCRIPT_MATRIX` +IsoScript = namedtuple('IsoScript', ['code', 'number', 'name', 'french_name', 'pva', 'date']) + +f = open(os.path.join(os.path.dirname(__file__), 'data/iso15924-utf8-20131012.txt')) +f.readline() +for l in f: + l = l.decode('utf-8').strip() + if not l or l.startswith('#'): + continue + script = IsoScript._make(l.split(';')) + SCRIPT_MATRIX.append(script) + SCRIPTS[script.code] = script.name +f.close() + + +class Script(object): + """A human writing system + + A script is represented by a 4-letter code from the ISO-15924 standard + + :param string script: 4-letter ISO-15924 script code + + """ + def __init__(self, script): + if script not in SCRIPTS: + raise ValueError('%r is not a valid script' % script) + + #: ISO-15924 4-letter script code + self.code = script + + @property + def name(self): + """English name of the script""" + return SCRIPTS[self.code] + + def __getstate__(self): + return self.code + + def __setstate__(self, state): + self.code = state + + def __hash__(self): + return hash(self.code) + + def __eq__(self, other): + if isinstance(other, basestr): + return self.code == other + if not isinstance(other, Script): + return False + return self.code == other.code + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return '<Script [%s]>' % self + + def __str__(self): + return self.code diff --git a/lib/btserver/__init__.py b/lib/btserver/__init__.py deleted file mode 100644 index d8828c0f..00000000 --- a/lib/btserver/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- coding: utf-8 -*- - -from client import Client - -__all__ = ["Client"] diff --git a/lib/btserver/cache.py b/lib/btserver/cache.py deleted file mode 100644 index 81605bdb..00000000 --- a/lib/btserver/cache.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- coding: utf-8 -*- -# ------------------------------------------------------------ -# Gestiona el cache del servidor torrent: -# Guarda los .torrent generado -# Guarda los .resume de cada torrent -# ------------------------------------------------------------ -import base64 -import os.path -import re -import traceback - -try: - import xbmc, xbmcgui -except: - pass - -from platformcode import config -LIBTORRENT_PATH = config.get_setting("libtorrent_path", server="torrent", default='') - -from servers import torrent as torr -lt, e, e1, e2 = torr.import_libtorrent(LIBTORRENT_PATH) - - -class Cache(object): - CACHE_DIR = '.cache' - - def __init__(self, path): - - if not os.path.isdir(path): - os.makedirs(path) - self.path = os.path.join(path, Cache.CACHE_DIR) - if not os.path.isdir(self.path): - os.makedirs(self.path) - - def _tname(self, info_hash): - return os.path.join(self.path, info_hash.upper() + '.torrent') - - def _rname(self, info_hash): - return os.path.join(self.path, info_hash.upper() + '.resume') - - def save_resume(self, info_hash, data): - f = open(self._rname(info_hash), 'wb') - f.write(data) - f.close() - - def get_resume(self, url=None, info_hash=None): - if url: - info_hash = self._index.get(url) - if not info_hash: - return - rname = self._rname(info_hash) - if os.access(rname, os.R_OK): - f = open(rname, 'rb') - v = f.read() - f.close() - return v - - def file_complete(self, torrent): - info_hash = str(torrent.info_hash()) - nt = lt.create_torrent(torrent) - tname = self._tname(info_hash) - f = open(tname, 'wb') - f.write(lt.bencode(nt.generate())) - f.close() - - def get_torrent(self, url=None, info_hash=None): - if url: - info_hash = self._index.get(url) - if not info_hash: - return - tname = self._tname(info_hash) - if os.access(tname, os.R_OK): - return tname - - magnet_re = re.compile('xt=urn:btih:([0-9A-Za-z]+)') - hexa_chars = re.compile('^[0-9A-F]+$') - - @staticmethod - def hash_from_magnet(m): - res = Cache.magnet_re.search(m) - if res: - ih = res.group(1).upper() - if len(ih) == 40 and Cache.hexa_chars.match(ih): - return res.group(1).upper() - elif len(ih) == 32: - s = base64.b32decode(ih) - return "".join("{:02X}".format(ord(c)) for c in s) - else: - raise ValueError('Not BT magnet link') - - else: - raise ValueError('Not BT magnet link') diff --git a/lib/btserver/client.py b/lib/btserver/client.py deleted file mode 100644 index 3233dfaf..00000000 --- a/lib/btserver/client.py +++ /dev/null @@ -1,669 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import pickle -import random -import time -import urllib - -try: - import xbmc, xbmcgui -except: - pass - -from platformcode import config, logger -LIBTORRENT_PATH = config.get_setting("libtorrent_path", server="torrent", default='') - -from servers import torrent as torr -lt, e, e1, e2 = torr.import_libtorrent(LIBTORRENT_PATH) - -from cache import Cache -from dispatcher import Dispatcher -from file import File -from handler import Handler -from monitor import Monitor -from resume_data import ResumeData -from server import Server - -try: - BUFFER = int(config.get_setting("bt_buffer", server="torrent", default="50")) -except: - BUFFER = 50 - config.set_setting("bt_buffer", "50", server="torrent") -DOWNLOAD_PATH = config.get_setting("bt_download_path", server="torrent", default=config.get_setting("downloadpath")) -BACKGROUND = config.get_setting("mct_background_download", server="torrent", default=True) -RAR = config.get_setting("mct_rar_unpack", server="torrent", default=True) -msg_header = 'Client Torrent BT' - - -class Client(object): - INITIAL_TRACKERS = ['udp://tracker.openbittorrent.com:80', - 'udp://tracker.istole.it:80', - 'udp://open.demonii.com:80', - 'udp://tracker.coppersurfer.tk:80', - 'udp://tracker.leechers-paradise.org:6969', - 'udp://exodus.desync.com:6969', - 'udp://tracker.publicbt.com:80', - 'http://tracker.torrentbay.to:6969/announce', - 'http://tracker.pow7.com/announce', - 'udp://tracker.ccc.de:80/announce', - 'udp://open.demonii.com:1337', - 'http://9.rarbg.com:2710/announce', - 'http://bt.careland.com.cn:6969/announce', - 'http://explodie.org:6969/announce', - 'http://mgtracker.org:2710/announce', - 'http://tracker.best-torrents.net:6969/announce', - 'http://tracker.tfile.me/announce', - 'http://tracker1.wasabii.com.tw:6969/announce', - 'udp://9.rarbg.com:2710/announce', - 'udp://9.rarbg.me:2710/announce', - 'udp://coppersurfer.tk:6969/announce', - 'http://www.spanishtracker.com:2710/announce', - 'http://www.todotorrents.com:2710/announce' - ] ### Added some trackers from MCT - - VIDEO_EXTS = {'.avi': 'video/x-msvideo', '.mp4': 'video/mp4', '.mkv': 'video/x-matroska', - '.m4v': 'video/mp4', '.mov': 'video/quicktime', '.mpg': 'video/mpeg', '.ogv': 'video/ogg', - '.ogg': 'video/ogg', '.webm': 'video/webm', '.ts': 'video/mp2t', '.3gp': 'video/3gpp', - '.rar': 'video/unrar'} - - def __init__(self, url=None, port=None, ip=None, auto_shutdown=True, wait_time=20, timeout=5, auto_delete=True, - temp_path=None, is_playing_fnc=None, print_status=False): - - # server - if port: - self.port = port - else: - self.port = random.randint(8000, 8099) - if ip: - self.ip = ip - else: - self.ip = "127.0.0.1" - self.server = Server((self.ip, self.port), Handler, client=self) - - # Options - if temp_path: - self.temp_path = temp_path - else: - self.temp_path = DOWNLOAD_PATH - self.is_playing_fnc = is_playing_fnc - self.timeout = timeout - self.auto_delete = auto_delete - self.wait_time = wait_time - self.auto_shutdown = auto_shutdown - self.buffer_size = BUFFER - self.first_pieces_priorize = BUFFER - self.last_pieces_priorize = 5 - self.state_file = "state" - try: - self.torrent_paramss = {'save_path': self.temp_path, 'storage_mode': lt.storage_mode_t.storage_mode_allocate} - except Exception as e: - try: - do = xbmcgui.Dialog() - e = e1 or e2 - do.ok(config.get_localized_string(30035) + 'BT Libtorrent', config.get_localized_string(30036), config.get_localized_string(60015), str(e)) - except: - pass - return - - # State - self.has_meta = False - self.meta = None - self.start_time = None - self.last_connect = 0 - self.connected = False - self.closed = False - self.file = None - self.files = None - self._th = None - self.seleccion = 0 - self.index = 0 - - # Sesion - self._cache = Cache(self.temp_path) - self._ses = lt.session() - #self._ses.listen_on(0, 0) ### ALFA: it blocks repro of some .torrents - # Cargamos el archivo de estado (si existe) - """ ### ALFA: it blocks repro of some .torrents - if os.path.exists(os.path.join(self.temp_path, self.state_file)): - try: - f = open(os.path.join(self.temp_path, self.state_file), "rb") - state = pickle.load(f) - self._ses.load_state(state) - f.close() - except: - pass - """ - - self._start_services() - - # Monitor & Dispatcher - self._monitor = Monitor(self) - if print_status: - self._monitor.add_listener(self.print_status) - self._monitor.add_listener(self._check_meta) - self._monitor.add_listener(self.save_state) - self._monitor.add_listener(self.priorize_start_file) - self._monitor.add_listener(self.announce_torrent) - - if self.auto_shutdown: - self._monitor.add_listener(self._auto_shutdown) - - self._dispatcher = Dispatcher(self) - self._dispatcher.add_listener(self._update_ready_pieces) - - # Iniciamos la URL - if url: - self.start_url(url) - - def set_speed_limits(self, download=0, upload=0): - """ - Función encargada de poner límites a la velocidad de descarga o subida - """ - if isinstance(download, int) and download > 0: - self._th.set_download_limit(download * 1024) - if isinstance(upload, int) and download > 0: - self._th.set_upload_limit(upload * 1024) - - def get_play_list(self): - """ - Función encargada de generar el playlist - """ - # Esperamos a lo metadatos - while not self.has_meta: - time.sleep(1) - - # Comprobamos que haya archivos de video - if self.files: - if len(self.files) > 1: - return "http://" + self.ip + ":" + str(self.port) + "/playlist.pls" - else: - return "http://" + self.ip + ":" + str(self.port) + "/" + urllib.quote(self.files[0].path) - - def get_files(self): - """ - Función encargada de genera el listado de archivos - """ - # Esperamos a lo metadatos - while not self.has_meta: - time.sleep(1) - files = [] - - # Comprobamos que haya archivos de video - if self.files: - # Creamos el dict con los archivos - for file in self.files: - n = file.path - u = "http://" + self.ip + ":" + str(self.port) + "/" + urllib.quote(n) - s = file.size - files.append({"name": n, "url": u, "size": s}) - - return files - - def _find_files(self, files, search=None): - """ - Función encargada de buscar los archivos reproducibles del torrent - """ - self.total_size = 0 - # Obtenemos los archivos que la extension este en la lista - videos = filter(lambda f: self.VIDEO_EXTS.has_key(os.path.splitext(f.path)[1]), files) - - if not videos: - raise Exception('No video files in torrent') - for v in videos: - self.total_size += v.size ### ALFA - videos[videos.index(v)].index = files.index(v) - return videos - - def set_file(self, f): - """ - Función encargada de seleccionar el archivo que vamos a servir y por tanto, priorizar su descarga - """ - # Seleccionamos el archivo que vamos a servir - fmap = self.meta.map_file(f.index, 0, 1) - self.file = File(f.path, self.temp_path, f.index, f.size, fmap, self.meta.piece_length(), self) - if self.seleccion < 0: ### ALFA - self.file.first_piece = 0 ### ALFA - self.file.last_piece = self.meta.num_pieces() ### ALFA - self.file.size = self.total_size ### ALFA - self.prioritize_file() - - def prioritize_piece(self, pc, idx): - """ - Función encargada de priorizar una determinada pieza - """ - piece_duration = 1000 - min_deadline = 2000 - dl = idx * piece_duration + min_deadline - """ ### ALFA - try: - self._th.set_piece_deadline(pc, dl, lt.deadline_flags.alert_when_available) - except: - pass - """ - - if idx == 0: - tail_pieces = 9 - # Piezas anteriores a la primera se desactivan - if (self.file.last_piece - pc) > tail_pieces: - for i in xrange(self.file.first_piece, pc): - self._th.piece_priority(i, 0) - self._th.reset_piece_deadline(i) - - # Piezas siguientes a la primera se activan - for i in xrange(pc + 1, self.file.last_piece + 1): - #self._th.piece_priority(i, 0) - self._th.piece_priority(i, 1) - - def prioritize_file(self): - """ - Función encargada de priorizar las piezas correspondientes al archivo seleccionado en la funcion set_file() - """ - priorities = [] - for i in xrange(self.meta.num_pieces()): - if i >= self.file.first_piece and i <= self.file.last_piece: - priorities.append(1) - else: - if self.index < 0: - priorities.append(1) ### ALFA - else: - priorities.append(0) ### ALFA - - self._th.prioritize_pieces(priorities) - - x = 0 - for i, _set in enumerate(self._th.piece_priorities()): - if _set > 0: x += 1 - #logger.info("***** Nº Pieza: %s: %s" % (i, str(_set))) - logger.info("***** Piezas %s : Activas: %s" % (str(i+1), str(x))) - logger.info("***** first_piece %s : last_piece: %s" % (str(self.file.first_piece), str(self.file.last_piece))) - - def download_torrent(self, url): - """ - Función encargada de descargar un archivo .torrent - """ - from core import httptools - - data = httptools.downloadpage(url).data - return data - - def start_url(self, uri): - """ - Función encargada iniciar la descarga del torrent desde la url, permite: - - Url apuntando a un .torrent - - Url magnet - - Archivo .torrent local - """ - - if self._th: - raise Exception('Torrent is already started') - - if uri.startswith('http://') or uri.startswith('https://'): - torrent_data = self.download_torrent(uri) - info = lt.torrent_info(lt.bdecode(torrent_data)) - tp = {'ti': info} - resume_data = self._cache.get_resume(info_hash=str(info.info_hash())) - if resume_data: - tp['resume_data'] = resume_data - - elif uri.startswith('magnet:'): - tp = {'url': uri} - resume_data = self._cache.get_resume(info_hash=Cache.hash_from_magnet(uri)) - if resume_data: - tp['resume_data'] = resume_data - - elif os.path.isfile(uri): - if os.access(uri, os.R_OK): - info = lt.torrent_info(uri) - tp = {'ti': info} - resume_data = self._cache.get_resume(info_hash=str(info.info_hash())) - if resume_data: - tp['resume_data'] = resume_data - else: - raise ValueError('Invalid torrent path %s' % uri) - else: - raise ValueError("Invalid torrent %s" % uri) - - tp.update(self.torrent_paramss) - self._th = self._ses.add_torrent(tp) - - for tr in self.INITIAL_TRACKERS: - self._th.add_tracker({'url': tr}) - - self._th.set_sequential_download(True) - self._th.force_reannounce() - self._th.force_dht_announce() - - self._monitor.start() - self._dispatcher.do_start(self._th, self._ses) - self.server.run() - - def stop(self): - """ - Función encargada de de detener el torrent y salir - """ - self._dispatcher.stop() - self._dispatcher.join() - self._monitor.stop() - self.server.stop() - self._dispatcher.stop() - if self._ses: - self._ses.pause() - if self._th: - self.save_resume() - self.save_state() - self._stop_services() - self._ses.remove_torrent(self._th, self.auto_delete) - del self._ses - self.closed = True - - def pause(self): - """ - Función encargada de de pausar el torrent - """ - self._ses.pause() - - def _start_services(self): - """ - Función encargada de iniciar los servicios de libtorrent: dht, lsd, upnp, natpnp - """ - self._ses.add_dht_router("router.bittorrent.com", 6881) - self._ses.add_dht_router("router.bitcomet.com", 554) - self._ses.add_dht_router("router.utorrent.com", 6881) - self._ses.add_dht_router("dht.transmissionbt.com",6881) ### from MCT - self._ses.start_dht() - self._ses.start_lsd() - self._ses.start_upnp() - self._ses.start_natpmp() - - def _stop_services(self): - """ - Función encargada de detener los servicios de libtorrent: dht, lsd, upnp, natpnp - """ - self._ses.stop_natpmp() - self._ses.stop_upnp() - self._ses.stop_lsd() - self._ses.stop_dht() - - def save_resume(self): - """ - Función encargada guardar los metadatos para continuar una descarga mas rapidamente - """ - if self._th.need_save_resume_data() and self._th.is_valid() and self.meta: - r = ResumeData(self) - start = time.time() - while (time.time() - start) <= 5: - if r.data or r.failed: - break - time.sleep(0.1) - if r.data: - self._cache.save_resume(self.unique_file_id, lt.bencode(r.data)) - - @property - def status(self): - """ - Función encargada de devolver el estado del torrent - """ - if self._th: - s = self._th.status() - # Download Rate - s._download_rate = s.download_rate / 1024 - - # Progreso del archivo - if self.file: - pieces = s.pieces[self.file.first_piece:self.file.last_piece] ### ALFA - progress = float(sum(pieces)) / len(pieces) - s.pieces_len = len(pieces) ### ALFA - s.pieces_sum = sum(pieces) ### ALFA - #logger.info('***** Estado piezas: %s' % pieces) - else: - progress = 0 - s.pieces_len = 0 ### ALFA - s.pieces_sum = 0 ### ALFA - - s.progress_file = progress * 100 - - # Tamaño del archivo - s.file_name = '' ### ALFA - s.seleccion = '' ### ALFA - - if self.file: - s.seleccion = self.seleccion ### ALFA - s.file_name = self.file.path ### ALFA - s.file_size = self.file.size / 1048576.0 - else: - s.file_size = 0 - - # Estado del buffer - if self.file and self.file.cursor: # Con una conexion activa: Disponible vs Posicion del reproductor - percent = len(self.file.cursor.cache) - percent = percent * 100 / self.buffer_size - s.buffer = int(percent) - - elif self.file: # Sin una conexion activa: Pre-buffer antes de iniciar - # El Pre-buffer consta de dos partes_ - # 1. Buffer al inicio del archivo para que el reproductor empieze sin cortes - # 2. Buffer al final del archivo (en algunos archivos el reproductor mira el final del archivo antes de comenzar) - bp = [] - - # El tamaño del buffer de inicio es el tamaño del buffer menos el tamaño del buffer del final - first_pieces_priorize = self.buffer_size - self.last_pieces_priorize - - # Comprobamos qué partes del buffer del inicio estan disponibles - for x in range(first_pieces_priorize): - if self._th.have_piece(self.file.first_piece + x): - bp.append(True) - else: - bp.append(False) - - # Comprobamos qué partes del buffer del final estan disponibles - for x in range(self.last_pieces_priorize): - if self._th.have_piece(self.file.last_piece - x): - bp.append(True) - else: - bp.append(False) - - s.buffer = int(sum(bp) * 100 / self.buffer_size) - - else: # Si no hay ningun archivo seleccionado: No hay buffer - s.buffer = 0 - - # Tiempo restante para cerrar en caso de tener el timeout activo - if self.auto_shutdown: - if self.connected: - if self.timeout: - s.timeout = int(self.timeout - (time.time() - self.last_connect - 1)) - if self.file and self.file.cursor: - s.timeout = self.timeout - if s.timeout < 0: s.timeout = "Cerrando" - else: - s.timeout = "---" - else: - if self.start_time and self.wait_time: - s.timeout = int(self.wait_time - (time.time() - self.start_time - 1)) - if s.timeout < 0: s.timeout = "Cerrando" - else: - s.timeout = "---" - - else: - s.timeout = "Off" - - # Estado de la descarga - STATE_STR = ['Queued', 'Checking', 'Downloading Metadata', \ - 'Downloading', 'Finalized', 'Seeding', 'Allocating', 'Checking Fastresume'] - s.str_state = STATE_STR[s.state] - - # Estado DHT - if self._ses.dht_state() is not None: - s.dht_state = "On" - s.dht_nodes = self._ses.status().dht_nodes - else: - s.dht_state = "Off" - s.dht_nodes = 0 - - # Cantidad de Trackers - s.trackers = len(self._th.trackers()) - - # Origen de los peers - s.dht_peers = 0 - s.trk_peers = 0 - s.pex_peers = 0 - s.lsd_peers = 0 - - for peer in self._th.get_peer_info(): - if peer.source & 1: - s.trk_peers += 1 - if peer.source & 2: - s.dht_peers += 1 - if peer.source & 4: - s.pex_peers += 1 - if peer.source & 8: - s.lsd_peers += 1 - - return s - - """ - Servicios: - - Estas funciones se ejecutan de forma automatica cada x tiempo en otro Thread. - - Estas funciones son ejecutadas mientras el torrent esta activo algunas pueden desactivarse - segun la configuracion como por ejemplo la escritura en el log - """ - - def _auto_shutdown(self, *args, **kwargs): - """ - Servicio encargado de autoapagar el servidor - """ - if self.file and self.file.cursor: - self.last_connect = time.time() - self.connected = True - - if self.is_playing_fnc and self.is_playing_fnc(): - self.last_connect = time.time() - self.connected = True - - if self.auto_shutdown: - # shudown por haber cerrado el reproductor - if self.connected and self.is_playing_fnc and not self.is_playing_fnc(): - if time.time() - self.last_connect - 1 > self.timeout: - self.stop() - - # shutdown por no realizar ninguna conexion - if (not self.file or not self.file.cursor) and self.start_time and self.wait_time and not self.connected: - if time.time() - self.start_time - 1 > self.wait_time: - self.stop() - - # shutdown tras la ultima conexion - if (not self.file or not self.file.cursor) and self.timeout and self.connected and not self.is_playing_fnc: - if time.time() - self.last_connect - 1 > self.timeout: - self.stop() - - def announce_torrent(self): - """ - Servicio encargado de anunciar el torrent - """ - self._th.force_reannounce() - self._th.force_dht_announce() - - def save_state(self): - """ - Servicio encargado de guardar el estado - """ - state = self._ses.save_state() - f = open(os.path.join(self.temp_path, self.state_file), 'wb') - pickle.dump(state, f) - f.close() - - def _update_ready_pieces(self, alert_type, alert): - """ - Servicio encargado de informar que hay una pieza disponible - """ - if alert_type == 'read_piece_alert' and self.file: - self.file.update_piece(alert.piece, alert.buffer) - - def _check_meta(self): - """ - Servicio encargado de comprobar si los metadatos se han descargado - """ - if self.status.state >= 3 and self.status.state <= 5 and not self.has_meta: - - # Guardamos los metadatos - self.meta = self._th.get_torrent_info() - - # Obtenemos la lista de archivos del meta - fs = self.meta.files() - if isinstance(fs, list): - files = fs - else: - files = [fs.at(i) for i in xrange(fs.num_files())] - - # Guardamos la lista de archivos - self.files = self._find_files(files) - - # Si hay varios vídeos (no RAR), se selecciona el vídeo o "todos" - lista = [] - seleccion = 0 - for file in self.files: - if '.rar' in str(file.path): - seleccion = -9 - lista += [os.path.split(str(file.path))[1]] - if len(lista) > 1 and seleccion >= 0: - d = xbmcgui.Dialog() - seleccion = d.select(msg_header + config.get_localized_string(30034), lista) - - if seleccion < 0: - index = 0 - self.index = seleccion - else: - index = seleccion - self.index = self.files[index].index - self.seleccion = seleccion - - # Marcamos el primer archivo como activo - self.set_file(self.files[index]) - - # Damos por iniciada la descarga - self.start_time = time.time() - - # Guardamos el .torrent en el cache - self._cache.file_complete(self._th.get_torrent_info()) - - self.has_meta = True - - def priorize_start_file(self): - ''' - Servicio encargado de priorizar el principio y final de archivo cuando no hay conexion - ''' - if self.file and not self.file.cursor: - num_start_pieces = self.buffer_size - self.last_pieces_priorize # Cantidad de piezas a priorizar al inicio - num_end_pieces = self.last_pieces_priorize # Cantidad de piezas a priorizar al final - - pieces_count = 0 - # Priorizamos las ultimas piezas - for y in range(self.file.last_piece - num_end_pieces, self.file.last_piece + 1): - if not self._th.have_piece(y): - self.prioritize_piece(y, pieces_count) - pieces_count += 1 - - # Priorizamos las primeras piezas - for y in range(self.file.first_piece, self.file.last_piece + 1): - if not self._th.have_piece(y): - if pieces_count == self.buffer_size: - break - self.prioritize_piece(y, pieces_count) - pieces_count += 1 - - def print_status(self): - ''' - Servicio encargado de mostrar en el log el estado de la descarga - ''' - s = self.status ### ALFA - if self.seleccion >= 0: - archivo = self.seleccion + 1 - else: - archivo = self.seleccion - - logger.info( - '%.2f%% de %.1fMB %s | %.1f kB/s | #%s %d%% | AutoClose: %s | S: %d(%d) P: %d(%d)) | TRK: %d DHT: %d PEX: %d LSD %d | DHT:%s (%d) | Trakers: %d | Pieces: %d (%d)' % \ - (s.progress_file, s.file_size, s.str_state, s._download_rate, archivo, s.buffer, s.timeout, s.num_seeds, \ - s.num_complete, s.num_peers, s.num_incomplete, s.trk_peers, s.dht_peers, s.pex_peers, s.lsd_peers, - s.dht_state, s.dht_nodes, s.trackers, s.pieces_sum, s.pieces_len)) ### ALFA diff --git a/lib/btserver/cursor.py b/lib/btserver/cursor.py deleted file mode 100644 index 5ecccfda..00000000 --- a/lib/btserver/cursor.py +++ /dev/null @@ -1,106 +0,0 @@ -# -*- coding: utf-8 -*- - -from threading import Lock, Event - - -class Cursor(object): - def __init__(self, file): - self._file = file - self.pos = 0 - self.timeout = 30 - self.cache_size = self._file._client.buffer_size - self.cache = {} - self.lock = Lock() - self.event = Event() - self.cache_first = 0 - - def fill_cache(self, first): - self.cache_first = first - - with self.lock: - for p in sorted(self.cache): - if p < first: del self.cache[p] - - self.event.clear() - for i in xrange(first, first + self.cache_size): - if i <= self._file.last_piece: - self._file._client.prioritize_piece(i, i - first) - - def has_piece(self, n): - with self.lock: - return n in self.cache - - def _wait_piece(self, pc_no): - while not self.has_piece(pc_no): - self.fill_cache(pc_no) - self.event.wait(self.timeout) - - def _get_piece(self, n): - with self.lock: - if not n in self.cache: - raise ValueError('index of of scope of current cache') - return self.cache[n] - - def get_piece(self, n): - self._wait_piece(n) - return self._get_piece(n) - - def close(self): - self._file.cursor = None - - def read(self, size=None): - data = "" - max_size = self._file.size - self.pos - if not size: - size = max_size - else: - size = min(size, max_size) - - if size: - pc_no, ofs = self._file.map_piece(self.pos) - data = self.get_piece(pc_no)[ofs: ofs + size] - - if len(data) < size: - remains = size - len(data) - pc_no += 1 - self.fill_cache(pc_no) - while remains and self.has_piece(pc_no): - sz = min(remains, self._file.piece_size) - data += self.get_piece(pc_no)[:sz] - remains -= sz - if remains: - pc_no += 1 - self.fill_cache(pc_no) - - self.pos += len(data) - - return data - - def seek(self, n): - if n > self._file.size: - n = self._file.size - elif n < 0: - raise ValueError('Seeking negative') - self.pos = n - - def tell(self): - return self.pos - - def update_piece(self, n, data): - with self.lock: - pcs = sorted(self.cache) - if len(pcs) < self.cache_size: - if len(pcs): - new = max(pcs) + 1 - else: - new = self.cache_first - if n == new: - self.cache[n] = data - if n == self.cache_first: - self.event.set() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() diff --git a/lib/btserver/dispatcher.py b/lib/btserver/dispatcher.py deleted file mode 100644 index c0edfa01..00000000 --- a/lib/btserver/dispatcher.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- - -from monitor import Monitor - -import traceback - -try: - import xbmc, xbmcgui -except: - pass - -from platformcode import config -LIBTORRENT_PATH = config.get_setting("libtorrent_path", server="torrent", default='') - -from servers import torrent as torr -lt, e, e1, e2 = torr.import_libtorrent(LIBTORRENT_PATH) - - -class Dispatcher(Monitor): - def __init__(self, client): - super(Dispatcher, self).__init__(client) - - def do_start(self, th, ses): - self._th = th - self._ses = ses - self.start() - - def run(self): - if not self._ses: - raise Exception('Invalid state, session is not initialized') - - while self.running: - a = self._ses.wait_for_alert(1000) - if a: - alerts = self._ses.pop_alerts() - for alert in alerts: - with self.lock: - for cb in self.listeners: - cb(lt.alert.what(alert), alert) diff --git a/lib/btserver/file.py b/lib/btserver/file.py deleted file mode 100644 index 0d8d9742..00000000 --- a/lib/btserver/file.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- - -import os - -from cursor import Cursor - - -class File(object): - def __init__(self, path, base, index, size, fmap, piece_size, client): - self._client = client - self.path = path - self.base = base - self.index = index - self.size = size - - self.piece_size = piece_size - - self.full_path = os.path.join(base, path) - self.first_piece = fmap.piece - self.offset = fmap.start - self.last_piece = self.first_piece + max((size - 1 + fmap.start), 0) // piece_size - - self.cursor = None - - def create_cursor(self, offset=None): - self.cursor = Cursor(self) - if offset: - self.cursor.seek(offset) - return self.cursor - - def map_piece(self, ofs): - return self.first_piece + (ofs + self.offset) // self.piece_size, (ofs + self.offset) % self.piece_size - - def update_piece(self, n, data): - if self.cursor: - self.cursor.update_piece(n, data) - - def __str__(self): - return self.path diff --git a/lib/btserver/handler.py b/lib/btserver/handler.py deleted file mode 100644 index 7ddb9705..00000000 --- a/lib/btserver/handler.py +++ /dev/null @@ -1,135 +0,0 @@ -# -*- coding: utf-8 -*- - -import BaseHTTPServer -import os -import re -import time -import types -import urllib -import urlparse - -RANGE_RE = re.compile(r'bytes=(\d+)-') - - -def parse_range(range): # @ReservedAssignment - if range: - m = RANGE_RE.match(range) - if m: - try: - return int(m.group(1)) - except: - pass - return 0 - - -class Handler(BaseHTTPServer.BaseHTTPRequestHandler): - protocol_version = 'HTTP/1.1' - - def log_message(self, format, *args): - pass - - def do_GET(self): - if self.server.request: - self.server.request.wfile.close() - self.server.request = self - - if self.do_HEAD(): - f = self.server.file.create_cursor(self.offset) - while f == self.server.file.cursor: - buf = f.read(1024) - if buf: - try: - self.wfile.write(buf) - except: - break - else: - break - f.close() - - def send_pls(self, files): - playlist = "[playlist]\n\n" - for x, f in enumerate(files): - playlist += "File" + str(x + 1) + "=http://127.0.0.1:" + str(self.server._client.port) + "/" + urllib.quote( - f.path) + "\n" - playlist += "Title" + str(x + 1) + "=" + f.path + "\n" - playlist += "NumberOfEntries=" + str(len(files)) - playlist += "Version=2" - self.send_response(200, 'OK') - self.send_header("Content-Length", str(len(playlist))) - self.finish_header() - self.wfile.write(playlist) - - def do_HEAD(self): - url = urlparse.urlparse(self.path).path - - '''Whait to list of files ''' - while not self.server._client.files: - time.sleep(1) - - files = self.server._client.files - self.server.file = self.server._client.file - - '''Creates PLS playlist ''' - if url == "/playlist.pls": - self.send_pls(files) - return False - - '''Change File to download ''' - if not self.server.file or urllib.unquote(url) != '/' + self.server.file.path: - file = urllib.unquote(url) - client = self.server._client - for f in client.files: - if file == '/' + f.path: - client.set_file(f) - self.server.file = client.file - break - - while not self.server._client.has_meta: - time.sleep(1) - if self.server.file and urllib.unquote(url) == '/' + self.server.file.path: - self.offset = 0 - size, mime = self._file_info() - range = parse_range(self.headers.get('Range', None)) - if range: - self.offset = range - range = (range, size - 1, size) - - self.send_resp_header(mime, size, range) - return True - - else: - self.send_error(404, 'Not Found') - - def _file_info(self): - size = self.server.file.size - ext = os.path.splitext(self.server.file.path)[1] - mime = self.server._client.VIDEO_EXTS.get(ext) - if not mime: - mime = 'application/octet-stream' - return size, mime - - def send_resp_header(self, cont_type, cont_length, range=False): # @ReservedAssignment - if range: - self.send_response(206, 'Partial Content') - else: - self.send_response(200, 'OK') - - self.send_header('Content-Type', cont_type) - self.send_header('transferMode.dlna.org', 'Streaming') - self.send_header('contentFeatures.dlna.org', - 'DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000') - self.send_header('Accept-Ranges', 'bytes') - - if range: - if isinstance(range, (types.TupleType, types.ListType)) and len(range) == 3: - self.send_header('Content-Range', 'bytes %d-%d/%d' % range) - self.send_header('Content-Length', range[1] - range[0] + 1) - else: - raise ValueError('Invalid range value') - else: - self.send_header('Content-Length', cont_length) - self.finish_header() - - def finish_header(self): - self.send_header('Connection', 'close') - self.end_headers() diff --git a/lib/btserver/monitor.py b/lib/btserver/monitor.py deleted file mode 100644 index 9fd40c70..00000000 --- a/lib/btserver/monitor.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- - -from threading import Thread, Lock, Event - - -class Monitor(Thread): - def __init__(self, client): - Thread.__init__(self) - self.daemon = True - self.listeners = [] - self.lock = Lock() - self.wait_event = Event() - self.running = True - self.client = client - self.ses = None - self.client = client - - def stop(self): - self.running = False - self.wait_event.set() - - def add_listener(self, cb): - with self.lock: - if not cb in self.listeners: - self.listeners.append(cb) - - def remove_listener(self, cb): - with self.lock: - try: - self.listeners.remove(cb) - except ValueError: - pass - - def remove_all_listeners(self): - with self.lock: - self.listeners = [] - - def run(self): - while (self.running): - with self.lock: - for cb in self.listeners: - cb() - - self.wait_event.wait(1.0) diff --git a/lib/btserver/resume_data.py b/lib/btserver/resume_data.py deleted file mode 100644 index a0c9d3eb..00000000 --- a/lib/btserver/resume_data.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- - -class ResumeData(object): - def __init__(self, client): - self.data = None - self.failed = False - client._dispatcher.add_listener(self._process_alert) - client._th.save_resume_data() - - def _process_alert(self, t, alert): - if t == 'save_resume_data_failed_alert': - self.failed = True - - elif t == 'save_resume_data_alert': - self.data = alert.resume_data diff --git a/lib/btserver/server.py b/lib/btserver/server.py deleted file mode 100644 index 17afecd4..00000000 --- a/lib/btserver/server.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- - -import BaseHTTPServer -import traceback -from SocketServer import ThreadingMixIn -from threading import Thread - - -class Server(ThreadingMixIn, BaseHTTPServer.HTTPServer): - daemon_threads = True - timeout = 1 - - def __init__(self, address, handler, client): - BaseHTTPServer.HTTPServer.__init__(self, address, handler) - self._client = client - self.file = None - self.running = True - self.request = None - - def stop(self): - self.running = False - - def serve(self): - while self.running: - try: - self.handle_request() - except: - print traceback.format_exc() - - def run(self): - t = Thread(target=self.serve, name='HTTP Server') - t.daemon = True - t.start() - - def handle_error(self, request, client_address): - if not "socket.py" in traceback.format_exc(): - print traceback.format_exc() diff --git a/lib/cloudscraper/__init__.py b/lib/cloudscraper/__init__.py index 389788bf..eb957a63 100644 --- a/lib/cloudscraper/__init__.py +++ b/lib/cloudscraper/__init__.py @@ -55,7 +55,7 @@ except ImportError: # ------------------------------------------------------------------------------- # -__version__ = '1.2.35' +__version__ = '1.2.36' # ------------------------------------------------------------------------------- # @@ -78,6 +78,7 @@ class CipherSuiteAdapter(HTTPAdapter): if not self.ssl_context: self.ssl_context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) self.ssl_context.set_ciphers(self.cipherSuite) + self.ssl_context.set_ecdh_curve('prime256v1') self.ssl_context.options |= (ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1) super(CipherSuiteAdapter, self).__init__(**kwargs) @@ -256,7 +257,7 @@ class CloudScraper(Session): resp.headers.get('Server', '').startswith('cloudflare') and resp.status_code in [429, 503] and re.search( - r'<form id="challenge-form" action="/.*?__cf_chl_jschl_tk__=\S+"', + r'<form .*?="challenge-form" action="/.*?__cf_chl_jschl_tk__=\S+"', resp.text, re.M | re.DOTALL ) @@ -347,6 +348,8 @@ class CloudScraper(Session): ) if self.is_reCaptcha_Challenge(resp) or self.is_IUAM_Challenge(resp): + if self.debug: + print('Detected Challenge.') return True return False @@ -358,7 +361,8 @@ class CloudScraper(Session): def IUAM_Challenge_Response(self, body, url, interpreter): try: formPayload = re.search( - r'<form (?P<form>id="challenge-form" action="(?P<challengeUUID>.*?' + r'<form (?P<form>.*?="challenge-form" ' + r'action="(?P<challengeUUID>.*?' r'__cf_chl_jschl_tk__=\S+)"(.*?)</form>)', body, re.M | re.DOTALL @@ -412,7 +416,7 @@ class CloudScraper(Session): def reCaptcha_Challenge_Response(self, provider, provider_params, body, url): try: formPayload = re.search( - r'<form class="challenge-form" (?P<form>id="challenge-form" ' + r'<form (?P<form>.*?="challenge-form" ' r'action="(?P<challengeUUID>.*?__cf_chl_captcha_tk__=\S+)"(.*?)</form>)', body, re.M | re.DOTALL diff --git a/lib/cloudscraper/interpreters/encapsulated.py b/lib/cloudscraper/interpreters/encapsulated.py index c3a4a0c5..98faf48f 100644 --- a/lib/cloudscraper/interpreters/encapsulated.py +++ b/lib/cloudscraper/interpreters/encapsulated.py @@ -9,15 +9,13 @@ def template(body, domain): try: js = re.search( - r'setTimeout\(function\(\){\s+(var s,t,o,p,b,r,e,a,k,i,n,g,f.+?\r?\n[\s\S]+?a\.value =.+?)\r?\n', - body + r'setTimeout\(function\(\){\s+(.*?a\.value = \S+)', + body, + re.M | re.S ).group(1) except Exception: raise ValueError('Unable to identify Cloudflare IUAM Javascript on website. {}'.format(BUG_REPORT)) - js = re.sub(r'\s{2,}', ' ', js, flags=re.MULTILINE | re.DOTALL).replace('\'; 121\'', '') - js += '\na.value;' - jsEnv = ''' String.prototype.italics=function(str) {{return "<i>" + this + "</i>";}}; var document = {{ diff --git a/lib/cloudscraper/interpreters/native.py b/lib/cloudscraper/interpreters/native.py index 69828705..94d238bb 100644 --- a/lib/cloudscraper/interpreters/native.py +++ b/lib/cloudscraper/interpreters/native.py @@ -1,21 +1,95 @@ from __future__ import absolute_import +import ast import re import operator as op +import pyparsing from ..exceptions import CloudflareSolveError from . import JavaScriptInterpreter # ------------------------------------------------------------------------------- # +_OP_MAP = { + ast.Add: op.add, + ast.Sub: op.sub, + ast.Mult: op.mul, + ast.Div: op.truediv, + ast.Invert: op.neg, +} + +# ------------------------------------------------------------------------------- # + + +class Calc(ast.NodeVisitor): + + def visit_BinOp(self, node): + return _OP_MAP[type(node.op)](self.visit(node.left), self.visit(node.right)) + + # ------------------------------------------------------------------------------- # + + def visit_Num(self, node): + return node.n + + # ------------------------------------------------------------------------------- # + + def visit_Expr(self, node): + return self.visit(node.value) + + # ------------------------------------------------------------------------------- # + + @classmethod + def doMath(cls, expression): + tree = ast.parse(expression) + calc = cls() + return calc.visit(tree.body[0]) + +# ------------------------------------------------------------------------------- # + + +class Parentheses(object): + + def fix(self, s): + res = [] + self.visited = set([s]) + self.dfs(s, self.invalid(s), res) + return res + + # ------------------------------------------------------------------------------- # + + def dfs(self, s, n, res): + if n == 0: + res.append(s) + return + for i in range(len(s)): + if s[i] in ['(', ')']: + s_new = s[:i] + s[i + 1:] + if s_new not in self.visited and self.invalid(s_new) < n: + self.visited.add(s_new) + self.dfs(s_new, self.invalid(s_new), res) + + # ------------------------------------------------------------------------------- # + + def invalid(self, s): + plus = minus = 0 + memo = {"(": 1, ")": -1} + for c in s: + plus += memo.get(c, 0) + minus += 1 if plus < 0 else 0 + plus = max(0, plus) + return plus + minus + +# ------------------------------------------------------------------------------- # + class ChallengeInterpreter(JavaScriptInterpreter): def __init__(self): super(ChallengeInterpreter, self).__init__('native') + # ------------------------------------------------------------------------------- # + def eval(self, body, domain): - # ------------------------------------------------------------------------------- # operators = { '+': op.add, @@ -26,18 +100,29 @@ class ChallengeInterpreter(JavaScriptInterpreter): # ------------------------------------------------------------------------------- # + def flatten(l): + return sum(map(flatten, l), []) if isinstance(l, list) else [l] + + # ------------------------------------------------------------------------------- # + def jsfuckToNumber(jsFuck): - t = '' + # "Clean Up" JSFuck + jsFuck = jsFuck.replace('!+[]', '1').replace('!![]', '1').replace('[]', '0') + jsFuck = jsFuck.lstrip('+').replace('(+', '(').replace(' ', '') + jsFuck = Parentheses().fix(jsFuck)[0] - split_numbers = re.compile(r'-?\d+').findall + # Hackery Parser for Math + stack = [] + bstack = [] + for i in flatten(pyparsing.nestedExpr().parseString(jsFuck).asList()): + if i == '+': + stack.append(bstack) + bstack = [] + continue + bstack.append(i) + stack.append(bstack) - for i in re.findall( - r'\((?:\d|\+|\-)*\)', - jsFuck.replace('!+[]', '1').replace('!![]', '1').replace('[]', '0').lstrip('+').replace('(+', '(') - ): - t = '{}{}'.format(t, sum(int(x) for x in split_numbers(i))) - - return int(t) + return int(''.join([str(Calc.doMath(''.join(i))) for i in stack])) # ------------------------------------------------------------------------------- # @@ -45,6 +130,7 @@ class ChallengeInterpreter(JavaScriptInterpreter): jsfuckMath = payload.split('/') if needle in jsfuckMath[1]: expression = re.findall(r"^(.*?)(.)\(function", jsfuckMath[1])[0] + expression_value = operators[expression[1]]( float(jsfuckToNumber(expression[0])), float(ord(domain[jsfuckToNumber(jsfuckMath[1][ @@ -118,7 +204,7 @@ class ChallengeInterpreter(JavaScriptInterpreter): return challengeSolve(body, domain) - # ------------------------------------------------------------------------------- # + ChallengeInterpreter() diff --git a/lib/dateutil/__init__.py b/lib/dateutil/__init__.py new file mode 100644 index 00000000..9a42dcea --- /dev/null +++ b/lib/dateutil/__init__.py @@ -0,0 +1,9 @@ +""" +Copyright (c) 2003-2010 Gustavo Niemeyer <gustavo@niemeyer.net> + +This module offers extensions to the standard python 2.3+ +datetime module. +""" +__author__ = "Gustavo Niemeyer <gustavo@niemeyer.net>" +__license__ = "PSF License" +__version__ = "1.5.0.1" diff --git a/lib/dateutil/easter.py b/lib/dateutil/easter.py new file mode 100644 index 00000000..d7944104 --- /dev/null +++ b/lib/dateutil/easter.py @@ -0,0 +1,92 @@ +""" +Copyright (c) 2003-2007 Gustavo Niemeyer <gustavo@niemeyer.net> + +This module offers extensions to the standard python 2.3+ +datetime module. +""" +__author__ = "Gustavo Niemeyer <gustavo@niemeyer.net>" +__license__ = "PSF License" + +import datetime + +__all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"] + +EASTER_JULIAN = 1 +EASTER_ORTHODOX = 2 +EASTER_WESTERN = 3 + +def easter(year, method=EASTER_WESTERN): + """ + This method was ported from the work done by GM Arts, + on top of the algorithm by Claus Tondering, which was + based in part on the algorithm of Ouding (1940), as + quoted in "Explanatory Supplement to the Astronomical + Almanac", P. Kenneth Seidelmann, editor. + + This algorithm implements three different easter + calculation methods: + + 1 - Original calculation in Julian calendar, valid in + dates after 326 AD + 2 - Original method, with date converted to Gregorian + calendar, valid in years 1583 to 4099 + 3 - Revised method, in Gregorian calendar, valid in + years 1583 to 4099 as well + + These methods are represented by the constants: + + EASTER_JULIAN = 1 + EASTER_ORTHODOX = 2 + EASTER_WESTERN = 3 + + The default method is method 3. + + More about the algorithm may be found at: + + http://users.chariot.net.au/~gmarts/eastalg.htm + + and + + http://www.tondering.dk/claus/calendar.html + + """ + + if not (1 <= method <= 3): + raise ValueError, "invalid method" + + # g - Golden year - 1 + # c - Century + # h - (23 - Epact) mod 30 + # i - Number of days from March 21 to Paschal Full Moon + # j - Weekday for PFM (0=Sunday, etc) + # p - Number of days from March 21 to Sunday on or before PFM + # (-6 to 28 methods 1 & 3, to 56 for method 2) + # e - Extra days to add for method 2 (converting Julian + # date to Gregorian date) + + y = year + g = y % 19 + e = 0 + if method < 3: + # Old method + i = (19*g+15)%30 + j = (y+y//4+i)%7 + if method == 2: + # Extra dates to convert Julian to Gregorian date + e = 10 + if y > 1600: + e = e+y//100-16-(y//100-16)//4 + else: + # New method + c = y//100 + h = (c-c//4-(8*c+13)//25+19*g+15)%30 + i = h-(h//28)*(1-(h//28)*(29//(h+1))*((21-g)//11)) + j = (y+y//4+i+2-c+c//4)%7 + + # p can be from -6 to 56 corresponding to dates 22 March to 23 May + # (later dates apply to method 2, although 23 May never actually occurs) + p = i-j+e + d = 1+(p+27+(p+6)//40)%31 + m = 3+(p+26)//30 + return datetime.date(int(y),int(m),int(d)) + diff --git a/lib/dateutil/parser.py b/lib/dateutil/parser.py new file mode 100644 index 00000000..5d824e41 --- /dev/null +++ b/lib/dateutil/parser.py @@ -0,0 +1,886 @@ +# -*- coding:iso-8859-1 -*- +""" +Copyright (c) 2003-2007 Gustavo Niemeyer <gustavo@niemeyer.net> + +This module offers extensions to the standard python 2.3+ +datetime module. +""" +__author__ = "Gustavo Niemeyer <gustavo@niemeyer.net>" +__license__ = "PSF License" + +import datetime +import string +import time +import sys +import os + +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +import relativedelta +import tz + + +__all__ = ["parse", "parserinfo"] + + +# Some pointers: +# +# http://www.cl.cam.ac.uk/~mgk25/iso-time.html +# http://www.iso.ch/iso/en/prods-services/popstds/datesandtime.html +# http://www.w3.org/TR/NOTE-datetime +# http://ringmaster.arc.nasa.gov/tools/time_formats.html +# http://search.cpan.org/author/MUIR/Time-modules-2003.0211/lib/Time/ParseDate.pm +# http://stein.cshl.org/jade/distrib/docs/java.text.SimpleDateFormat.html + + +class _timelex(object): + + def __init__(self, instream): + if isinstance(instream, basestring): + instream = StringIO(instream) + self.instream = instream + self.wordchars = ('abcdfeghijklmnopqrstuvwxyz' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_' + '' + '') + self.numchars = '0123456789' + self.whitespace = ' \t\r\n' + self.charstack = [] + self.tokenstack = [] + self.eof = False + + def get_token(self): + if self.tokenstack: + return self.tokenstack.pop(0) + seenletters = False + token = None + state = None + wordchars = self.wordchars + numchars = self.numchars + whitespace = self.whitespace + while not self.eof: + if self.charstack: + nextchar = self.charstack.pop(0) + else: + nextchar = self.instream.read(1) + while nextchar == '\x00': + nextchar = self.instream.read(1) + if not nextchar: + self.eof = True + break + elif not state: + token = nextchar + if nextchar in wordchars: + state = 'a' + elif nextchar in numchars: + state = '0' + elif nextchar in whitespace: + token = ' ' + break # emit token + else: + break # emit token + elif state == 'a': + seenletters = True + if nextchar in wordchars: + token += nextchar + elif nextchar == '.': + token += nextchar + state = 'a.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == '0': + if nextchar in numchars: + token += nextchar + elif nextchar == '.': + token += nextchar + state = '0.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == 'a.': + seenletters = True + if nextchar == '.' or nextchar in wordchars: + token += nextchar + elif nextchar in numchars and token[-1] == '.': + token += nextchar + state = '0.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == '0.': + if nextchar == '.' or nextchar in numchars: + token += nextchar + elif nextchar in wordchars and token[-1] == '.': + token += nextchar + state = 'a.' + else: + self.charstack.append(nextchar) + break # emit token + if (state in ('a.', '0.') and + (seenletters or token.count('.') > 1 or token[-1] == '.')): + l = token.split('.') + token = l[0] + for tok in l[1:]: + self.tokenstack.append('.') + if tok: + self.tokenstack.append(tok) + return token + + def __iter__(self): + return self + + def next(self): + token = self.get_token() + if token is None: + raise StopIteration + return token + + def split(cls, s): + return list(cls(s)) + split = classmethod(split) + + +class _resultbase(object): + + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, None) + + def _repr(self, classname): + l = [] + for attr in self.__slots__: + value = getattr(self, attr) + if value is not None: + l.append("%s=%s" % (attr, `value`)) + return "%s(%s)" % (classname, ", ".join(l)) + + def __repr__(self): + return self._repr(self.__class__.__name__) + + +class parserinfo(object): + + # m from a.m/p.m, t from ISO T separator + JUMP = [" ", ".", ",", ";", "-", "/", "'", + "at", "on", "and", "ad", "m", "t", "of", + "st", "nd", "rd", "th"] + + WEEKDAYS = [("Mon", "Monday"), + ("Tue", "Tuesday"), + ("Wed", "Wednesday"), + ("Thu", "Thursday"), + ("Fri", "Friday"), + ("Sat", "Saturday"), + ("Sun", "Sunday")] + MONTHS = [("Jan", "January"), + ("Feb", "February"), + ("Mar", "March"), + ("Apr", "April"), + ("May", "May"), + ("Jun", "June"), + ("Jul", "July"), + ("Aug", "August"), + ("Sep", "September"), + ("Oct", "October"), + ("Nov", "November"), + ("Dec", "December")] + HMS = [("h", "hour", "hours"), + ("m", "minute", "minutes"), + ("s", "second", "seconds")] + AMPM = [("am", "a"), + ("pm", "p")] + UTCZONE = ["UTC", "GMT", "Z"] + PERTAIN = ["of"] + TZOFFSET = {} + + def __init__(self, dayfirst=False, yearfirst=False): + self._jump = self._convert(self.JUMP) + self._weekdays = self._convert(self.WEEKDAYS) + self._months = self._convert(self.MONTHS) + self._hms = self._convert(self.HMS) + self._ampm = self._convert(self.AMPM) + self._utczone = self._convert(self.UTCZONE) + self._pertain = self._convert(self.PERTAIN) + + self.dayfirst = dayfirst + self.yearfirst = yearfirst + + self._year = time.localtime().tm_year + self._century = self._year//100*100 + + def _convert(self, lst): + dct = {} + for i in range(len(lst)): + v = lst[i] + if isinstance(v, tuple): + for v in v: + dct[v.lower()] = i + else: + dct[v.lower()] = i + return dct + + def jump(self, name): + return name.lower() in self._jump + + def weekday(self, name): + if len(name) >= 3: + try: + return self._weekdays[name.lower()] + except KeyError: + pass + return None + + def month(self, name): + if len(name) >= 3: + try: + return self._months[name.lower()]+1 + except KeyError: + pass + return None + + def hms(self, name): + try: + return self._hms[name.lower()] + except KeyError: + return None + + def ampm(self, name): + try: + return self._ampm[name.lower()] + except KeyError: + return None + + def pertain(self, name): + return name.lower() in self._pertain + + def utczone(self, name): + return name.lower() in self._utczone + + def tzoffset(self, name): + if name in self._utczone: + return 0 + return self.TZOFFSET.get(name) + + def convertyear(self, year): + if year < 100: + year += self._century + if abs(year-self._year) >= 50: + if year < self._year: + year += 100 + else: + year -= 100 + return year + + def validate(self, res): + # move to info + if res.year is not None: + res.year = self.convertyear(res.year) + if res.tzoffset == 0 and not res.tzname or res.tzname == 'Z': + res.tzname = "UTC" + res.tzoffset = 0 + elif res.tzoffset != 0 and res.tzname and self.utczone(res.tzname): + res.tzoffset = 0 + return True + + +class parser(object): + + def __init__(self, info=None): + self.info = info or parserinfo() + + def parse(self, timestr, default=None, + ignoretz=False, tzinfos=None, + **kwargs): + if not default: + default = datetime.datetime.now().replace(hour=0, minute=0, + second=0, microsecond=0) + res = self._parse(timestr, **kwargs) + if res is None: + raise ValueError, "unknown string format" + repl = {} + for attr in ["year", "month", "day", "hour", + "minute", "second", "microsecond"]: + value = getattr(res, attr) + if value is not None: + repl[attr] = value + ret = default.replace(**repl) + if res.weekday is not None and not res.day: + ret = ret+relativedelta.relativedelta(weekday=res.weekday) + if not ignoretz: + if callable(tzinfos) or tzinfos and res.tzname in tzinfos: + if callable(tzinfos): + tzdata = tzinfos(res.tzname, res.tzoffset) + else: + tzdata = tzinfos.get(res.tzname) + if isinstance(tzdata, datetime.tzinfo): + tzinfo = tzdata + elif isinstance(tzdata, basestring): + tzinfo = tz.tzstr(tzdata) + elif isinstance(tzdata, int): + tzinfo = tz.tzoffset(res.tzname, tzdata) + else: + raise ValueError, "offset must be tzinfo subclass, " \ + "tz string, or int offset" + ret = ret.replace(tzinfo=tzinfo) + elif res.tzname and res.tzname in time.tzname: + ret = ret.replace(tzinfo=tz.tzlocal()) + elif res.tzoffset == 0: + ret = ret.replace(tzinfo=tz.tzutc()) + elif res.tzoffset: + ret = ret.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset)) + return ret + + class _result(_resultbase): + __slots__ = ["year", "month", "day", "weekday", + "hour", "minute", "second", "microsecond", + "tzname", "tzoffset"] + + def _parse(self, timestr, dayfirst=None, yearfirst=None, fuzzy=False): + info = self.info + if dayfirst is None: + dayfirst = info.dayfirst + if yearfirst is None: + yearfirst = info.yearfirst + res = self._result() + l = _timelex.split(timestr) + try: + + # year/month/day list + ymd = [] + + # Index of the month string in ymd + mstridx = -1 + + len_l = len(l) + i = 0 + while i < len_l: + + # Check if it's a number + try: + value_repr = l[i] + value = float(value_repr) + except ValueError: + value = None + + if value is not None: + # Token is a number + len_li = len(l[i]) + i += 1 + if (len(ymd) == 3 and len_li in (2, 4) + and (i >= len_l or (l[i] != ':' and + info.hms(l[i]) is None))): + # 19990101T23[59] + s = l[i-1] + res.hour = int(s[:2]) + if len_li == 4: + res.minute = int(s[2:]) + elif len_li == 6 or (len_li > 6 and l[i-1].find('.') == 6): + # YYMMDD or HHMMSS[.ss] + s = l[i-1] + if not ymd and l[i-1].find('.') == -1: + ymd.append(info.convertyear(int(s[:2]))) + ymd.append(int(s[2:4])) + ymd.append(int(s[4:])) + else: + # 19990101T235959[.59] + res.hour = int(s[:2]) + res.minute = int(s[2:4]) + res.second, res.microsecond = _parsems(s[4:]) + elif len_li == 8: + # YYYYMMDD + s = l[i-1] + ymd.append(int(s[:4])) + ymd.append(int(s[4:6])) + ymd.append(int(s[6:])) + elif len_li in (12, 14): + # YYYYMMDDhhmm[ss] + s = l[i-1] + ymd.append(int(s[:4])) + ymd.append(int(s[4:6])) + ymd.append(int(s[6:8])) + res.hour = int(s[8:10]) + res.minute = int(s[10:12]) + if len_li == 14: + res.second = int(s[12:]) + elif ((i < len_l and info.hms(l[i]) is not None) or + (i+1 < len_l and l[i] == ' ' and + info.hms(l[i+1]) is not None)): + # HH[ ]h or MM[ ]m or SS[.ss][ ]s + if l[i] == ' ': + i += 1 + idx = info.hms(l[i]) + while True: + if idx == 0: + res.hour = int(value) + if value%1: + res.minute = int(60*(value%1)) + elif idx == 1: + res.minute = int(value) + if value%1: + res.second = int(60*(value%1)) + elif idx == 2: + res.second, res.microsecond = \ + _parsems(value_repr) + i += 1 + if i >= len_l or idx == 2: + break + # 12h00 + try: + value_repr = l[i] + value = float(value_repr) + except ValueError: + break + else: + i += 1 + idx += 1 + if i < len_l: + newidx = info.hms(l[i]) + if newidx is not None: + idx = newidx + elif i+1 < len_l and l[i] == ':': + # HH:MM[:SS[.ss]] + res.hour = int(value) + i += 1 + value = float(l[i]) + res.minute = int(value) + if value%1: + res.second = int(60*(value%1)) + i += 1 + if i < len_l and l[i] == ':': + res.second, res.microsecond = _parsems(l[i+1]) + i += 2 + elif i < len_l and l[i] in ('-', '/', '.'): + sep = l[i] + ymd.append(int(value)) + i += 1 + if i < len_l and not info.jump(l[i]): + try: + # 01-01[-01] + ymd.append(int(l[i])) + except ValueError: + # 01-Jan[-01] + value = info.month(l[i]) + if value is not None: + ymd.append(value) + assert mstridx == -1 + mstridx = len(ymd)-1 + else: + return None + i += 1 + if i < len_l and l[i] == sep: + # We have three members + i += 1 + value = info.month(l[i]) + if value is not None: + ymd.append(value) + mstridx = len(ymd)-1 + assert mstridx == -1 + else: + ymd.append(int(l[i])) + i += 1 + elif i >= len_l or info.jump(l[i]): + if i+1 < len_l and info.ampm(l[i+1]) is not None: + # 12 am + res.hour = int(value) + if res.hour < 12 and info.ampm(l[i+1]) == 1: + res.hour += 12 + elif res.hour == 12 and info.ampm(l[i+1]) == 0: + res.hour = 0 + i += 1 + else: + # Year, month or day + ymd.append(int(value)) + i += 1 + elif info.ampm(l[i]) is not None: + # 12am + res.hour = int(value) + if res.hour < 12 and info.ampm(l[i]) == 1: + res.hour += 12 + elif res.hour == 12 and info.ampm(l[i]) == 0: + res.hour = 0 + i += 1 + elif not fuzzy: + return None + else: + i += 1 + continue + + # Check weekday + value = info.weekday(l[i]) + if value is not None: + res.weekday = value + i += 1 + continue + + # Check month name + value = info.month(l[i]) + if value is not None: + ymd.append(value) + assert mstridx == -1 + mstridx = len(ymd)-1 + i += 1 + if i < len_l: + if l[i] in ('-', '/'): + # Jan-01[-99] + sep = l[i] + i += 1 + ymd.append(int(l[i])) + i += 1 + if i < len_l and l[i] == sep: + # Jan-01-99 + i += 1 + ymd.append(int(l[i])) + i += 1 + elif (i+3 < len_l and l[i] == l[i+2] == ' ' + and info.pertain(l[i+1])): + # Jan of 01 + # In this case, 01 is clearly year + try: + value = int(l[i+3]) + except ValueError: + # Wrong guess + pass + else: + # Convert it here to become unambiguous + ymd.append(info.convertyear(value)) + i += 4 + continue + + # Check am/pm + value = info.ampm(l[i]) + if value is not None: + if value == 1 and res.hour < 12: + res.hour += 12 + elif value == 0 and res.hour == 12: + res.hour = 0 + i += 1 + continue + + # Check for a timezone name + if (res.hour is not None and len(l[i]) <= 5 and + res.tzname is None and res.tzoffset is None and + not [x for x in l[i] if x not in string.ascii_uppercase]): + res.tzname = l[i] + res.tzoffset = info.tzoffset(res.tzname) + i += 1 + + # Check for something like GMT+3, or BRST+3. Notice + # that it doesn't mean "I am 3 hours after GMT", but + # "my time +3 is GMT". If found, we reverse the + # logic so that timezone parsing code will get it + # right. + if i < len_l and l[i] in ('+', '-'): + l[i] = ('+', '-')[l[i] == '+'] + res.tzoffset = None + if info.utczone(res.tzname): + # With something like GMT+3, the timezone + # is *not* GMT. + res.tzname = None + + continue + + # Check for a numbered timezone + if res.hour is not None and l[i] in ('+', '-'): + signal = (-1,1)[l[i] == '+'] + i += 1 + len_li = len(l[i]) + if len_li == 4: + # -0300 + res.tzoffset = int(l[i][:2])*3600+int(l[i][2:])*60 + elif i+1 < len_l and l[i+1] == ':': + # -03:00 + res.tzoffset = int(l[i])*3600+int(l[i+2])*60 + i += 2 + elif len_li <= 2: + # -[0]3 + res.tzoffset = int(l[i][:2])*3600 + else: + return None + i += 1 + res.tzoffset *= signal + + # Look for a timezone name between parenthesis + if (i+3 < len_l and + info.jump(l[i]) and l[i+1] == '(' and l[i+3] == ')' and + 3 <= len(l[i+2]) <= 5 and + not [x for x in l[i+2] + if x not in string.ascii_uppercase]): + # -0300 (BRST) + res.tzname = l[i+2] + i += 4 + continue + + # Check jumps + if not (info.jump(l[i]) or fuzzy): + return None + + i += 1 + + # Process year/month/day + len_ymd = len(ymd) + if len_ymd > 3: + # More than three members!? + return None + elif len_ymd == 1 or (mstridx != -1 and len_ymd == 2): + # One member, or two members with a month string + if mstridx != -1: + res.month = ymd[mstridx] + del ymd[mstridx] + if len_ymd > 1 or mstridx == -1: + if ymd[0] > 31: + res.year = ymd[0] + else: + res.day = ymd[0] + elif len_ymd == 2: + # Two members with numbers + if ymd[0] > 31: + # 99-01 + res.year, res.month = ymd + elif ymd[1] > 31: + # 01-99 + res.month, res.year = ymd + elif dayfirst and ymd[1] <= 12: + # 13-01 + res.day, res.month = ymd + else: + # 01-13 + res.month, res.day = ymd + if len_ymd == 3: + # Three members + if mstridx == 0: + res.month, res.day, res.year = ymd + elif mstridx == 1: + if ymd[0] > 31 or (yearfirst and ymd[2] <= 31): + # 99-Jan-01 + res.year, res.month, res.day = ymd + else: + # 01-Jan-01 + # Give precendence to day-first, since + # two-digit years is usually hand-written. + res.day, res.month, res.year = ymd + elif mstridx == 2: + # WTF!? + if ymd[1] > 31: + # 01-99-Jan + res.day, res.year, res.month = ymd + else: + # 99-01-Jan + res.year, res.day, res.month = ymd + else: + if ymd[0] > 31 or \ + (yearfirst and ymd[1] <= 12 and ymd[2] <= 31): + # 99-01-01 + res.year, res.month, res.day = ymd + elif ymd[0] > 12 or (dayfirst and ymd[1] <= 12): + # 13-01-01 + res.day, res.month, res.year = ymd + else: + # 01-13-01 + res.month, res.day, res.year = ymd + + except (IndexError, ValueError, AssertionError): + return None + + if not info.validate(res): + return None + return res + +DEFAULTPARSER = parser() +def parse(timestr, parserinfo=None, **kwargs): + if parserinfo: + return parser(parserinfo).parse(timestr, **kwargs) + else: + return DEFAULTPARSER.parse(timestr, **kwargs) + + +class _tzparser(object): + + class _result(_resultbase): + + __slots__ = ["stdabbr", "stdoffset", "dstabbr", "dstoffset", + "start", "end"] + + class _attr(_resultbase): + __slots__ = ["month", "week", "weekday", + "yday", "jyday", "day", "time"] + + def __repr__(self): + return self._repr("") + + def __init__(self): + _resultbase.__init__(self) + self.start = self._attr() + self.end = self._attr() + + def parse(self, tzstr): + res = self._result() + l = _timelex.split(tzstr) + try: + + len_l = len(l) + + i = 0 + while i < len_l: + # BRST+3[BRDT[+2]] + j = i + while j < len_l and not [x for x in l[j] + if x in "0123456789:,-+"]: + j += 1 + if j != i: + if not res.stdabbr: + offattr = "stdoffset" + res.stdabbr = "".join(l[i:j]) + else: + offattr = "dstoffset" + res.dstabbr = "".join(l[i:j]) + i = j + if (i < len_l and + (l[i] in ('+', '-') or l[i][0] in "0123456789")): + if l[i] in ('+', '-'): + # Yes, that's right. See the TZ variable + # documentation. + signal = (1,-1)[l[i] == '+'] + i += 1 + else: + signal = -1 + len_li = len(l[i]) + if len_li == 4: + # -0300 + setattr(res, offattr, + (int(l[i][:2])*3600+int(l[i][2:])*60)*signal) + elif i+1 < len_l and l[i+1] == ':': + # -03:00 + setattr(res, offattr, + (int(l[i])*3600+int(l[i+2])*60)*signal) + i += 2 + elif len_li <= 2: + # -[0]3 + setattr(res, offattr, + int(l[i][:2])*3600*signal) + else: + return None + i += 1 + if res.dstabbr: + break + else: + break + + if i < len_l: + for j in range(i, len_l): + if l[j] == ';': l[j] = ',' + + assert l[i] == ',' + + i += 1 + + if i >= len_l: + pass + elif (8 <= l.count(',') <= 9 and + not [y for x in l[i:] if x != ',' + for y in x if y not in "0123456789"]): + # GMT0BST,3,0,30,3600,10,0,26,7200[,3600] + for x in (res.start, res.end): + x.month = int(l[i]) + i += 2 + if l[i] == '-': + value = int(l[i+1])*-1 + i += 1 + else: + value = int(l[i]) + i += 2 + if value: + x.week = value + x.weekday = (int(l[i])-1)%7 + else: + x.day = int(l[i]) + i += 2 + x.time = int(l[i]) + i += 2 + if i < len_l: + if l[i] in ('-','+'): + signal = (-1,1)[l[i] == "+"] + i += 1 + else: + signal = 1 + res.dstoffset = (res.stdoffset+int(l[i]))*signal + elif (l.count(',') == 2 and l[i:].count('/') <= 2 and + not [y for x in l[i:] if x not in (',','/','J','M', + '.','-',':') + for y in x if y not in "0123456789"]): + for x in (res.start, res.end): + if l[i] == 'J': + # non-leap year day (1 based) + i += 1 + x.jyday = int(l[i]) + elif l[i] == 'M': + # month[-.]week[-.]weekday + i += 1 + x.month = int(l[i]) + i += 1 + assert l[i] in ('-', '.') + i += 1 + x.week = int(l[i]) + if x.week == 5: + x.week = -1 + i += 1 + assert l[i] in ('-', '.') + i += 1 + x.weekday = (int(l[i])-1)%7 + else: + # year day (zero based) + x.yday = int(l[i])+1 + + i += 1 + + if i < len_l and l[i] == '/': + i += 1 + # start time + len_li = len(l[i]) + if len_li == 4: + # -0300 + x.time = (int(l[i][:2])*3600+int(l[i][2:])*60) + elif i+1 < len_l and l[i+1] == ':': + # -03:00 + x.time = int(l[i])*3600+int(l[i+2])*60 + i += 2 + if i+1 < len_l and l[i+1] == ':': + i += 2 + x.time += int(l[i]) + elif len_li <= 2: + # -[0]3 + x.time = (int(l[i][:2])*3600) + else: + return None + i += 1 + + assert i == len_l or l[i] == ',' + + i += 1 + + assert i >= len_l + + except (IndexError, ValueError, AssertionError): + return None + + return res + + +DEFAULTTZPARSER = _tzparser() +def _parsetz(tzstr): + return DEFAULTTZPARSER.parse(tzstr) + + +def _parsems(value): + """Parse a I[.F] seconds value into (seconds, microseconds).""" + if "." not in value: + return int(value), 0 + else: + i, f = value.split(".") + return int(i), int(f.ljust(6, "0")[:6]) + + +# vim:ts=4:sw=4:et diff --git a/lib/dateutil/relativedelta.py b/lib/dateutil/relativedelta.py new file mode 100644 index 00000000..9735819b --- /dev/null +++ b/lib/dateutil/relativedelta.py @@ -0,0 +1,432 @@ +""" +Copyright (c) 2003-2010 Gustavo Niemeyer <gustavo@niemeyer.net> + +This module offers extensions to the standard python 2.3+ +datetime module. +""" +__author__ = "Gustavo Niemeyer <gustavo@niemeyer.net>" +__license__ = "PSF License" + +import datetime +import calendar + +__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"] + +class weekday(object): + __slots__ = ["weekday", "n"] + + def __init__(self, weekday, n=None): + self.weekday = weekday + self.n = n + + def __call__(self, n): + if n == self.n: + return self + else: + return self.__class__(self.weekday, n) + + def __eq__(self, other): + try: + if self.weekday != other.weekday or self.n != other.n: + return False + except AttributeError: + return False + return True + + def __repr__(self): + s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday] + if not self.n: + return s + else: + return "%s(%+d)" % (s, self.n) + +MO, TU, WE, TH, FR, SA, SU = weekdays = tuple([weekday(x) for x in range(7)]) + +class relativedelta: + """ +The relativedelta type is based on the specification of the excelent +work done by M.-A. Lemburg in his mx.DateTime extension. However, +notice that this type does *NOT* implement the same algorithm as +his work. Do *NOT* expect it to behave like mx.DateTime's counterpart. + +There's two different ways to build a relativedelta instance. The +first one is passing it two date/datetime classes: + + relativedelta(datetime1, datetime2) + +And the other way is to use the following keyword arguments: + + year, month, day, hour, minute, second, microsecond: + Absolute information. + + years, months, weeks, days, hours, minutes, seconds, microseconds: + Relative information, may be negative. + + weekday: + One of the weekday instances (MO, TU, etc). These instances may + receive a parameter N, specifying the Nth weekday, which could + be positive or negative (like MO(+1) or MO(-2). Not specifying + it is the same as specifying +1. You can also use an integer, + where 0=MO. + + leapdays: + Will add given days to the date found, if year is a leap + year, and the date found is post 28 of february. + + yearday, nlyearday: + Set the yearday or the non-leap year day (jump leap days). + These are converted to day/month/leapdays information. + +Here is the behavior of operations with relativedelta: + +1) Calculate the absolute year, using the 'year' argument, or the + original datetime year, if the argument is not present. + +2) Add the relative 'years' argument to the absolute year. + +3) Do steps 1 and 2 for month/months. + +4) Calculate the absolute day, using the 'day' argument, or the + original datetime day, if the argument is not present. Then, + subtract from the day until it fits in the year and month + found after their operations. + +5) Add the relative 'days' argument to the absolute day. Notice + that the 'weeks' argument is multiplied by 7 and added to + 'days'. + +6) Do steps 1 and 2 for hour/hours, minute/minutes, second/seconds, + microsecond/microseconds. + +7) If the 'weekday' argument is present, calculate the weekday, + with the given (wday, nth) tuple. wday is the index of the + weekday (0-6, 0=Mon), and nth is the number of weeks to add + forward or backward, depending on its signal. Notice that if + the calculated date is already Monday, for example, using + (0, 1) or (0, -1) won't change the day. + """ + + def __init__(self, dt1=None, dt2=None, + years=0, months=0, days=0, leapdays=0, weeks=0, + hours=0, minutes=0, seconds=0, microseconds=0, + year=None, month=None, day=None, weekday=None, + yearday=None, nlyearday=None, + hour=None, minute=None, second=None, microsecond=None): + if dt1 and dt2: + if not isinstance(dt1, datetime.date) or \ + not isinstance(dt2, datetime.date): + raise TypeError, "relativedelta only diffs datetime/date" + if type(dt1) is not type(dt2): + if not isinstance(dt1, datetime.datetime): + dt1 = datetime.datetime.fromordinal(dt1.toordinal()) + elif not isinstance(dt2, datetime.datetime): + dt2 = datetime.datetime.fromordinal(dt2.toordinal()) + self.years = 0 + self.months = 0 + self.days = 0 + self.leapdays = 0 + self.hours = 0 + self.minutes = 0 + self.seconds = 0 + self.microseconds = 0 + self.year = None + self.month = None + self.day = None + self.weekday = None + self.hour = None + self.minute = None + self.second = None + self.microsecond = None + self._has_time = 0 + + months = (dt1.year*12+dt1.month)-(dt2.year*12+dt2.month) + self._set_months(months) + dtm = self.__radd__(dt2) + if dt1 < dt2: + while dt1 > dtm: + months += 1 + self._set_months(months) + dtm = self.__radd__(dt2) + else: + while dt1 < dtm: + months -= 1 + self._set_months(months) + dtm = self.__radd__(dt2) + delta = dt1 - dtm + self.seconds = delta.seconds+delta.days*86400 + self.microseconds = delta.microseconds + else: + self.years = years + self.months = months + self.days = days+weeks*7 + self.leapdays = leapdays + self.hours = hours + self.minutes = minutes + self.seconds = seconds + self.microseconds = microseconds + self.year = year + self.month = month + self.day = day + self.hour = hour + self.minute = minute + self.second = second + self.microsecond = microsecond + + if type(weekday) is int: + self.weekday = weekdays[weekday] + else: + self.weekday = weekday + + yday = 0 + if nlyearday: + yday = nlyearday + elif yearday: + yday = yearday + if yearday > 59: + self.leapdays = -1 + if yday: + ydayidx = [31,59,90,120,151,181,212,243,273,304,334,366] + for idx, ydays in enumerate(ydayidx): + if yday <= ydays: + self.month = idx+1 + if idx == 0: + self.day = yday + else: + self.day = yday-ydayidx[idx-1] + break + else: + raise ValueError, "invalid year day (%d)" % yday + + self._fix() + + def _fix(self): + if abs(self.microseconds) > 999999: + s = self.microseconds//abs(self.microseconds) + div, mod = divmod(self.microseconds*s, 1000000) + self.microseconds = mod*s + self.seconds += div*s + if abs(self.seconds) > 59: + s = self.seconds//abs(self.seconds) + div, mod = divmod(self.seconds*s, 60) + self.seconds = mod*s + self.minutes += div*s + if abs(self.minutes) > 59: + s = self.minutes//abs(self.minutes) + div, mod = divmod(self.minutes*s, 60) + self.minutes = mod*s + self.hours += div*s + if abs(self.hours) > 23: + s = self.hours//abs(self.hours) + div, mod = divmod(self.hours*s, 24) + self.hours = mod*s + self.days += div*s + if abs(self.months) > 11: + s = self.months//abs(self.months) + div, mod = divmod(self.months*s, 12) + self.months = mod*s + self.years += div*s + if (self.hours or self.minutes or self.seconds or self.microseconds or + self.hour is not None or self.minute is not None or + self.second is not None or self.microsecond is not None): + self._has_time = 1 + else: + self._has_time = 0 + + def _set_months(self, months): + self.months = months + if abs(self.months) > 11: + s = self.months//abs(self.months) + div, mod = divmod(self.months*s, 12) + self.months = mod*s + self.years = div*s + else: + self.years = 0 + + def __radd__(self, other): + if not isinstance(other, datetime.date): + raise TypeError, "unsupported type for add operation" + elif self._has_time and not isinstance(other, datetime.datetime): + other = datetime.datetime.fromordinal(other.toordinal()) + year = (self.year or other.year)+self.years + month = self.month or other.month + if self.months: + assert 1 <= abs(self.months) <= 12 + month += self.months + if month > 12: + year += 1 + month -= 12 + elif month < 1: + year -= 1 + month += 12 + day = min(calendar.monthrange(year, month)[1], + self.day or other.day) + repl = {"year": year, "month": month, "day": day} + for attr in ["hour", "minute", "second", "microsecond"]: + value = getattr(self, attr) + if value is not None: + repl[attr] = value + days = self.days + if self.leapdays and month > 2 and calendar.isleap(year): + days += self.leapdays + ret = (other.replace(**repl) + + datetime.timedelta(days=days, + hours=self.hours, + minutes=self.minutes, + seconds=self.seconds, + microseconds=self.microseconds)) + if self.weekday: + weekday, nth = self.weekday.weekday, self.weekday.n or 1 + jumpdays = (abs(nth)-1)*7 + if nth > 0: + jumpdays += (7-ret.weekday()+weekday)%7 + else: + jumpdays += (ret.weekday()-weekday)%7 + jumpdays *= -1 + ret += datetime.timedelta(days=jumpdays) + return ret + + def __rsub__(self, other): + return self.__neg__().__radd__(other) + + def __add__(self, other): + if not isinstance(other, relativedelta): + raise TypeError, "unsupported type for add operation" + return relativedelta(years=other.years+self.years, + months=other.months+self.months, + days=other.days+self.days, + hours=other.hours+self.hours, + minutes=other.minutes+self.minutes, + seconds=other.seconds+self.seconds, + microseconds=other.microseconds+self.microseconds, + leapdays=other.leapdays or self.leapdays, + year=other.year or self.year, + month=other.month or self.month, + day=other.day or self.day, + weekday=other.weekday or self.weekday, + hour=other.hour or self.hour, + minute=other.minute or self.minute, + second=other.second or self.second, + microsecond=other.second or self.microsecond) + + def __sub__(self, other): + if not isinstance(other, relativedelta): + raise TypeError, "unsupported type for sub operation" + return relativedelta(years=other.years-self.years, + months=other.months-self.months, + days=other.days-self.days, + hours=other.hours-self.hours, + minutes=other.minutes-self.minutes, + seconds=other.seconds-self.seconds, + microseconds=other.microseconds-self.microseconds, + leapdays=other.leapdays or self.leapdays, + year=other.year or self.year, + month=other.month or self.month, + day=other.day or self.day, + weekday=other.weekday or self.weekday, + hour=other.hour or self.hour, + minute=other.minute or self.minute, + second=other.second or self.second, + microsecond=other.second or self.microsecond) + + def __neg__(self): + return relativedelta(years=-self.years, + months=-self.months, + days=-self.days, + hours=-self.hours, + minutes=-self.minutes, + seconds=-self.seconds, + microseconds=-self.microseconds, + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + + def __nonzero__(self): + return not (not self.years and + not self.months and + not self.days and + not self.hours and + not self.minutes and + not self.seconds and + not self.microseconds and + not self.leapdays and + self.year is None and + self.month is None and + self.day is None and + self.weekday is None and + self.hour is None and + self.minute is None and + self.second is None and + self.microsecond is None) + + def __mul__(self, other): + f = float(other) + return relativedelta(years = int(round(self.years*f)), + months = int(round(self.months*f)), + days = int(round(self.days*f)), + hours = int(round(self.hours*f)), + minutes = int(round(self.minutes*f)), + seconds = int(round(self.seconds*f)), + microseconds = self.microseconds*f, + leapdays = self.leapdays, + year = self.year, + month = self.month, + day = self.day, + weekday = self.weekday, + hour = self.hour, + minute = self.minute, + second = self.second, + microsecond = self.microsecond) + + def __eq__(self, other): + if not isinstance(other, relativedelta): + return False + if self.weekday or other.weekday: + if not self.weekday or not other.weekday: + return False + if self.weekday.weekday != other.weekday.weekday: + return False + n1, n2 = self.weekday.n, other.weekday.n + if n1 != n2 and not ((not n1 or n1 == 1) and (not n2 or n2 == 1)): + return False + return (self.years == other.years and + self.months == other.months and + self.days == other.days and + self.hours == other.hours and + self.minutes == other.minutes and + self.seconds == other.seconds and + self.leapdays == other.leapdays and + self.year == other.year and + self.month == other.month and + self.day == other.day and + self.hour == other.hour and + self.minute == other.minute and + self.second == other.second and + self.microsecond == other.microsecond) + + def __ne__(self, other): + return not self.__eq__(other) + + def __div__(self, other): + return self.__mul__(1/float(other)) + + def __repr__(self): + l = [] + for attr in ["years", "months", "days", "leapdays", + "hours", "minutes", "seconds", "microseconds"]: + value = getattr(self, attr) + if value: + l.append("%s=%+d" % (attr, value)) + for attr in ["year", "month", "day", "weekday", + "hour", "minute", "second", "microsecond"]: + value = getattr(self, attr) + if value is not None: + l.append("%s=%s" % (attr, `value`)) + return "%s(%s)" % (self.__class__.__name__, ", ".join(l)) + +# vim:ts=4:sw=4:et diff --git a/lib/dateutil/rrule.py b/lib/dateutil/rrule.py new file mode 100644 index 00000000..34722dff --- /dev/null +++ b/lib/dateutil/rrule.py @@ -0,0 +1,1108 @@ +""" +Copyright (c) 2003-2010 Gustavo Niemeyer <gustavo@niemeyer.net> + +This module offers extensions to the standard python 2.3+ +datetime module. +""" +__author__ = "Gustavo Niemeyer <gustavo@niemeyer.net>" +__license__ = "PSF License" + +import itertools +import datetime +import calendar +import thread +import heapq +import sys + +__all__ = ["rrule", "rruleset", "rrulestr", + "YEARLY", "MONTHLY", "WEEKLY", "DAILY", + "HOURLY", "MINUTELY", "SECONDLY", + "MO", "TU", "WE", "TH", "FR", "SA", "SU"] + +# Every mask is 7 days longer to handle cross-year weekly periods. +M366MASK = tuple([1]*31+[2]*29+[3]*31+[4]*30+[5]*31+[6]*30+ + [7]*31+[8]*31+[9]*30+[10]*31+[11]*30+[12]*31+[1]*7) +M365MASK = list(M366MASK) +M29, M30, M31 = range(1,30), range(1,31), range(1,32) +MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) +MDAY365MASK = list(MDAY366MASK) +M29, M30, M31 = range(-29,0), range(-30,0), range(-31,0) +NMDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) +NMDAY365MASK = list(NMDAY366MASK) +M366RANGE = (0,31,60,91,121,152,182,213,244,274,305,335,366) +M365RANGE = (0,31,59,90,120,151,181,212,243,273,304,334,365) +WDAYMASK = [0,1,2,3,4,5,6]*55 +del M29, M30, M31, M365MASK[59], MDAY365MASK[59], NMDAY365MASK[31] +MDAY365MASK = tuple(MDAY365MASK) +M365MASK = tuple(M365MASK) + +(YEARLY, + MONTHLY, + WEEKLY, + DAILY, + HOURLY, + MINUTELY, + SECONDLY) = range(7) + +# Imported on demand. +easter = None +parser = None + +class weekday(object): + __slots__ = ["weekday", "n"] + + def __init__(self, weekday, n=None): + if n == 0: + raise ValueError, "Can't create weekday with n == 0" + self.weekday = weekday + self.n = n + + def __call__(self, n): + if n == self.n: + return self + else: + return self.__class__(self.weekday, n) + + def __eq__(self, other): + try: + if self.weekday != other.weekday or self.n != other.n: + return False + except AttributeError: + return False + return True + + def __repr__(self): + s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday] + if not self.n: + return s + else: + return "%s(%+d)" % (s, self.n) + +MO, TU, WE, TH, FR, SA, SU = weekdays = tuple([weekday(x) for x in range(7)]) + +class rrulebase: + def __init__(self, cache=False): + if cache: + self._cache = [] + self._cache_lock = thread.allocate_lock() + self._cache_gen = self._iter() + self._cache_complete = False + else: + self._cache = None + self._cache_complete = False + self._len = None + + def __iter__(self): + if self._cache_complete: + return iter(self._cache) + elif self._cache is None: + return self._iter() + else: + return self._iter_cached() + + def _iter_cached(self): + i = 0 + gen = self._cache_gen + cache = self._cache + acquire = self._cache_lock.acquire + release = self._cache_lock.release + while gen: + if i == len(cache): + acquire() + if self._cache_complete: + break + try: + for j in range(10): + cache.append(gen.next()) + except StopIteration: + self._cache_gen = gen = None + self._cache_complete = True + break + release() + yield cache[i] + i += 1 + while i < self._len: + yield cache[i] + i += 1 + + def __getitem__(self, item): + if self._cache_complete: + return self._cache[item] + elif isinstance(item, slice): + if item.step and item.step < 0: + return list(iter(self))[item] + else: + return list(itertools.islice(self, + item.start or 0, + item.stop or sys.maxint, + item.step or 1)) + elif item >= 0: + gen = iter(self) + try: + for i in range(item+1): + res = gen.next() + except StopIteration: + raise IndexError + return res + else: + return list(iter(self))[item] + + def __contains__(self, item): + if self._cache_complete: + return item in self._cache + else: + for i in self: + if i == item: + return True + elif i > item: + return False + return False + + # __len__() introduces a large performance penality. + def count(self): + if self._len is None: + for x in self: pass + return self._len + + def before(self, dt, inc=False): + if self._cache_complete: + gen = self._cache + else: + gen = self + last = None + if inc: + for i in gen: + if i > dt: + break + last = i + else: + for i in gen: + if i >= dt: + break + last = i + return last + + def after(self, dt, inc=False): + if self._cache_complete: + gen = self._cache + else: + gen = self + if inc: + for i in gen: + if i >= dt: + return i + else: + for i in gen: + if i > dt: + return i + return None + + def between(self, after, before, inc=False): + if self._cache_complete: + gen = self._cache + else: + gen = self + started = False + l = [] + if inc: + for i in gen: + if i > before: + break + elif not started: + if i >= after: + started = True + l.append(i) + else: + l.append(i) + else: + for i in gen: + if i >= before: + break + elif not started: + if i > after: + started = True + l.append(i) + else: + l.append(i) + return l + +class rrule(rrulebase): + def __init__(self, freq, dtstart=None, + interval=1, wkst=None, count=None, until=None, bysetpos=None, + bymonth=None, bymonthday=None, byyearday=None, byeaster=None, + byweekno=None, byweekday=None, + byhour=None, byminute=None, bysecond=None, + cache=False): + rrulebase.__init__(self, cache) + global easter + if not dtstart: + dtstart = datetime.datetime.now().replace(microsecond=0) + elif not isinstance(dtstart, datetime.datetime): + dtstart = datetime.datetime.fromordinal(dtstart.toordinal()) + else: + dtstart = dtstart.replace(microsecond=0) + self._dtstart = dtstart + self._tzinfo = dtstart.tzinfo + self._freq = freq + self._interval = interval + self._count = count + if until and not isinstance(until, datetime.datetime): + until = datetime.datetime.fromordinal(until.toordinal()) + self._until = until + if wkst is None: + self._wkst = calendar.firstweekday() + elif type(wkst) is int: + self._wkst = wkst + else: + self._wkst = wkst.weekday + if bysetpos is None: + self._bysetpos = None + elif type(bysetpos) is int: + if bysetpos == 0 or not (-366 <= bysetpos <= 366): + raise ValueError("bysetpos must be between 1 and 366, " + "or between -366 and -1") + self._bysetpos = (bysetpos,) + else: + self._bysetpos = tuple(bysetpos) + for pos in self._bysetpos: + if pos == 0 or not (-366 <= pos <= 366): + raise ValueError("bysetpos must be between 1 and 366, " + "or between -366 and -1") + if not (byweekno or byyearday or bymonthday or + byweekday is not None or byeaster is not None): + if freq == YEARLY: + if not bymonth: + bymonth = dtstart.month + bymonthday = dtstart.day + elif freq == MONTHLY: + bymonthday = dtstart.day + elif freq == WEEKLY: + byweekday = dtstart.weekday() + # bymonth + if not bymonth: + self._bymonth = None + elif type(bymonth) is int: + self._bymonth = (bymonth,) + else: + self._bymonth = tuple(bymonth) + # byyearday + if not byyearday: + self._byyearday = None + elif type(byyearday) is int: + self._byyearday = (byyearday,) + else: + self._byyearday = tuple(byyearday) + # byeaster + if byeaster is not None: + if not easter: + from dateutil import easter + if type(byeaster) is int: + self._byeaster = (byeaster,) + else: + self._byeaster = tuple(byeaster) + else: + self._byeaster = None + # bymonthay + if not bymonthday: + self._bymonthday = () + self._bynmonthday = () + elif type(bymonthday) is int: + if bymonthday < 0: + self._bynmonthday = (bymonthday,) + self._bymonthday = () + else: + self._bymonthday = (bymonthday,) + self._bynmonthday = () + else: + self._bymonthday = tuple([x for x in bymonthday if x > 0]) + self._bynmonthday = tuple([x for x in bymonthday if x < 0]) + # byweekno + if byweekno is None: + self._byweekno = None + elif type(byweekno) is int: + self._byweekno = (byweekno,) + else: + self._byweekno = tuple(byweekno) + # byweekday / bynweekday + if byweekday is None: + self._byweekday = None + self._bynweekday = None + elif type(byweekday) is int: + self._byweekday = (byweekday,) + self._bynweekday = None + elif hasattr(byweekday, "n"): + if not byweekday.n or freq > MONTHLY: + self._byweekday = (byweekday.weekday,) + self._bynweekday = None + else: + self._bynweekday = ((byweekday.weekday, byweekday.n),) + self._byweekday = None + else: + self._byweekday = [] + self._bynweekday = [] + for wday in byweekday: + if type(wday) is int: + self._byweekday.append(wday) + elif not wday.n or freq > MONTHLY: + self._byweekday.append(wday.weekday) + else: + self._bynweekday.append((wday.weekday, wday.n)) + self._byweekday = tuple(self._byweekday) + self._bynweekday = tuple(self._bynweekday) + if not self._byweekday: + self._byweekday = None + elif not self._bynweekday: + self._bynweekday = None + # byhour + if byhour is None: + if freq < HOURLY: + self._byhour = (dtstart.hour,) + else: + self._byhour = None + elif type(byhour) is int: + self._byhour = (byhour,) + else: + self._byhour = tuple(byhour) + # byminute + if byminute is None: + if freq < MINUTELY: + self._byminute = (dtstart.minute,) + else: + self._byminute = None + elif type(byminute) is int: + self._byminute = (byminute,) + else: + self._byminute = tuple(byminute) + # bysecond + if bysecond is None: + if freq < SECONDLY: + self._bysecond = (dtstart.second,) + else: + self._bysecond = None + elif type(bysecond) is int: + self._bysecond = (bysecond,) + else: + self._bysecond = tuple(bysecond) + + if self._freq >= HOURLY: + self._timeset = None + else: + self._timeset = [] + for hour in self._byhour: + for minute in self._byminute: + for second in self._bysecond: + self._timeset.append( + datetime.time(hour, minute, second, + tzinfo=self._tzinfo)) + self._timeset.sort() + self._timeset = tuple(self._timeset) + + def _iter(self): + year, month, day, hour, minute, second, weekday, yearday, _ = \ + self._dtstart.timetuple() + + # Some local variables to speed things up a bit + freq = self._freq + interval = self._interval + wkst = self._wkst + until = self._until + bymonth = self._bymonth + byweekno = self._byweekno + byyearday = self._byyearday + byweekday = self._byweekday + byeaster = self._byeaster + bymonthday = self._bymonthday + bynmonthday = self._bynmonthday + bysetpos = self._bysetpos + byhour = self._byhour + byminute = self._byminute + bysecond = self._bysecond + + ii = _iterinfo(self) + ii.rebuild(year, month) + + getdayset = {YEARLY:ii.ydayset, + MONTHLY:ii.mdayset, + WEEKLY:ii.wdayset, + DAILY:ii.ddayset, + HOURLY:ii.ddayset, + MINUTELY:ii.ddayset, + SECONDLY:ii.ddayset}[freq] + + if freq < HOURLY: + timeset = self._timeset + else: + gettimeset = {HOURLY:ii.htimeset, + MINUTELY:ii.mtimeset, + SECONDLY:ii.stimeset}[freq] + if ((freq >= HOURLY and + self._byhour and hour not in self._byhour) or + (freq >= MINUTELY and + self._byminute and minute not in self._byminute) or + (freq >= SECONDLY and + self._bysecond and second not in self._bysecond)): + timeset = () + else: + timeset = gettimeset(hour, minute, second) + + total = 0 + count = self._count + while True: + # Get dayset with the right frequency + dayset, start, end = getdayset(year, month, day) + + # Do the "hard" work ;-) + filtered = False + for i in dayset[start:end]: + if ((bymonth and ii.mmask[i] not in bymonth) or + (byweekno and not ii.wnomask[i]) or + (byweekday and ii.wdaymask[i] not in byweekday) or + (ii.nwdaymask and not ii.nwdaymask[i]) or + (byeaster and not ii.eastermask[i]) or + ((bymonthday or bynmonthday) and + ii.mdaymask[i] not in bymonthday and + ii.nmdaymask[i] not in bynmonthday) or + (byyearday and + ((i < ii.yearlen and i+1 not in byyearday + and -ii.yearlen+i not in byyearday) or + (i >= ii.yearlen and i+1-ii.yearlen not in byyearday + and -ii.nextyearlen+i-ii.yearlen + not in byyearday)))): + dayset[i] = None + filtered = True + + # Output results + if bysetpos and timeset: + poslist = [] + for pos in bysetpos: + if pos < 0: + daypos, timepos = divmod(pos, len(timeset)) + else: + daypos, timepos = divmod(pos-1, len(timeset)) + try: + i = [x for x in dayset[start:end] + if x is not None][daypos] + time = timeset[timepos] + except IndexError: + pass + else: + date = datetime.date.fromordinal(ii.yearordinal+i) + res = datetime.datetime.combine(date, time) + if res not in poslist: + poslist.append(res) + poslist.sort() + for res in poslist: + if until and res > until: + self._len = total + return + elif res >= self._dtstart: + total += 1 + yield res + if count: + count -= 1 + if not count: + self._len = total + return + else: + for i in dayset[start:end]: + if i is not None: + date = datetime.date.fromordinal(ii.yearordinal+i) + for time in timeset: + res = datetime.datetime.combine(date, time) + if until and res > until: + self._len = total + return + elif res >= self._dtstart: + total += 1 + yield res + if count: + count -= 1 + if not count: + self._len = total + return + + # Handle frequency and interval + fixday = False + if freq == YEARLY: + year += interval + if year > datetime.MAXYEAR: + self._len = total + return + ii.rebuild(year, month) + elif freq == MONTHLY: + month += interval + if month > 12: + div, mod = divmod(month, 12) + month = mod + year += div + if month == 0: + month = 12 + year -= 1 + if year > datetime.MAXYEAR: + self._len = total + return + ii.rebuild(year, month) + elif freq == WEEKLY: + if wkst > weekday: + day += -(weekday+1+(6-wkst))+self._interval*7 + else: + day += -(weekday-wkst)+self._interval*7 + weekday = wkst + fixday = True + elif freq == DAILY: + day += interval + fixday = True + elif freq == HOURLY: + if filtered: + # Jump to one iteration before next day + hour += ((23-hour)//interval)*interval + while True: + hour += interval + div, mod = divmod(hour, 24) + if div: + hour = mod + day += div + fixday = True + if not byhour or hour in byhour: + break + timeset = gettimeset(hour, minute, second) + elif freq == MINUTELY: + if filtered: + # Jump to one iteration before next day + minute += ((1439-(hour*60+minute))//interval)*interval + while True: + minute += interval + div, mod = divmod(minute, 60) + if div: + minute = mod + hour += div + div, mod = divmod(hour, 24) + if div: + hour = mod + day += div + fixday = True + filtered = False + if ((not byhour or hour in byhour) and + (not byminute or minute in byminute)): + break + timeset = gettimeset(hour, minute, second) + elif freq == SECONDLY: + if filtered: + # Jump to one iteration before next day + second += (((86399-(hour*3600+minute*60+second)) + //interval)*interval) + while True: + second += self._interval + div, mod = divmod(second, 60) + if div: + second = mod + minute += div + div, mod = divmod(minute, 60) + if div: + minute = mod + hour += div + div, mod = divmod(hour, 24) + if div: + hour = mod + day += div + fixday = True + if ((not byhour or hour in byhour) and + (not byminute or minute in byminute) and + (not bysecond or second in bysecond)): + break + timeset = gettimeset(hour, minute, second) + + if fixday and day > 28: + daysinmonth = calendar.monthrange(year, month)[1] + if day > daysinmonth: + while day > daysinmonth: + day -= daysinmonth + month += 1 + if month == 13: + month = 1 + year += 1 + if year > datetime.MAXYEAR: + self._len = total + return + daysinmonth = calendar.monthrange(year, month)[1] + ii.rebuild(year, month) + +class _iterinfo(object): + __slots__ = ["rrule", "lastyear", "lastmonth", + "yearlen", "nextyearlen", "yearordinal", "yearweekday", + "mmask", "mrange", "mdaymask", "nmdaymask", + "wdaymask", "wnomask", "nwdaymask", "eastermask"] + + def __init__(self, rrule): + for attr in self.__slots__: + setattr(self, attr, None) + self.rrule = rrule + + def rebuild(self, year, month): + # Every mask is 7 days longer to handle cross-year weekly periods. + rr = self.rrule + if year != self.lastyear: + self.yearlen = 365+calendar.isleap(year) + self.nextyearlen = 365+calendar.isleap(year+1) + firstyday = datetime.date(year, 1, 1) + self.yearordinal = firstyday.toordinal() + self.yearweekday = firstyday.weekday() + + wday = datetime.date(year, 1, 1).weekday() + if self.yearlen == 365: + self.mmask = M365MASK + self.mdaymask = MDAY365MASK + self.nmdaymask = NMDAY365MASK + self.wdaymask = WDAYMASK[wday:] + self.mrange = M365RANGE + else: + self.mmask = M366MASK + self.mdaymask = MDAY366MASK + self.nmdaymask = NMDAY366MASK + self.wdaymask = WDAYMASK[wday:] + self.mrange = M366RANGE + + if not rr._byweekno: + self.wnomask = None + else: + self.wnomask = [0]*(self.yearlen+7) + #no1wkst = firstwkst = self.wdaymask.index(rr._wkst) + no1wkst = firstwkst = (7-self.yearweekday+rr._wkst)%7 + if no1wkst >= 4: + no1wkst = 0 + # Number of days in the year, plus the days we got + # from last year. + wyearlen = self.yearlen+(self.yearweekday-rr._wkst)%7 + else: + # Number of days in the year, minus the days we + # left in last year. + wyearlen = self.yearlen-no1wkst + div, mod = divmod(wyearlen, 7) + numweeks = div+mod//4 + for n in rr._byweekno: + if n < 0: + n += numweeks+1 + if not (0 < n <= numweeks): + continue + if n > 1: + i = no1wkst+(n-1)*7 + if no1wkst != firstwkst: + i -= 7-firstwkst + else: + i = no1wkst + for j in range(7): + self.wnomask[i] = 1 + i += 1 + if self.wdaymask[i] == rr._wkst: + break + if 1 in rr._byweekno: + # Check week number 1 of next year as well + # TODO: Check -numweeks for next year. + i = no1wkst+numweeks*7 + if no1wkst != firstwkst: + i -= 7-firstwkst + if i < self.yearlen: + # If week starts in next year, we + # don't care about it. + for j in range(7): + self.wnomask[i] = 1 + i += 1 + if self.wdaymask[i] == rr._wkst: + break + if no1wkst: + # Check last week number of last year as + # well. If no1wkst is 0, either the year + # started on week start, or week number 1 + # got days from last year, so there are no + # days from last year's last week number in + # this year. + if -1 not in rr._byweekno: + lyearweekday = datetime.date(year-1,1,1).weekday() + lno1wkst = (7-lyearweekday+rr._wkst)%7 + lyearlen = 365+calendar.isleap(year-1) + if lno1wkst >= 4: + lno1wkst = 0 + lnumweeks = 52+(lyearlen+ + (lyearweekday-rr._wkst)%7)%7//4 + else: + lnumweeks = 52+(self.yearlen-no1wkst)%7//4 + else: + lnumweeks = -1 + if lnumweeks in rr._byweekno: + for i in range(no1wkst): + self.wnomask[i] = 1 + + if (rr._bynweekday and + (month != self.lastmonth or year != self.lastyear)): + ranges = [] + if rr._freq == YEARLY: + if rr._bymonth: + for month in rr._bymonth: + ranges.append(self.mrange[month-1:month+1]) + else: + ranges = [(0, self.yearlen)] + elif rr._freq == MONTHLY: + ranges = [self.mrange[month-1:month+1]] + if ranges: + # Weekly frequency won't get here, so we may not + # care about cross-year weekly periods. + self.nwdaymask = [0]*self.yearlen + for first, last in ranges: + last -= 1 + for wday, n in rr._bynweekday: + if n < 0: + i = last+(n+1)*7 + i -= (self.wdaymask[i]-wday)%7 + else: + i = first+(n-1)*7 + i += (7-self.wdaymask[i]+wday)%7 + if first <= i <= last: + self.nwdaymask[i] = 1 + + if rr._byeaster: + self.eastermask = [0]*(self.yearlen+7) + eyday = easter.easter(year).toordinal()-self.yearordinal + for offset in rr._byeaster: + self.eastermask[eyday+offset] = 1 + + self.lastyear = year + self.lastmonth = month + + def ydayset(self, year, month, day): + return range(self.yearlen), 0, self.yearlen + + def mdayset(self, year, month, day): + set = [None]*self.yearlen + start, end = self.mrange[month-1:month+1] + for i in range(start, end): + set[i] = i + return set, start, end + + def wdayset(self, year, month, day): + # We need to handle cross-year weeks here. + set = [None]*(self.yearlen+7) + i = datetime.date(year, month, day).toordinal()-self.yearordinal + start = i + for j in range(7): + set[i] = i + i += 1 + #if (not (0 <= i < self.yearlen) or + # self.wdaymask[i] == self.rrule._wkst): + # This will cross the year boundary, if necessary. + if self.wdaymask[i] == self.rrule._wkst: + break + return set, start, i + + def ddayset(self, year, month, day): + set = [None]*self.yearlen + i = datetime.date(year, month, day).toordinal()-self.yearordinal + set[i] = i + return set, i, i+1 + + def htimeset(self, hour, minute, second): + set = [] + rr = self.rrule + for minute in rr._byminute: + for second in rr._bysecond: + set.append(datetime.time(hour, minute, second, + tzinfo=rr._tzinfo)) + set.sort() + return set + + def mtimeset(self, hour, minute, second): + set = [] + rr = self.rrule + for second in rr._bysecond: + set.append(datetime.time(hour, minute, second, tzinfo=rr._tzinfo)) + set.sort() + return set + + def stimeset(self, hour, minute, second): + return (datetime.time(hour, minute, second, + tzinfo=self.rrule._tzinfo),) + + +class rruleset(rrulebase): + + class _genitem: + def __init__(self, genlist, gen): + try: + self.dt = gen() + genlist.append(self) + except StopIteration: + pass + self.genlist = genlist + self.gen = gen + + def next(self): + try: + self.dt = self.gen() + except StopIteration: + if self.genlist[0] is self: + heapq.heappop(self.genlist) + else: + self.genlist.remove(self) + heapq.heapify(self.genlist) + + def __cmp__(self, other): + return cmp(self.dt, other.dt) + + def __init__(self, cache=False): + rrulebase.__init__(self, cache) + self._rrule = [] + self._rdate = [] + self._exrule = [] + self._exdate = [] + + def rrule(self, rrule): + self._rrule.append(rrule) + + def rdate(self, rdate): + self._rdate.append(rdate) + + def exrule(self, exrule): + self._exrule.append(exrule) + + def exdate(self, exdate): + self._exdate.append(exdate) + + def _iter(self): + rlist = [] + self._rdate.sort() + self._genitem(rlist, iter(self._rdate).next) + for gen in [iter(x).next for x in self._rrule]: + self._genitem(rlist, gen) + heapq.heapify(rlist) + exlist = [] + self._exdate.sort() + self._genitem(exlist, iter(self._exdate).next) + for gen in [iter(x).next for x in self._exrule]: + self._genitem(exlist, gen) + heapq.heapify(exlist) + lastdt = None + total = 0 + while rlist: + ritem = rlist[0] + if not lastdt or lastdt != ritem.dt: + while exlist and exlist[0] < ritem: + exitem = exlist[0] + exitem.next() + if exlist and exlist[0] is exitem: + heapq.heapreplace(exlist, exitem) + if not exlist or ritem != exlist[0]: + total += 1 + yield ritem.dt + lastdt = ritem.dt + ritem.next() + if rlist and rlist[0] is ritem: + heapq.heapreplace(rlist, ritem) + self._len = total + +class _rrulestr: + + _freq_map = {"YEARLY": YEARLY, + "MONTHLY": MONTHLY, + "WEEKLY": WEEKLY, + "DAILY": DAILY, + "HOURLY": HOURLY, + "MINUTELY": MINUTELY, + "SECONDLY": SECONDLY} + + _weekday_map = {"MO":0,"TU":1,"WE":2,"TH":3,"FR":4,"SA":5,"SU":6} + + def _handle_int(self, rrkwargs, name, value, **kwargs): + rrkwargs[name.lower()] = int(value) + + def _handle_int_list(self, rrkwargs, name, value, **kwargs): + rrkwargs[name.lower()] = [int(x) for x in value.split(',')] + + _handle_INTERVAL = _handle_int + _handle_COUNT = _handle_int + _handle_BYSETPOS = _handle_int_list + _handle_BYMONTH = _handle_int_list + _handle_BYMONTHDAY = _handle_int_list + _handle_BYYEARDAY = _handle_int_list + _handle_BYEASTER = _handle_int_list + _handle_BYWEEKNO = _handle_int_list + _handle_BYHOUR = _handle_int_list + _handle_BYMINUTE = _handle_int_list + _handle_BYSECOND = _handle_int_list + + def _handle_FREQ(self, rrkwargs, name, value, **kwargs): + rrkwargs["freq"] = self._freq_map[value] + + def _handle_UNTIL(self, rrkwargs, name, value, **kwargs): + global parser + if not parser: + from dateutil import parser + try: + rrkwargs["until"] = parser.parse(value, + ignoretz=kwargs.get("ignoretz"), + tzinfos=kwargs.get("tzinfos")) + except ValueError: + raise ValueError, "invalid until date" + + def _handle_WKST(self, rrkwargs, name, value, **kwargs): + rrkwargs["wkst"] = self._weekday_map[value] + + def _handle_BYWEEKDAY(self, rrkwargs, name, value, **kwarsg): + l = [] + for wday in value.split(','): + for i in range(len(wday)): + if wday[i] not in '+-0123456789': + break + n = wday[:i] or None + w = wday[i:] + if n: n = int(n) + l.append(weekdays[self._weekday_map[w]](n)) + rrkwargs["byweekday"] = l + + _handle_BYDAY = _handle_BYWEEKDAY + + def _parse_rfc_rrule(self, line, + dtstart=None, + cache=False, + ignoretz=False, + tzinfos=None): + if line.find(':') != -1: + name, value = line.split(':') + if name != "RRULE": + raise ValueError, "unknown parameter name" + else: + value = line + rrkwargs = {} + for pair in value.split(';'): + name, value = pair.split('=') + name = name.upper() + value = value.upper() + try: + getattr(self, "_handle_"+name)(rrkwargs, name, value, + ignoretz=ignoretz, + tzinfos=tzinfos) + except AttributeError: + raise ValueError, "unknown parameter '%s'" % name + except (KeyError, ValueError): + raise ValueError, "invalid '%s': %s" % (name, value) + return rrule(dtstart=dtstart, cache=cache, **rrkwargs) + + def _parse_rfc(self, s, + dtstart=None, + cache=False, + unfold=False, + forceset=False, + compatible=False, + ignoretz=False, + tzinfos=None): + global parser + if compatible: + forceset = True + unfold = True + s = s.upper() + if not s.strip(): + raise ValueError, "empty string" + if unfold: + lines = s.splitlines() + i = 0 + while i < len(lines): + line = lines[i].rstrip() + if not line: + del lines[i] + elif i > 0 and line[0] in (" ", "\t"): + lines[i-1] += line[1:] + del lines[i] + else: + i += 1 + else: + lines = s.split() + if (not forceset and len(lines) == 1 and + (s.find(':') == -1 or s.startswith('RRULE:'))): + return self._parse_rfc_rrule(lines[0], cache=cache, + dtstart=dtstart, ignoretz=ignoretz, + tzinfos=tzinfos) + else: + rrulevals = [] + rdatevals = [] + exrulevals = [] + exdatevals = [] + for line in lines: + if not line: + continue + if line.find(':') == -1: + name = "RRULE" + value = line + else: + name, value = line.split(':', 1) + parms = name.split(';') + if not parms: + raise ValueError, "empty property name" + name = parms[0] + parms = parms[1:] + if name == "RRULE": + for parm in parms: + raise ValueError, "unsupported RRULE parm: "+parm + rrulevals.append(value) + elif name == "RDATE": + for parm in parms: + if parm != "VALUE=DATE-TIME": + raise ValueError, "unsupported RDATE parm: "+parm + rdatevals.append(value) + elif name == "EXRULE": + for parm in parms: + raise ValueError, "unsupported EXRULE parm: "+parm + exrulevals.append(value) + elif name == "EXDATE": + for parm in parms: + if parm != "VALUE=DATE-TIME": + raise ValueError, "unsupported RDATE parm: "+parm + exdatevals.append(value) + elif name == "DTSTART": + for parm in parms: + raise ValueError, "unsupported DTSTART parm: "+parm + if not parser: + from dateutil import parser + dtstart = parser.parse(value, ignoretz=ignoretz, + tzinfos=tzinfos) + elif name.upper().startswith('X-'): + # Ignore experimental properties. + pass + else: + raise ValueError, "unsupported property: "+name + if (forceset or len(rrulevals) > 1 or + rdatevals or exrulevals or exdatevals): + if not parser and (rdatevals or exdatevals): + from dateutil import parser + set = rruleset(cache=cache) + for value in rrulevals: + set.rrule(self._parse_rfc_rrule(value, dtstart=dtstart, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in rdatevals: + for datestr in value.split(','): + set.rdate(parser.parse(datestr, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in exrulevals: + set.exrule(self._parse_rfc_rrule(value, dtstart=dtstart, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in exdatevals: + for datestr in value.split(','): + set.exdate(parser.parse(datestr, + ignoretz=ignoretz, + tzinfos=tzinfos)) + if compatible and dtstart: + set.rdate(dtstart) + return set + else: + return self._parse_rfc_rrule(rrulevals[0], + dtstart=dtstart, + cache=cache, + ignoretz=ignoretz, + tzinfos=tzinfos) + + def __call__(self, s, **kwargs): + return self._parse_rfc(s, **kwargs) + +rrulestr = _rrulestr() + +# vim:ts=4:sw=4:et diff --git a/lib/dateutil/tz.py b/lib/dateutil/tz.py new file mode 100644 index 00000000..2c15a78e --- /dev/null +++ b/lib/dateutil/tz.py @@ -0,0 +1,958 @@ +""" +Copyright (c) 2003-2007 Gustavo Niemeyer <gustavo@niemeyer.net> + +This module offers extensions to the standard python 2.3+ +datetime module. +""" +__author__ = "Gustavo Niemeyer <gustavo@niemeyer.net>" +__license__ = "PSF License" + +import datetime +import struct +import time +import sys +import os + +relativedelta = None +parser = None +rrule = None + +__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange", + "tzstr", "tzical", "tzwin", "tzwinlocal", "gettz"] + +try: + from dateutil.tzwin import tzwin, tzwinlocal +except (ImportError, OSError): + tzwin, tzwinlocal = None, None + +ZERO = datetime.timedelta(0) +EPOCHORDINAL = datetime.datetime.utcfromtimestamp(0).toordinal() + +class tzutc(datetime.tzinfo): + + def utcoffset(self, dt): + return ZERO + + def dst(self, dt): + return ZERO + + def tzname(self, dt): + return "UTC" + + def __eq__(self, other): + return (isinstance(other, tzutc) or + (isinstance(other, tzoffset) and other._offset == ZERO)) + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return "%s()" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + +class tzoffset(datetime.tzinfo): + + def __init__(self, name, offset): + self._name = name + self._offset = datetime.timedelta(seconds=offset) + + def utcoffset(self, dt): + return self._offset + + def dst(self, dt): + return ZERO + + def tzname(self, dt): + return self._name + + def __eq__(self, other): + return (isinstance(other, tzoffset) and + self._offset == other._offset) + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return "%s(%s, %s)" % (self.__class__.__name__, + `self._name`, + self._offset.days*86400+self._offset.seconds) + + __reduce__ = object.__reduce__ + +class tzlocal(datetime.tzinfo): + + _std_offset = datetime.timedelta(seconds=-time.timezone) + if time.daylight: + _dst_offset = datetime.timedelta(seconds=-time.altzone) + else: + _dst_offset = _std_offset + + def utcoffset(self, dt): + if self._isdst(dt): + return self._dst_offset + else: + return self._std_offset + + def dst(self, dt): + if self._isdst(dt): + return self._dst_offset-self._std_offset + else: + return ZERO + + def tzname(self, dt): + return time.tzname[self._isdst(dt)] + + def _isdst(self, dt): + # We can't use mktime here. It is unstable when deciding if + # the hour near to a change is DST or not. + # + # timestamp = time.mktime((dt.year, dt.month, dt.day, dt.hour, + # dt.minute, dt.second, dt.weekday(), 0, -1)) + # return time.localtime(timestamp).tm_isdst + # + # The code above yields the following result: + # + #>>> import tz, datetime + #>>> t = tz.tzlocal() + #>>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + #'BRDT' + #>>> datetime.datetime(2003,2,16,0,tzinfo=t).tzname() + #'BRST' + #>>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + #'BRST' + #>>> datetime.datetime(2003,2,15,22,tzinfo=t).tzname() + #'BRDT' + #>>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + #'BRDT' + # + # Here is a more stable implementation: + # + timestamp = ((dt.toordinal() - EPOCHORDINAL) * 86400 + + dt.hour * 3600 + + dt.minute * 60 + + dt.second) + return time.localtime(timestamp+time.timezone).tm_isdst + + def __eq__(self, other): + if not isinstance(other, tzlocal): + return False + return (self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset) + return True + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return "%s()" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + +class _ttinfo(object): + __slots__ = ["offset", "delta", "isdst", "abbr", "isstd", "isgmt"] + + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, None) + + def __repr__(self): + l = [] + for attr in self.__slots__: + value = getattr(self, attr) + if value is not None: + l.append("%s=%s" % (attr, `value`)) + return "%s(%s)" % (self.__class__.__name__, ", ".join(l)) + + def __eq__(self, other): + if not isinstance(other, _ttinfo): + return False + return (self.offset == other.offset and + self.delta == other.delta and + self.isdst == other.isdst and + self.abbr == other.abbr and + self.isstd == other.isstd and + self.isgmt == other.isgmt) + + def __ne__(self, other): + return not self.__eq__(other) + + def __getstate__(self): + state = {} + for name in self.__slots__: + state[name] = getattr(self, name, None) + return state + + def __setstate__(self, state): + for name in self.__slots__: + if name in state: + setattr(self, name, state[name]) + +class tzfile(datetime.tzinfo): + + # http://www.twinsun.com/tz/tz-link.htm + # ftp://elsie.nci.nih.gov/pub/tz*.tar.gz + + def __init__(self, fileobj): + if isinstance(fileobj, basestring): + self._filename = fileobj + fileobj = open(fileobj) + elif hasattr(fileobj, "name"): + self._filename = fileobj.name + else: + self._filename = `fileobj` + + # From tzfile(5): + # + # The time zone information files used by tzset(3) + # begin with the magic characters "TZif" to identify + # them as time zone information files, followed by + # sixteen bytes reserved for future use, followed by + # six four-byte values of type long, written in a + # ``standard'' byte order (the high-order byte + # of the value is written first). + + if fileobj.read(4) != "TZif": + raise ValueError, "magic not found" + + fileobj.read(16) + + ( + # The number of UTC/local indicators stored in the file. + ttisgmtcnt, + + # The number of standard/wall indicators stored in the file. + ttisstdcnt, + + # The number of leap seconds for which data is + # stored in the file. + leapcnt, + + # The number of "transition times" for which data + # is stored in the file. + timecnt, + + # The number of "local time types" for which data + # is stored in the file (must not be zero). + typecnt, + + # The number of characters of "time zone + # abbreviation strings" stored in the file. + charcnt, + + ) = struct.unpack(">6l", fileobj.read(24)) + + # The above header is followed by tzh_timecnt four-byte + # values of type long, sorted in ascending order. + # These values are written in ``standard'' byte order. + # Each is used as a transition time (as returned by + # time(2)) at which the rules for computing local time + # change. + + if timecnt: + self._trans_list = struct.unpack(">%dl" % timecnt, + fileobj.read(timecnt*4)) + else: + self._trans_list = [] + + # Next come tzh_timecnt one-byte values of type unsigned + # char; each one tells which of the different types of + # ``local time'' types described in the file is associated + # with the same-indexed transition time. These values + # serve as indices into an array of ttinfo structures that + # appears next in the file. + + if timecnt: + self._trans_idx = struct.unpack(">%dB" % timecnt, + fileobj.read(timecnt)) + else: + self._trans_idx = [] + + # Each ttinfo structure is written as a four-byte value + # for tt_gmtoff of type long, in a standard byte + # order, followed by a one-byte value for tt_isdst + # and a one-byte value for tt_abbrind. In each + # structure, tt_gmtoff gives the number of + # seconds to be added to UTC, tt_isdst tells whether + # tm_isdst should be set by localtime(3), and + # tt_abbrind serves as an index into the array of + # time zone abbreviation characters that follow the + # ttinfo structure(s) in the file. + + ttinfo = [] + + for i in range(typecnt): + ttinfo.append(struct.unpack(">lbb", fileobj.read(6))) + + abbr = fileobj.read(charcnt) + + # Then there are tzh_leapcnt pairs of four-byte + # values, written in standard byte order; the + # first value of each pair gives the time (as + # returned by time(2)) at which a leap second + # occurs; the second gives the total number of + # leap seconds to be applied after the given time. + # The pairs of values are sorted in ascending order + # by time. + + # Not used, for now + if leapcnt: + leap = struct.unpack(">%dl" % (leapcnt*2), + fileobj.read(leapcnt*8)) + + # Then there are tzh_ttisstdcnt standard/wall + # indicators, each stored as a one-byte value; + # they tell whether the transition times associated + # with local time types were specified as standard + # time or wall clock time, and are used when + # a time zone file is used in handling POSIX-style + # time zone environment variables. + + if ttisstdcnt: + isstd = struct.unpack(">%db" % ttisstdcnt, + fileobj.read(ttisstdcnt)) + + # Finally, there are tzh_ttisgmtcnt UTC/local + # indicators, each stored as a one-byte value; + # they tell whether the transition times associated + # with local time types were specified as UTC or + # local time, and are used when a time zone file + # is used in handling POSIX-style time zone envi- + # ronment variables. + + if ttisgmtcnt: + isgmt = struct.unpack(">%db" % ttisgmtcnt, + fileobj.read(ttisgmtcnt)) + + # ** Everything has been read ** + + # Build ttinfo list + self._ttinfo_list = [] + for i in range(typecnt): + gmtoff, isdst, abbrind = ttinfo[i] + # Round to full-minutes if that's not the case. Python's + # datetime doesn't accept sub-minute timezones. Check + # http://python.org/sf/1447945 for some information. + gmtoff = (gmtoff+30)//60*60 + tti = _ttinfo() + tti.offset = gmtoff + tti.delta = datetime.timedelta(seconds=gmtoff) + tti.isdst = isdst + tti.abbr = abbr[abbrind:abbr.find('\x00', abbrind)] + tti.isstd = (ttisstdcnt > i and isstd[i] != 0) + tti.isgmt = (ttisgmtcnt > i and isgmt[i] != 0) + self._ttinfo_list.append(tti) + + # Replace ttinfo indexes for ttinfo objects. + trans_idx = [] + for idx in self._trans_idx: + trans_idx.append(self._ttinfo_list[idx]) + self._trans_idx = tuple(trans_idx) + + # Set standard, dst, and before ttinfos. before will be + # used when a given time is before any transitions, + # and will be set to the first non-dst ttinfo, or to + # the first dst, if all of them are dst. + self._ttinfo_std = None + self._ttinfo_dst = None + self._ttinfo_before = None + if self._ttinfo_list: + if not self._trans_list: + self._ttinfo_std = self._ttinfo_first = self._ttinfo_list[0] + else: + for i in range(timecnt-1,-1,-1): + tti = self._trans_idx[i] + if not self._ttinfo_std and not tti.isdst: + self._ttinfo_std = tti + elif not self._ttinfo_dst and tti.isdst: + self._ttinfo_dst = tti + if self._ttinfo_std and self._ttinfo_dst: + break + else: + if self._ttinfo_dst and not self._ttinfo_std: + self._ttinfo_std = self._ttinfo_dst + + for tti in self._ttinfo_list: + if not tti.isdst: + self._ttinfo_before = tti + break + else: + self._ttinfo_before = self._ttinfo_list[0] + + # Now fix transition times to become relative to wall time. + # + # I'm not sure about this. In my tests, the tz source file + # is setup to wall time, and in the binary file isstd and + # isgmt are off, so it should be in wall time. OTOH, it's + # always in gmt time. Let me know if you have comments + # about this. + laststdoffset = 0 + self._trans_list = list(self._trans_list) + for i in range(len(self._trans_list)): + tti = self._trans_idx[i] + if not tti.isdst: + # This is std time. + self._trans_list[i] += tti.offset + laststdoffset = tti.offset + else: + # This is dst time. Convert to std. + self._trans_list[i] += laststdoffset + self._trans_list = tuple(self._trans_list) + + def _find_ttinfo(self, dt, laststd=0): + timestamp = ((dt.toordinal() - EPOCHORDINAL) * 86400 + + dt.hour * 3600 + + dt.minute * 60 + + dt.second) + idx = 0 + for trans in self._trans_list: + if timestamp < trans: + break + idx += 1 + else: + return self._ttinfo_std + if idx == 0: + return self._ttinfo_before + if laststd: + while idx > 0: + tti = self._trans_idx[idx-1] + if not tti.isdst: + return tti + idx -= 1 + else: + return self._ttinfo_std + else: + return self._trans_idx[idx-1] + + def utcoffset(self, dt): + if not self._ttinfo_std: + return ZERO + return self._find_ttinfo(dt).delta + + def dst(self, dt): + if not self._ttinfo_dst: + return ZERO + tti = self._find_ttinfo(dt) + if not tti.isdst: + return ZERO + + # The documentation says that utcoffset()-dst() must + # be constant for every dt. + return tti.delta-self._find_ttinfo(dt, laststd=1).delta + + # An alternative for that would be: + # + # return self._ttinfo_dst.offset-self._ttinfo_std.offset + # + # However, this class stores historical changes in the + # dst offset, so I belive that this wouldn't be the right + # way to implement this. + + def tzname(self, dt): + if not self._ttinfo_std: + return None + return self._find_ttinfo(dt).abbr + + def __eq__(self, other): + if not isinstance(other, tzfile): + return False + return (self._trans_list == other._trans_list and + self._trans_idx == other._trans_idx and + self._ttinfo_list == other._ttinfo_list) + + def __ne__(self, other): + return not self.__eq__(other) + + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, `self._filename`) + + def __reduce__(self): + if not os.path.isfile(self._filename): + raise ValueError, "Unpickable %s class" % self.__class__.__name__ + return (self.__class__, (self._filename,)) + +class tzrange(datetime.tzinfo): + + def __init__(self, stdabbr, stdoffset=None, + dstabbr=None, dstoffset=None, + start=None, end=None): + global relativedelta + if not relativedelta: + from dateutil import relativedelta + self._std_abbr = stdabbr + self._dst_abbr = dstabbr + if stdoffset is not None: + self._std_offset = datetime.timedelta(seconds=stdoffset) + else: + self._std_offset = ZERO + if dstoffset is not None: + self._dst_offset = datetime.timedelta(seconds=dstoffset) + elif dstabbr and stdoffset is not None: + self._dst_offset = self._std_offset+datetime.timedelta(hours=+1) + else: + self._dst_offset = ZERO + if dstabbr and start is None: + self._start_delta = relativedelta.relativedelta( + hours=+2, month=4, day=1, weekday=relativedelta.SU(+1)) + else: + self._start_delta = start + if dstabbr and end is None: + self._end_delta = relativedelta.relativedelta( + hours=+1, month=10, day=31, weekday=relativedelta.SU(-1)) + else: + self._end_delta = end + + def utcoffset(self, dt): + if self._isdst(dt): + return self._dst_offset + else: + return self._std_offset + + def dst(self, dt): + if self._isdst(dt): + return self._dst_offset-self._std_offset + else: + return ZERO + + def tzname(self, dt): + if self._isdst(dt): + return self._dst_abbr + else: + return self._std_abbr + + def _isdst(self, dt): + if not self._start_delta: + return False + year = datetime.datetime(dt.year,1,1) + start = year+self._start_delta + end = year+self._end_delta + dt = dt.replace(tzinfo=None) + if start < end: + return dt >= start and dt < end + else: + return dt >= start or dt < end + + def __eq__(self, other): + if not isinstance(other, tzrange): + return False + return (self._std_abbr == other._std_abbr and + self._dst_abbr == other._dst_abbr and + self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset and + self._start_delta == other._start_delta and + self._end_delta == other._end_delta) + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return "%s(...)" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + +class tzstr(tzrange): + + def __init__(self, s): + global parser + if not parser: + from dateutil import parser + self._s = s + + res = parser._parsetz(s) + if res is None: + raise ValueError, "unknown string format" + + # Here we break the compatibility with the TZ variable handling. + # GMT-3 actually *means* the timezone -3. + if res.stdabbr in ("GMT", "UTC"): + res.stdoffset *= -1 + + # We must initialize it first, since _delta() needs + # _std_offset and _dst_offset set. Use False in start/end + # to avoid building it two times. + tzrange.__init__(self, res.stdabbr, res.stdoffset, + res.dstabbr, res.dstoffset, + start=False, end=False) + + if not res.dstabbr: + self._start_delta = None + self._end_delta = None + else: + self._start_delta = self._delta(res.start) + if self._start_delta: + self._end_delta = self._delta(res.end, isend=1) + + def _delta(self, x, isend=0): + kwargs = {} + if x.month is not None: + kwargs["month"] = x.month + if x.weekday is not None: + kwargs["weekday"] = relativedelta.weekday(x.weekday, x.week) + if x.week > 0: + kwargs["day"] = 1 + else: + kwargs["day"] = 31 + elif x.day: + kwargs["day"] = x.day + elif x.yday is not None: + kwargs["yearday"] = x.yday + elif x.jyday is not None: + kwargs["nlyearday"] = x.jyday + if not kwargs: + # Default is to start on first sunday of april, and end + # on last sunday of october. + if not isend: + kwargs["month"] = 4 + kwargs["day"] = 1 + kwargs["weekday"] = relativedelta.SU(+1) + else: + kwargs["month"] = 10 + kwargs["day"] = 31 + kwargs["weekday"] = relativedelta.SU(-1) + if x.time is not None: + kwargs["seconds"] = x.time + else: + # Default is 2AM. + kwargs["seconds"] = 7200 + if isend: + # Convert to standard time, to follow the documented way + # of working with the extra hour. See the documentation + # of the tzinfo class. + delta = self._dst_offset-self._std_offset + kwargs["seconds"] -= delta.seconds+delta.days*86400 + return relativedelta.relativedelta(**kwargs) + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, `self._s`) + +class _tzicalvtzcomp: + def __init__(self, tzoffsetfrom, tzoffsetto, isdst, + tzname=None, rrule=None): + self.tzoffsetfrom = datetime.timedelta(seconds=tzoffsetfrom) + self.tzoffsetto = datetime.timedelta(seconds=tzoffsetto) + self.tzoffsetdiff = self.tzoffsetto-self.tzoffsetfrom + self.isdst = isdst + self.tzname = tzname + self.rrule = rrule + +class _tzicalvtz(datetime.tzinfo): + def __init__(self, tzid, comps=[]): + self._tzid = tzid + self._comps = comps + self._cachedate = [] + self._cachecomp = [] + + def _find_comp(self, dt): + if len(self._comps) == 1: + return self._comps[0] + dt = dt.replace(tzinfo=None) + try: + return self._cachecomp[self._cachedate.index(dt)] + except ValueError: + pass + lastcomp = None + lastcompdt = None + for comp in self._comps: + if not comp.isdst: + # Handle the extra hour in DST -> STD + compdt = comp.rrule.before(dt-comp.tzoffsetdiff, inc=True) + else: + compdt = comp.rrule.before(dt, inc=True) + if compdt and (not lastcompdt or lastcompdt < compdt): + lastcompdt = compdt + lastcomp = comp + if not lastcomp: + # RFC says nothing about what to do when a given + # time is before the first onset date. We'll look for the + # first standard component, or the first component, if + # none is found. + for comp in self._comps: + if not comp.isdst: + lastcomp = comp + break + else: + lastcomp = comp[0] + self._cachedate.insert(0, dt) + self._cachecomp.insert(0, lastcomp) + if len(self._cachedate) > 10: + self._cachedate.pop() + self._cachecomp.pop() + return lastcomp + + def utcoffset(self, dt): + return self._find_comp(dt).tzoffsetto + + def dst(self, dt): + comp = self._find_comp(dt) + if comp.isdst: + return comp.tzoffsetdiff + else: + return ZERO + + def tzname(self, dt): + return self._find_comp(dt).tzname + + def __repr__(self): + return "<tzicalvtz %s>" % `self._tzid` + + __reduce__ = object.__reduce__ + +class tzical: + def __init__(self, fileobj): + global rrule + if not rrule: + from dateutil import rrule + + if isinstance(fileobj, basestring): + self._s = fileobj + fileobj = open(fileobj) + elif hasattr(fileobj, "name"): + self._s = fileobj.name + else: + self._s = `fileobj` + + self._vtz = {} + + self._parse_rfc(fileobj.read()) + + def keys(self): + return self._vtz.keys() + + def get(self, tzid=None): + if tzid is None: + keys = self._vtz.keys() + if len(keys) == 0: + raise ValueError, "no timezones defined" + elif len(keys) > 1: + raise ValueError, "more than one timezone available" + tzid = keys[0] + return self._vtz.get(tzid) + + def _parse_offset(self, s): + s = s.strip() + if not s: + raise ValueError, "empty offset" + if s[0] in ('+', '-'): + signal = (-1,+1)[s[0]=='+'] + s = s[1:] + else: + signal = +1 + if len(s) == 4: + return (int(s[:2])*3600+int(s[2:])*60)*signal + elif len(s) == 6: + return (int(s[:2])*3600+int(s[2:4])*60+int(s[4:]))*signal + else: + raise ValueError, "invalid offset: "+s + + def _parse_rfc(self, s): + lines = s.splitlines() + if not lines: + raise ValueError, "empty string" + + # Unfold + i = 0 + while i < len(lines): + line = lines[i].rstrip() + if not line: + del lines[i] + elif i > 0 and line[0] in (" ", "\t"): + lines[i-1] += line[1:] + del lines[i] + else: + i += 1 + + tzid = None + comps = [] + invtz = False + comptype = None + for line in lines: + if not line: + continue + name, value = line.split(':', 1) + parms = name.split(';') + if not parms: + raise ValueError, "empty property name" + name = parms[0].upper() + parms = parms[1:] + if invtz: + if name == "BEGIN": + if value in ("STANDARD", "DAYLIGHT"): + # Process component + pass + else: + raise ValueError, "unknown component: "+value + comptype = value + founddtstart = False + tzoffsetfrom = None + tzoffsetto = None + rrulelines = [] + tzname = None + elif name == "END": + if value == "VTIMEZONE": + if comptype: + raise ValueError, \ + "component not closed: "+comptype + if not tzid: + raise ValueError, \ + "mandatory TZID not found" + if not comps: + raise ValueError, \ + "at least one component is needed" + # Process vtimezone + self._vtz[tzid] = _tzicalvtz(tzid, comps) + invtz = False + elif value == comptype: + if not founddtstart: + raise ValueError, \ + "mandatory DTSTART not found" + if tzoffsetfrom is None: + raise ValueError, \ + "mandatory TZOFFSETFROM not found" + if tzoffsetto is None: + raise ValueError, \ + "mandatory TZOFFSETFROM not found" + # Process component + rr = None + if rrulelines: + rr = rrule.rrulestr("\n".join(rrulelines), + compatible=True, + ignoretz=True, + cache=True) + comp = _tzicalvtzcomp(tzoffsetfrom, tzoffsetto, + (comptype == "DAYLIGHT"), + tzname, rr) + comps.append(comp) + comptype = None + else: + raise ValueError, \ + "invalid component end: "+value + elif comptype: + if name == "DTSTART": + rrulelines.append(line) + founddtstart = True + elif name in ("RRULE", "RDATE", "EXRULE", "EXDATE"): + rrulelines.append(line) + elif name == "TZOFFSETFROM": + if parms: + raise ValueError, \ + "unsupported %s parm: %s "%(name, parms[0]) + tzoffsetfrom = self._parse_offset(value) + elif name == "TZOFFSETTO": + if parms: + raise ValueError, \ + "unsupported TZOFFSETTO parm: "+parms[0] + tzoffsetto = self._parse_offset(value) + elif name == "TZNAME": + if parms: + raise ValueError, \ + "unsupported TZNAME parm: "+parms[0] + tzname = value + elif name == "COMMENT": + pass + elif name.upper().startswith('X-'): + # Ignore experimental properties. + pass + else: + raise ValueError, "unsupported property: "+name + else: + if name == "TZID": + for p in parms: + if not p.upper().startswith('X-'): + raise ValueError, \ + "unsupported TZID parm: "+p + tzid = value + elif name in ("TZURL", "LAST-MODIFIED", "COMMENT"): + pass + elif name.upper().startswith('X-'): + # Ignore experimental properties. + pass + else: + raise ValueError, "unsupported property: "+name + elif name == "BEGIN" and value == "VTIMEZONE": + tzid = None + comps = [] + invtz = True + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, `self._s`) + +if sys.platform != "win32": + TZFILES = ["/etc/localtime", "localtime"] + TZPATHS = ["/usr/share/zoneinfo", "/usr/lib/zoneinfo", "/etc/zoneinfo"] +else: + TZFILES = [] + TZPATHS = [] + +def gettz(name=None): + tz = None + if not name: + try: + name = os.environ["TZ"] + except KeyError: + pass + if name is None or name == ":": + for filepath in TZFILES: + if not os.path.isabs(filepath): + filename = filepath + for path in TZPATHS: + filepath = os.path.join(path, filename) + if os.path.isfile(filepath): + break + else: + continue + if os.path.isfile(filepath): + try: + tz = tzfile(filepath) + break + except (IOError, OSError, ValueError): + pass + else: + tz = tzlocal() + else: + if name.startswith(":"): + name = name[:-1] + if os.path.isabs(name): + if os.path.isfile(name): + tz = tzfile(name) + else: + tz = None + else: + for path in TZPATHS: + filepath = os.path.join(path, name) + if not os.path.isfile(filepath): + filepath = filepath.replace(' ','_') + if not os.path.isfile(filepath): + continue + try: + tz = tzfile(filepath) + break + except (IOError, OSError, ValueError): + pass + else: + tz = None + if tzwin: + try: + tz = tzwin(name) + except OSError: + pass + if not tz: + from dateutil.zoneinfo import gettz + tz = gettz(name) + if not tz: + for c in name: + # name must have at least one offset to be a tzstr + if c in "0123456789": + try: + tz = tzstr(name) + except ValueError: + pass + break + else: + if name in ("GMT", "UTC"): + tz = tzutc() + elif name in time.tzname: + tz = tzlocal() + return tz + +# vim:ts=4:sw=4:et diff --git a/lib/dateutil/tzwin.py b/lib/dateutil/tzwin.py new file mode 100644 index 00000000..073e0ff6 --- /dev/null +++ b/lib/dateutil/tzwin.py @@ -0,0 +1,180 @@ +# This code was originally contributed by Jeffrey Harris. +import datetime +import struct +import _winreg + +__author__ = "Jeffrey Harris & Gustavo Niemeyer <gustavo@niemeyer.net>" + +__all__ = ["tzwin", "tzwinlocal"] + +ONEWEEK = datetime.timedelta(7) + +TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" +TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones" +TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" + +def _settzkeyname(): + global TZKEYNAME + handle = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) + try: + _winreg.OpenKey(handle, TZKEYNAMENT).Close() + TZKEYNAME = TZKEYNAMENT + except WindowsError: + TZKEYNAME = TZKEYNAME9X + handle.Close() + +_settzkeyname() + +class tzwinbase(datetime.tzinfo): + """tzinfo class based on win32's timezones available in the registry.""" + + def utcoffset(self, dt): + if self._isdst(dt): + return datetime.timedelta(minutes=self._dstoffset) + else: + return datetime.timedelta(minutes=self._stdoffset) + + def dst(self, dt): + if self._isdst(dt): + minutes = self._dstoffset - self._stdoffset + return datetime.timedelta(minutes=minutes) + else: + return datetime.timedelta(0) + + def tzname(self, dt): + if self._isdst(dt): + return self._dstname + else: + return self._stdname + + def list(): + """Return a list of all time zones known to the system.""" + handle = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) + tzkey = _winreg.OpenKey(handle, TZKEYNAME) + result = [_winreg.EnumKey(tzkey, i) + for i in range(_winreg.QueryInfoKey(tzkey)[0])] + tzkey.Close() + handle.Close() + return result + list = staticmethod(list) + + def display(self): + return self._display + + def _isdst(self, dt): + dston = picknthweekday(dt.year, self._dstmonth, self._dstdayofweek, + self._dsthour, self._dstminute, + self._dstweeknumber) + dstoff = picknthweekday(dt.year, self._stdmonth, self._stddayofweek, + self._stdhour, self._stdminute, + self._stdweeknumber) + if dston < dstoff: + return dston <= dt.replace(tzinfo=None) < dstoff + else: + return not dstoff <= dt.replace(tzinfo=None) < dston + + +class tzwin(tzwinbase): + + def __init__(self, name): + self._name = name + + handle = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) + tzkey = _winreg.OpenKey(handle, "%s\%s" % (TZKEYNAME, name)) + keydict = valuestodict(tzkey) + tzkey.Close() + handle.Close() + + self._stdname = keydict["Std"].encode("iso-8859-1") + self._dstname = keydict["Dlt"].encode("iso-8859-1") + + self._display = keydict["Display"] + + # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm + tup = struct.unpack("=3l16h", keydict["TZI"]) + self._stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1 + self._dstoffset = self._stdoffset-tup[2] # + DaylightBias * -1 + + (self._stdmonth, + self._stddayofweek, # Sunday = 0 + self._stdweeknumber, # Last = 5 + self._stdhour, + self._stdminute) = tup[4:9] + + (self._dstmonth, + self._dstdayofweek, # Sunday = 0 + self._dstweeknumber, # Last = 5 + self._dsthour, + self._dstminute) = tup[12:17] + + def __repr__(self): + return "tzwin(%s)" % repr(self._name) + + def __reduce__(self): + return (self.__class__, (self._name,)) + + +class tzwinlocal(tzwinbase): + + def __init__(self): + + handle = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) + + tzlocalkey = _winreg.OpenKey(handle, TZLOCALKEYNAME) + keydict = valuestodict(tzlocalkey) + tzlocalkey.Close() + + self._stdname = keydict["StandardName"].encode("iso-8859-1") + self._dstname = keydict["DaylightName"].encode("iso-8859-1") + + try: + tzkey = _winreg.OpenKey(handle, "%s\%s"%(TZKEYNAME, self._stdname)) + _keydict = valuestodict(tzkey) + self._display = _keydict["Display"] + tzkey.Close() + except OSError: + self._display = None + + handle.Close() + + self._stdoffset = -keydict["Bias"]-keydict["StandardBias"] + self._dstoffset = self._stdoffset-keydict["DaylightBias"] + + + # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm + tup = struct.unpack("=8h", keydict["StandardStart"]) + + (self._stdmonth, + self._stddayofweek, # Sunday = 0 + self._stdweeknumber, # Last = 5 + self._stdhour, + self._stdminute) = tup[1:6] + + tup = struct.unpack("=8h", keydict["DaylightStart"]) + + (self._dstmonth, + self._dstdayofweek, # Sunday = 0 + self._dstweeknumber, # Last = 5 + self._dsthour, + self._dstminute) = tup[1:6] + + def __reduce__(self): + return (self.__class__, ()) + +def picknthweekday(year, month, dayofweek, hour, minute, whichweek): + """dayofweek == 0 means Sunday, whichweek 5 means last instance""" + first = datetime.datetime(year, month, 1, hour, minute) + weekdayone = first.replace(day=((dayofweek-first.isoweekday())%7+1)) + for n in xrange(whichweek): + dt = weekdayone+(whichweek-n)*ONEWEEK + if dt.month == month: + return dt + +def valuestodict(key): + """Convert a registry key's values to a dictionary.""" + dict = {} + size = _winreg.QueryInfoKey(key)[1] + for i in range(size): + data = _winreg.EnumValue(key, i) + dict[data[0]] = data[1] + return dict diff --git a/lib/dateutil/zoneinfo/__init__.py b/lib/dateutil/zoneinfo/__init__.py new file mode 100644 index 00000000..cc326064 --- /dev/null +++ b/lib/dateutil/zoneinfo/__init__.py @@ -0,0 +1,85 @@ +""" +Copyright (c) 2003-2005 Gustavo Niemeyer <gustavo@niemeyer.net> + +This module offers extensions to the standard python 2.3+ +datetime module. +""" +from dateutil.tz import tzfile +from tarfile import TarFile +import os + +__author__ = "Gustavo Niemeyer <gustavo@niemeyer.net>" +__license__ = "PSF License" + +__all__ = ["setcachesize", "gettz", "rebuild"] + +CACHE = {} + +class tzfile(tzfile): + def __reduce__(self): + return (gettz, (self._filename,)) + +def getzoneinfofile(): + filenames = os.listdir(os.path.join(os.path.dirname(__file__))) + filenames.sort() + filenames.reverse() + for entry in filenames: + if entry.startswith("zoneinfo") and ".tar." in entry: + return os.path.join(os.path.dirname(__file__), entry) + return None + +def buildcache(): + global CACHE + zoneinfofile = getzoneinfofile() + if zoneinfofile: + tf = TarFile.open(zoneinfofile) + try: + for tarinfo in tf.getmembers(): + if tarinfo.islnk() or tarinfo.isfile(): + zonefile = tf.extractfile(tarinfo) + CACHE[tarinfo.name] = tzfile(zonefile) + finally: + tf.close() + +buildcache() + +del getzoneinfofile +del buildcache + +def setcachesize(_): + # Since the cache now eagerly initialized at + # import time, there's no point in controlling + # its size. + pass + +def gettz(name): + return CACHE.get(name) + +def rebuild(filename, tag=None, format="gz"): + import tempfile, shutil + tmpdir = tempfile.mkdtemp() + zonedir = os.path.join(tmpdir, "zoneinfo") + moduledir = os.path.dirname(__file__) + if tag: tag = "-"+tag + targetname = "zoneinfo%s.tar.%s" % (tag, format) + try: + tf = TarFile.open(filename) + for name in tf.getnames(): + if not (name.endswith(".sh") or + name.endswith(".tab") or + name == "leapseconds"): + tf.extract(name, tmpdir) + filepath = os.path.join(tmpdir, name) + os.system("zic -d %s %s" % (zonedir, filepath)) + tf.close() + target = os.path.join(moduledir, targetname) + for entry in os.listdir(moduledir): + if entry.startswith("zoneinfo") and ".tar." in entry: + os.unlink(os.path.join(moduledir, entry)) + tf = TarFile.open(target, "w:%s" % format) + for entry in os.listdir(zonedir): + entrypath = os.path.join(zonedir, entry) + tf.add(entrypath, entry) + tf.close() + finally: + shutil.rmtree(tmpdir) diff --git a/lib/dateutil/zoneinfo/zoneinfo-2012c.tar.gz b/lib/dateutil/zoneinfo/zoneinfo-2012c.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..641f903a51d4ad8072b6bf0b63d668d2f0192fba GIT binary patch literal 86841 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πq9r+Lfj<cf`Ni*ZrZ`O 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ℜ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�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 P7ZdCM`*TJJ0I&%Fz_a(X literal 0 HcmV?d00001 diff --git a/lib/dns/LICENSE b/lib/dns/LICENSE deleted file mode 100644 index 390a726d..00000000 --- a/lib/dns/LICENSE +++ /dev/null @@ -1,35 +0,0 @@ -ISC License - -Copyright (C) Dnspython Contributors - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all -copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR -PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - - - -Copyright (C) 2001-2017 Nominum, Inc. -Copyright (C) Google Inc. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose with or without fee is hereby granted, -provided that the above copyright notice and this permission notice -appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/lib/dns/README.md b/lib/dns/README.md deleted file mode 100644 index 9c1e2d80..00000000 --- a/lib/dns/README.md +++ /dev/null @@ -1,665 +0,0 @@ -# dnspython - -[![Build Status](https://travis-ci.org/rthalley/dnspython.svg?branch=master)](https://travis-ci.org/rthalley/dnspython) - -## INTRODUCTION - -dnspython is a DNS toolkit for Python. It supports almost all record types. It -can be used for queries, zone transfers, and dynamic updates. It supports TSIG -authenticated messages and EDNS0. - -dnspython provides both high and low level access to DNS. The high level classes -perform queries for data of a given name, type, and class, and return an answer -set. The low level classes allow direct manipulation of DNS zones, messages, -names, and records. - -To see a few of the ways dnspython can be used, look in the `examples/` directory. - -dnspython is a utility to work with DNS, `/etc/hosts` is thus not used. For -simple forward DNS lookups, it's better to use `socket.gethostbyname()`. - -dnspython originated at Nominum where it was developed -to facilitate the testing of DNS software. - -## INSTALLATION - -* Many distributions have dnspython packaged for you, so you should - check there first. -* If you have pip installed, you can do `pip install dnspython` -* If not just download the source file and unzip it, then run - `sudo python setup.py install` - -## ABOUT THIS RELEASE - -This is dnspython 1.16.0 - -### Notices - -Python 2.x support ends with the release of 1.16.0, unless there are -critical bugs in 1.16.0. Future versions of dnspython will only -support Python 3. - -Version numbering of future dnspython releases will also start at 2.0, as -incompatible changes will be permitted. We're not planning huge changes at -this time, but we'd like to do a better job at IDNA, and there are other -API improvements to be made. - -The ChangeLog has been discontinued. Please see the git history for detailed -change information. - -### New since 1.15.0: - -* Much of the internals of dns.query.udp() and dns.query.tcp() have - been factored out into dns.query.send_udp(), - dns.query.receive_udp(), dns.query.send_tcp(), and - dns.query.receive_tcp(). Applications which want more control over - the socket may find the new routines helpful; for example it would - be easy to send multiple queries over a single TCP connection. - -* The OPENPGPKEY RR, and the CHAOS class A RR are now supported. - -* EDNS0 client-subnet is supported. - -* dns.resover.query() now has a lifetime timeout optional parameter. - -* pycryptodome and pycryptodomex are now supported and recommended for use - instead of pycrypto. - -* dns.message.from_wire() now has an ignore_trailing option. - -* type signatures have been provided. - -* module dns.hash is now deprecated, use standard Python libraries instead. - -* setup.py supports Cythonization to improve performance. - -### Bugs fixed since 1.15.0: - -* DNSSEC signature validation didn't check names correctly. [Issue #295] - -* The NXDOMAIN exception should not use its docstring. [Issue #253] - -* Fixed regression where trailing zeros in APL RRs were not - suppressed, and then fixed the problem where trailing zeros - were not added back properly on python 3 when needed. - -* Masterfile TTL defaulting is now harmonized with BIND practice. - -* dns.query.xfr() now raises on a non-zero rcode. - -* Rdata module importing is now locked to avoid races. - -* Several Python 3 incompatibilities have been fixed. - -* NSEC3 bitmap parsing now works with mulitple NSEC3 windows. - -* dns.renderer.Render supports TSIG on DNS envelope sequences. - -* DNSSEC validation now checks names properly [Issue #295] - -### New since 1.14.0: - -* IDNA 2008 support is now available if the "idna" module has been - installed and IDNA 2008 is requested. The default IDNA behavior is - still IDNA 2003. The new IDNA codec mechanism is currently only - useful for direct calls to dns.name.from_text() or - dns.name.from_unicode(), but in future releases it will be deployed - throughout dnspython, e.g. so that you can read a masterfile with an - IDNA 2008 codec in force. - -* By default, dns.name.to_unicode() is not strict about which - version of IDNA the input complies with. Strictness can be - requested by using one of the strict IDNA codecs. - -* The AVC RR is now supported. - -### Bugs fixed since 1.14.0: - -* Some problems with newlines in various output modes have been - addressed. - -* dns.name.to_text() now returns text and not bytes on Python 3.x - -* Miscellaneous fixes for the Python 2/3 codeline merge. - -* Many "lint" fixes after the addition of pylint support. - -* The random number generator reseeds after a fork(). - - -## REQUIREMENTS - -Python 2.7 or 3.4+. - - -## HOME PAGE - -For the latest in releases, documentation, and information, visit the dnspython -home page at http://www.dnspython.org/ - - -## BUG REPORTS - -Bug reports may be opened at -https://github.com/rthalley/dnspython/issues or sent to -bugs@dnspython.org - - -## MAILING LISTS - -A number of mailing lists are available. Visit the dnspython home page to -subscribe or unsubscribe. - - -## PRIOR RELEASE INFORMATION - -### New since 1.13.0: - -* CSYNC RRs are now supported. - -* `dns/message.py` (`make_query`): Setting any value which implies EDNS will - turn on EDNS if `use_edns` has not been specified. - -### Bugs fixed since 1.13.0: - -* TSIG signature algorithm setting was broken by the Python 2 and Python 3 code - line merge. - -* A bug in the LOC RR destroyed N/S and E/W distinctions within a degree of the - equator or prime merdian respectively. - -* Misc. fixes to deal with fallout from the Python 2 & 3 merge. - Fixes #156, #157, #158, #159, #160. - -* Running with python optimization on caused issues when stripped docstrings - were referenced. Fixes #154 - -* `dns.zone.from_text()` erroneously required the zone to be provided. - Fixes #153 - -### New since 1.12.0: - -* Dnspython now uses a single source for Python 2 and Python 3, eliminating the - painful merging between the Python 2 and Python 3 branches. Thank you so much - to Arthur Gautier for taking on this challenge and making it work! It was a - big job! - -* Support for Python older than 2.6 dropped. - -* Support for Python older than 3.3 dropped. - -* Zone origin can be specified as a string. - -* A rich string representation for all DNSExceptions. - -* setuptools has replaced distutils - -* Added support for CAA, CDS, CDNSKEY, EUI48, EUI64, and URI RR types. - -* Names now support the pickle protocol. - -* Ports can be specified per-nameserver in the stub resolver. - -### Bugs fixed since 1.12.0: - -* A number of Unicode name bugs have been fixed. - -* `resolv.conf` processing now rejects lines with too few tokens. - -* NameDicts now keep the max-depth value correct, and update properly. - -### New since 1.11.1: - -* Added `dns.zone.to_text()`. - -* Added support for "options rotate" in `/etc/resolv.conf`. - -* `dns.rdtypes.ANY.DNSKEY` now has helpers functions to convert between the - numeric form of the flags and a set of human-friendly strings - -* The reverse name of an IPv6 mapped IPv4 address is now in the IPv4 reverse - namespace. - -* The test system can now run the tests without requiring dnspython to be - installed. - -* Preliminary Elliptic Curve DNSSEC Validation (requires ecdsa module) - -### Bugs fixed since 1.11.1: - -* dnspython raised an exception when reading a masterfile starting with leading - whitespace - -* dnspython was affected by a python slicing API bug present on 64-bit windows. - -* Unicode escaping was applied at the wrong time. - -* RRSIG `to_text()` did not respect the relativize setting. - -* APL RRs with zero rdlength were rejected. - -* The tokenizer could put back an unescaped token. - -* Making a response to a message signed with TSIG was broken. - -* The IXFR state machine didn't handle long IXFR diffs. - -### New since 1.11.0: - -* Nothing - -### Bugs fixed since 1.11.0: - -* `dns.resolver.Resolver` erroneously referred to `retry_servfail` - instead of `self.retry_servfail`. - -* `dns.tsigkeyring.to_text()` would fail trying to convert the keyname to text. - -* Multi-message TSIGs were broken for algorithms other than HMAC-MD5 because we - weren't passing the right digest module to the HMAC code. - -* `dns.dnssec._find_candidate_keys()` tried to extract the key from the wrong - variable name. - -* $GENERATE tests were not backward compatible with python 2.4. - -### New since 1.10.0: - -* $GENERATE support - -* TLSA RR support - -* Added set_flags() method to dns.resolver.Resolver - -### Bugs fixed since 1.10.0: - -* Names with offsets >= 2^14 are no longer added to the compression table. - -* The "::" syntax is not used to shorten a single 16-bit section of the text - form an IPv6 address. - -* Caches are now locked. - -* YXDOMAIN is raised if seen by the resolver. - -* Empty rdatasets are not printed. - -* DNSKEY key tags are no longer assumed to be unique. - -### New since 1.9.4: - -* Added dns.resolver.LRUCache. In this cache implementation, the cache size is - limited to a user-specified number of nodes, and when adding a new node to a - full cache the least-recently used node is removed. If you're crawling the web - or otherwise doing lots of resolutions and you are using a cache, switching - to the LRUCache is recommended. - -* `dns.resolver.query()` will try TCP if a UDP response is truncated. - -* The python socket module's DNS methods can be now be overridden with - implementations that use dnspython's resolver. - -* Old DNSSEC types KEY, NXT, and SIG have been removed. - -* Whitespace is allowed in SSHFP fingerprints. - -* Origin checking in `dns.zone.from_xfr()` can be disabled. - -* Trailing junk checking can be disabled. - -* A source port can be specified when creating a resolver query. - -* All EDNS values may now be specified to `dns.message.make_query()`. - -### Bugs fixed since 1.9.4: - -* IPv4 and IPv6 address processing is now stricter. - -* Bounds checking of slices in rdata wire processing is now more strict, and - bounds errors (e.g. we got less data than was expected) now raise - `dns.exception.FormError` rather than `IndexError`. - -* Specifying a source port without specifying source used to have no effect, but - now uses the wildcard address and the specified port. - -### New since 1.9.3: - -* Nothing. - -### Bugs fixed since 1.9.3: - -* The rdata `_wire_cmp()` routine now handles relative names. - -* The SIG RR implementation was missing `import struct`. - -### New since 1.9.2: - -* A boolean parameter, `raise_on_no_answer`, has been added to the `query()` - methods. In no-error, no-data situations, this parameter determines whether - `NoAnswer` should be raised or not. If True, `NoAnswer` is raised. If False, - then an `Answer()` object with a None rrset will be returned. - -* Resolver `Answer()` objects now have a canonical_name field. - -* Rdata now has a `__hash__` method. - -### Bugs fixed since 1.9.2: - -* Dnspython was erroneously doing case-insensitive comparisons of the names in - NSEC and RRSIG RRs. - -* We now use `is` and not `==` when testing what section an RR is in. - -* The resolver now disallows metaqueries. - -### New since 1.9.1: - -* Nothing. - -### Bugs fixed since 1.9.1: - -* The `dns.dnssec` module didn't work at all due to missing imports that escaped - detection in testing because the test suite also did the imports. The third - time is the charm! - -### New since 1.9.0: - -* Nothing. - -### Bugs fixed since 1.9.0: - -* The `dns.dnssec` module didn't work with DSA due to namespace contamination - from a "from"-style import. - -### New since 1.8.0: - -* dnspython now uses `poll()` instead of `select()` when available. - -* Basic DNSSEC validation can be done using `dns.dnsec.validate()` and - `dns.dnssec.validate_rrsig()` if you have PyCrypto 2.3 or later installed. - Complete secure resolution is not yet available. - -* Added `key_id()` to the DNSSEC module, which computes the DNSSEC key id of a - DNSKEY rdata. - -* Added `make_ds()` to the DNSSEC module, which returns the DS RR for a given - DNSKEY rdata. - -* dnspython now raises an exception if HMAC-SHA284 or HMAC-SHA512 are used with - a Python older than 2.5.2. (Older Pythons do not compute the correct value.) - -* Symbolic constants are now available for TSIG algorithm names. - -### Bugs fixed since 1.8.0 - -* `dns.resolver.zone_for_name()` didn't handle a query response with a CNAME or - DNAME correctly in some cases. - -* When specifying rdata types and classes as text, Unicode strings may now be - used. - -* Hashlib compatibility issues have been fixed. - -* `dns.message` now imports `dns.edns`. - -* The TSIG algorithm value was passed incorrectly to `use_tsig()` in some cases. - -### New since 1.7.1: - -* Support for hmac-sha1, hmac-sha224, hmac-sha256, hmac-sha384 and hmac-sha512 - has been contributed by Kevin Chen. - -* The tokenizer's tokens are now Token objects instead of (type, value) tuples. - -### Bugs fixed since 1.7.1: - -* Escapes in masterfiles now work correctly. Previously they were only working - correctly when the text involved was part of a domain name. - -* When constructing a DDNS update, if the `present()` method was used with a - single rdata, a zero TTL was not added. - -* The entropy pool needed locking to be thread safe. - -* The entropy pool's reading of `/dev/random` could cause dnspython to block. - -* The entropy pool did buffered reads, potentially consuming more randomness - than we needed. - -* The entropy pool did not seed with high quality randomness on Windows. - -* SRV records were compared incorrectly. - -* In the e164 query function, the resolver parameter was not used. - -### New since 1.7.0: - -* Nothing - -### Bugs fixed since 1.7.0: - -* The 1.7.0 kitting process inadvertently omitted the code for the DLV RR. - -* Negative DDNS prerequisites are now handled correctly. - -### New since 1.6.0: - -* Rdatas now have a `to_digestable()` method, which returns the DNSSEC canonical - form of the rdata, suitable for use in signature computations. - -* The NSEC3, NSEC3PARAM, DLV, and HIP RR types are now supported. - -* An entropy module has been added and is used to randomize query ids. - -* EDNS0 options are now supported. - -* UDP IXFR is now supported. - -* The wire format parser now has a `one_rr_per_rrset` mode, which suppresses the - usual coalescing of all RRs of a given type into a single RRset. - -* Various helpful DNSSEC-related constants are now defined. - -* The resolver's `query()` method now has an optional `source` parameter, - allowing the source IP address to be specified. - -### Bugs fixed since 1.6.0: - -* On Windows, the resolver set the domain incorrectly. - -* DS RR parsing only allowed one Base64 chunk. - -* TSIG validation didn't always use absolute names. - -* `NSEC.to_text()` only printed the last window. - -* We did not canonicalize IPv6 addresses before comparing them; we - would thus treat equivalent but different textual forms, e.g. - "1:00::1" and "1::1" as being non-equivalent. - -* If the peer set a TSIG error, we didn't raise an exception. - -* Some EDNS bugs in the message code have been fixed (see the ChangeLog - for details). - -### New since 1.5.0: - -* Added dns.inet.is_multicast(). - -### Bugs fixed since 1.5.0: - -* If `select()` raises an exception due to EINTR, we should just `select()` - again. - -* If the queried address is a multicast address, then don't check that the - address of the response is the same as the address queried. - -* NAPTR comparisons didn't compare the preference field due to a typo. - -* Testing of whether a Windows NIC is enabled now works on Vista thanks to code - contributed by Paul Marks. - -### New since 1.4.0: - -* Answer objects now support more of the python sequence protocol, forwarding - the requests to the answer rrset. E.g. `for a in answer` is equivalent to - `for a in answer.rrset`, `answer[i]` is equivalent to `answer.rrset[i]`, and - `answer[i:j]` is equivalent to `answer.rrset[i:j]`. - -* Making requests using EDNS, including indicating DNSSEC awareness, - is now easier. For example, you can now say: - `q = dns.message.make_query('www.dnspython.org', 'MX', want_dnssec=True)` - -* `dns.query.xfr()` can now be used for IXFR. - -* Support has been added for the DHCID, IPSECKEY, and SPF RR types. - -* UDP messages from unexpected sources can now be ignored by setting - `ignore_unexpected` to True when calling `dns.query.udp`. - -### Bugs fixed since 1.4.0: - -* If `/etc/resolv.conf` didn't exist, we raised an exception instead of simply - using the default resolver configuration. - -* In `dns.resolver.Resolver._config_win32_fromkey()`, we were passing the wrong - variable to `self._config_win32_search()`. - -### New since 1.3.5: - -* You can now convert E.164 numbers to/from their ENUM name forms: - ```python - >>> import dns.e164 - >>> n = dns.e164.from_e164("+1 555 1212") - >>> n - <DNS name 2.1.2.1.5.5.5.1.e164.arpa.> - >>> dns.e164.to_e164(n) - '+15551212' - ``` - -* You can now convert IPv4 and IPv6 address to/from their corresponding DNS - reverse map names: - ```python - >>> import dns.reversename - >>> n = dns.reversename.from_address("127.0.0.1") - >>> n - <DNS name 1.0.0.127.in-addr.arpa.> - >>> dns.reversename.to_address(n) - '127.0.0.1' - ``` - -* You can now convert between Unicode strings and their IDN ACE form: - ```python - >>> n = dns.name.from_text(u'les-\u00e9l\u00e8ves.example.') - >>> n - <DNS name xn--les-lves-50ai.example.> - >>> n.to_unicode() - u'les-\xe9l\xe8ves.example.' - ``` - -* The origin parameter to `dns.zone.from_text()` and `dns.zone.to_text()` is now - optional. If not specified, the origin will be taken from the first $ORIGIN - statement in the master file. - -* Sanity checking of a zone can be disabled; this is useful when working with - files which are zone fragments. - -### Bugs fixed since 1.3.5: - -* The correct delimiter was not used when retrieving the list of nameservers - from the registry in certain versions of windows. - -* The floating-point version of latitude and longitude in LOC RRs - (`float_latitude` and `float_longitude`) had incorrect signs for south - latitudes and west longitudes. - -* BIND 8 TTL syntax is now accepted in all TTL-like places (i.e. SOA fields - refresh, retry, expire, and minimum; SIG/RRSIG field original_ttl). - -* TTLs are now bounds checked when their text form is parsed, and their values - must be in the closed interval `[0, 2^31 - 1]`. - -### New since 1.3.4: - -* In the resolver, if time goes backward a little bit, ignore it. - -* `zone_for_name()` has been added to the resolver module. It returns the zone - which is authoritative for the specified name, which is handy for dynamic - update. E.g. - - import dns.resolver - print dns.resolver.zone_for_name('www.dnspython.org') - - will output `"dnspython.org."` and - `print dns.resolver.zone_for_name('a.b.c.d.e.f.example.')` - will output `"."`. - -* The default resolver can be fetched with the `get_default_resolver()` method. - -* You can now get the parent (immediate superdomain) of a name by using the - `parent()` method. - -* `Zone.iterate_rdatasets()` and `Zone.iterate_rdatas()` now have a default - rdtype of `dns.rdatatype.ANY` like the documentation says. - -* A Dynamic DNS example, ddns.py, has been added. - -### New since 1.3.3: - -* The source address and port may now be specified when calling - `dns.query.{udp,tcp,xfr}`. - -* The resolver now does exponential backoff each time it runs through all of the - nameservers. - -* Rcodes which indicate a nameserver is likely to be a "permanent failure" for a - query cause the nameserver to be removed from the mix for that query. - -### New since 1.3.2: - -* `dns.message.Message.find_rrset()` now uses an index, vastly improving the - `from_wire()` performance of large messages such as zone transfers. - -* Added `dns.message.make_response()`, which creates a skeletal response for the - specified query. - -* Added `opcode()` and `set_opcode()` convenience methods to the - `dns.message.Message` class. Added the `request_payload` attribute to the - Message class. - -* The `file` parameter of `dns.name.Name.to_wire()` is now optional; if omitted, - the wire form will be returned as the value of the function. - -* `dns.zone.from_xfr()` in relativization mode incorrectly set `zone.origin` to - the empty name. - -* The masterfile parser incorrectly rejected TXT records where a value was not - quoted. - -### New since 1.3.1: - -* The NSEC format doesn't allow specifying types by number, so we shouldn't - either. (Using the unknown type format is still OK though.) - -* The resolver wasn't catching `dns.exception.Timeout`, so a timeout erroneously - caused the whole resolution to fail instead of just going on to the next - server. - -* The renderer module didn't import random, causing an exception to be raised if - a query id wasn't provided when a Renderer was created. - -* The conversion of LOC milliseconds values from text to binary was incorrect if - the length of the milliseconds string was not 3. - -### New since 1.3.0: - -* Added support for the SSHFP type. - -### New since 1.2.0: - -* Added support for new DNSSEC types RRSIG, NSEC, and DNSKEY. - -* This release fixes all known bugs. - -* See the ChangeLog file for more detailed information on changes since the - prior release. diff --git a/lib/dns/__init__.py b/lib/dns/__init__.py deleted file mode 100644 index 04143f03..00000000 --- a/lib/dns/__init__.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009, 2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -# PROJECT URL -# https://github.com/rthalley/dnspython - -"""dnspython DNS toolkit""" - -__all__ = [ - 'dnssec', - 'e164', - 'edns', - 'entropy', - 'exception', - 'flags', - 'hash', - 'inet', - 'ipv4', - 'ipv6', - 'message', - 'name', - 'namedict', - 'node', - 'opcode', - 'query', - 'rcode', - 'rdata', - 'rdataclass', - 'rdataset', - 'rdatatype', - 'renderer', - 'resolver', - 'reversename', - 'rrset', - 'set', - 'tokenizer', - 'tsig', - 'tsigkeyring', - 'ttl', - 'rdtypes', - 'update', - 'version', - 'wiredata', - 'zone', -] diff --git a/lib/dns/_compat.py b/lib/dns/_compat.py deleted file mode 100644 index ca0931c2..00000000 --- a/lib/dns/_compat.py +++ /dev/null @@ -1,59 +0,0 @@ -import sys -import decimal -from decimal import Context - -PY3 = sys.version_info[0] == 3 -PY2 = sys.version_info[0] == 2 - - -if PY3: - long = int - xrange = range -else: - long = long # pylint: disable=long-builtin - xrange = xrange # pylint: disable=xrange-builtin - -# unicode / binary types -if PY3: - text_type = str - binary_type = bytes - string_types = (str,) - unichr = chr - def maybe_decode(x): - return x.decode() - def maybe_encode(x): - return x.encode() - def maybe_chr(x): - return x - def maybe_ord(x): - return x -else: - text_type = unicode # pylint: disable=unicode-builtin, undefined-variable - binary_type = str - string_types = ( - basestring, # pylint: disable=basestring-builtin, undefined-variable - ) - unichr = unichr # pylint: disable=unichr-builtin - def maybe_decode(x): - return x - def maybe_encode(x): - return x - def maybe_chr(x): - return chr(x) - def maybe_ord(x): - return ord(x) - - -def round_py2_compat(what): - """ - Python 2 and Python 3 use different rounding strategies in round(). This - function ensures that results are python2/3 compatible and backward - compatible with previous py2 releases - :param what: float - :return: rounded long - """ - d = Context( - prec=len(str(long(what))), # round to integer with max precision - rounding=decimal.ROUND_HALF_UP - ).create_decimal(str(what)) # str(): python 2.6 compat - return long(d) diff --git a/lib/dns/dnssec.py b/lib/dns/dnssec.py deleted file mode 100644 index 35da6b5a..00000000 --- a/lib/dns/dnssec.py +++ /dev/null @@ -1,519 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Common DNSSEC-related functions and constants.""" - -from io import BytesIO -import struct -import time - -import dns.exception -import dns.name -import dns.node -import dns.rdataset -import dns.rdata -import dns.rdatatype -import dns.rdataclass -from ._compat import string_types - - -class UnsupportedAlgorithm(dns.exception.DNSException): - """The DNSSEC algorithm is not supported.""" - - -class ValidationFailure(dns.exception.DNSException): - """The DNSSEC signature is invalid.""" - - -#: RSAMD5 -RSAMD5 = 1 -#: DH -DH = 2 -#: DSA -DSA = 3 -#: ECC -ECC = 4 -#: RSASHA1 -RSASHA1 = 5 -#: DSANSEC3SHA1 -DSANSEC3SHA1 = 6 -#: RSASHA1NSEC3SHA1 -RSASHA1NSEC3SHA1 = 7 -#: RSASHA256 -RSASHA256 = 8 -#: RSASHA512 -RSASHA512 = 10 -#: ECDSAP256SHA256 -ECDSAP256SHA256 = 13 -#: ECDSAP384SHA384 -ECDSAP384SHA384 = 14 -#: INDIRECT -INDIRECT = 252 -#: PRIVATEDNS -PRIVATEDNS = 253 -#: PRIVATEOID -PRIVATEOID = 254 - -_algorithm_by_text = { - 'RSAMD5': RSAMD5, - 'DH': DH, - 'DSA': DSA, - 'ECC': ECC, - 'RSASHA1': RSASHA1, - 'DSANSEC3SHA1': DSANSEC3SHA1, - 'RSASHA1NSEC3SHA1': RSASHA1NSEC3SHA1, - 'RSASHA256': RSASHA256, - 'RSASHA512': RSASHA512, - 'INDIRECT': INDIRECT, - 'ECDSAP256SHA256': ECDSAP256SHA256, - 'ECDSAP384SHA384': ECDSAP384SHA384, - 'PRIVATEDNS': PRIVATEDNS, - 'PRIVATEOID': PRIVATEOID, -} - -# We construct the inverse mapping programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mapping not to be true inverse. - -_algorithm_by_value = {y: x for x, y in _algorithm_by_text.items()} - - -def algorithm_from_text(text): - """Convert text into a DNSSEC algorithm value. - - Returns an ``int``. - """ - - value = _algorithm_by_text.get(text.upper()) - if value is None: - value = int(text) - return value - - -def algorithm_to_text(value): - """Convert a DNSSEC algorithm value to text - - Returns a ``str``. - """ - - text = _algorithm_by_value.get(value) - if text is None: - text = str(value) - return text - - -def _to_rdata(record, origin): - s = BytesIO() - record.to_wire(s, origin=origin) - return s.getvalue() - - -def key_id(key, origin=None): - """Return the key id (a 16-bit number) for the specified key. - - Note the *origin* parameter of this function is historical and - is not needed. - - Returns an ``int`` between 0 and 65535. - """ - - rdata = _to_rdata(key, origin) - rdata = bytearray(rdata) - if key.algorithm == RSAMD5: - return (rdata[-3] << 8) + rdata[-2] - else: - total = 0 - for i in range(len(rdata) // 2): - total += (rdata[2 * i] << 8) + \ - rdata[2 * i + 1] - if len(rdata) % 2 != 0: - total += rdata[len(rdata) - 1] << 8 - total += ((total >> 16) & 0xffff) - return total & 0xffff - - -def make_ds(name, key, algorithm, origin=None): - """Create a DS record for a DNSSEC key. - - *name* is the owner name of the DS record. - - *key* is a ``dns.rdtypes.ANY.DNSKEY``. - - *algorithm* is a string describing which hash algorithm to use. The - currently supported hashes are "SHA1" and "SHA256". Case does not - matter for these strings. - - *origin* is a ``dns.name.Name`` and will be used as the origin - if *key* is a relative name. - - Returns a ``dns.rdtypes.ANY.DS``. - """ - - if algorithm.upper() == 'SHA1': - dsalg = 1 - hash = SHA1.new() - elif algorithm.upper() == 'SHA256': - dsalg = 2 - hash = SHA256.new() - else: - raise UnsupportedAlgorithm('unsupported algorithm "%s"' % algorithm) - - if isinstance(name, string_types): - name = dns.name.from_text(name, origin) - hash.update(name.canonicalize().to_wire()) - hash.update(_to_rdata(key, origin)) - digest = hash.digest() - - dsrdata = struct.pack("!HBB", key_id(key), key.algorithm, dsalg) + digest - return dns.rdata.from_wire(dns.rdataclass.IN, dns.rdatatype.DS, dsrdata, 0, - len(dsrdata)) - - -def _find_candidate_keys(keys, rrsig): - candidate_keys = [] - value = keys.get(rrsig.signer) - if value is None: - return None - if isinstance(value, dns.node.Node): - try: - rdataset = value.find_rdataset(dns.rdataclass.IN, - dns.rdatatype.DNSKEY) - except KeyError: - return None - else: - rdataset = value - for rdata in rdataset: - if rdata.algorithm == rrsig.algorithm and \ - key_id(rdata) == rrsig.key_tag: - candidate_keys.append(rdata) - return candidate_keys - - -def _is_rsa(algorithm): - return algorithm in (RSAMD5, RSASHA1, - RSASHA1NSEC3SHA1, RSASHA256, - RSASHA512) - - -def _is_dsa(algorithm): - return algorithm in (DSA, DSANSEC3SHA1) - - -def _is_ecdsa(algorithm): - return _have_ecdsa and (algorithm in (ECDSAP256SHA256, ECDSAP384SHA384)) - - -def _is_md5(algorithm): - return algorithm == RSAMD5 - - -def _is_sha1(algorithm): - return algorithm in (DSA, RSASHA1, - DSANSEC3SHA1, RSASHA1NSEC3SHA1) - - -def _is_sha256(algorithm): - return algorithm in (RSASHA256, ECDSAP256SHA256) - - -def _is_sha384(algorithm): - return algorithm == ECDSAP384SHA384 - - -def _is_sha512(algorithm): - return algorithm == RSASHA512 - - -def _make_hash(algorithm): - if _is_md5(algorithm): - return MD5.new() - if _is_sha1(algorithm): - return SHA1.new() - if _is_sha256(algorithm): - return SHA256.new() - if _is_sha384(algorithm): - return SHA384.new() - if _is_sha512(algorithm): - return SHA512.new() - raise ValidationFailure('unknown hash for algorithm %u' % algorithm) - - -def _make_algorithm_id(algorithm): - if _is_md5(algorithm): - oid = [0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05] - elif _is_sha1(algorithm): - oid = [0x2b, 0x0e, 0x03, 0x02, 0x1a] - elif _is_sha256(algorithm): - oid = [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01] - elif _is_sha512(algorithm): - oid = [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03] - else: - raise ValidationFailure('unknown algorithm %u' % algorithm) - olen = len(oid) - dlen = _make_hash(algorithm).digest_size - idbytes = [0x30] + [8 + olen + dlen] + \ - [0x30, olen + 4] + [0x06, olen] + oid + \ - [0x05, 0x00] + [0x04, dlen] - return struct.pack('!%dB' % len(idbytes), *idbytes) - - -def _validate_rrsig(rrset, rrsig, keys, origin=None, now=None): - """Validate an RRset against a single signature rdata - - The owner name of *rrsig* is assumed to be the same as the owner name - of *rrset*. - - *rrset* is the RRset to validate. It can be a ``dns.rrset.RRset`` or - a ``(dns.name.Name, dns.rdataset.Rdataset)`` tuple. - - *rrsig* is a ``dns.rdata.Rdata``, the signature to validate. - - *keys* is the key dictionary, used to find the DNSKEY associated with - a given name. The dictionary is keyed by a ``dns.name.Name``, and has - ``dns.node.Node`` or ``dns.rdataset.Rdataset`` values. - - *origin* is a ``dns.name.Name``, the origin to use for relative names. - - *now* is an ``int``, the time to use when validating the signatures, - in seconds since the UNIX epoch. The default is the current time. - """ - - if isinstance(origin, string_types): - origin = dns.name.from_text(origin, dns.name.root) - - candidate_keys = _find_candidate_keys(keys, rrsig) - if candidate_keys is None: - raise ValidationFailure('unknown key') - - for candidate_key in candidate_keys: - # For convenience, allow the rrset to be specified as a (name, - # rdataset) tuple as well as a proper rrset - if isinstance(rrset, tuple): - rrname = rrset[0] - rdataset = rrset[1] - else: - rrname = rrset.name - rdataset = rrset - - if now is None: - now = time.time() - if rrsig.expiration < now: - raise ValidationFailure('expired') - if rrsig.inception > now: - raise ValidationFailure('not yet valid') - - hash = _make_hash(rrsig.algorithm) - - if _is_rsa(rrsig.algorithm): - keyptr = candidate_key.key - (bytes_,) = struct.unpack('!B', keyptr[0:1]) - keyptr = keyptr[1:] - if bytes_ == 0: - (bytes_,) = struct.unpack('!H', keyptr[0:2]) - keyptr = keyptr[2:] - rsa_e = keyptr[0:bytes_] - rsa_n = keyptr[bytes_:] - try: - pubkey = CryptoRSA.construct( - (number.bytes_to_long(rsa_n), - number.bytes_to_long(rsa_e))) - except ValueError: - raise ValidationFailure('invalid public key') - sig = rrsig.signature - elif _is_dsa(rrsig.algorithm): - keyptr = candidate_key.key - (t,) = struct.unpack('!B', keyptr[0:1]) - keyptr = keyptr[1:] - octets = 64 + t * 8 - dsa_q = keyptr[0:20] - keyptr = keyptr[20:] - dsa_p = keyptr[0:octets] - keyptr = keyptr[octets:] - dsa_g = keyptr[0:octets] - keyptr = keyptr[octets:] - dsa_y = keyptr[0:octets] - pubkey = CryptoDSA.construct( - (number.bytes_to_long(dsa_y), - number.bytes_to_long(dsa_g), - number.bytes_to_long(dsa_p), - number.bytes_to_long(dsa_q))) - sig = rrsig.signature[1:] - elif _is_ecdsa(rrsig.algorithm): - # use ecdsa for NIST-384p -- not currently supported by pycryptodome - - keyptr = candidate_key.key - - if rrsig.algorithm == ECDSAP256SHA256: - curve = ecdsa.curves.NIST256p - key_len = 32 - elif rrsig.algorithm == ECDSAP384SHA384: - curve = ecdsa.curves.NIST384p - key_len = 48 - - x = number.bytes_to_long(keyptr[0:key_len]) - y = number.bytes_to_long(keyptr[key_len:key_len * 2]) - if not ecdsa.ecdsa.point_is_valid(curve.generator, x, y): - raise ValidationFailure('invalid ECDSA key') - point = ecdsa.ellipticcurve.Point(curve.curve, x, y, curve.order) - verifying_key = ecdsa.keys.VerifyingKey.from_public_point(point, - curve) - pubkey = ECKeyWrapper(verifying_key, key_len) - r = rrsig.signature[:key_len] - s = rrsig.signature[key_len:] - sig = ecdsa.ecdsa.Signature(number.bytes_to_long(r), - number.bytes_to_long(s)) - - else: - raise ValidationFailure('unknown algorithm %u' % rrsig.algorithm) - - hash.update(_to_rdata(rrsig, origin)[:18]) - hash.update(rrsig.signer.to_digestable(origin)) - - if rrsig.labels < len(rrname) - 1: - suffix = rrname.split(rrsig.labels + 1)[1] - rrname = dns.name.from_text('*', suffix) - rrnamebuf = rrname.to_digestable(origin) - rrfixed = struct.pack('!HHI', rdataset.rdtype, rdataset.rdclass, - rrsig.original_ttl) - rrlist = sorted(rdataset) - for rr in rrlist: - hash.update(rrnamebuf) - hash.update(rrfixed) - rrdata = rr.to_digestable(origin) - rrlen = struct.pack('!H', len(rrdata)) - hash.update(rrlen) - hash.update(rrdata) - - try: - if _is_rsa(rrsig.algorithm): - verifier = pkcs1_15.new(pubkey) - # will raise ValueError if verify fails: - verifier.verify(hash, sig) - elif _is_dsa(rrsig.algorithm): - verifier = DSS.new(pubkey, 'fips-186-3') - verifier.verify(hash, sig) - elif _is_ecdsa(rrsig.algorithm): - digest = hash.digest() - if not pubkey.verify(digest, sig): - raise ValueError - else: - # Raise here for code clarity; this won't actually ever happen - # since if the algorithm is really unknown we'd already have - # raised an exception above - raise ValidationFailure('unknown algorithm %u' % rrsig.algorithm) - # If we got here, we successfully verified so we can return without error - return - except ValueError: - # this happens on an individual validation failure - continue - # nothing verified -- raise failure: - raise ValidationFailure('verify failure') - - -def _validate(rrset, rrsigset, keys, origin=None, now=None): - """Validate an RRset. - - *rrset* is the RRset to validate. It can be a ``dns.rrset.RRset`` or - a ``(dns.name.Name, dns.rdataset.Rdataset)`` tuple. - - *rrsigset* is the signature RRset to be validated. It can be a - ``dns.rrset.RRset`` or a ``(dns.name.Name, dns.rdataset.Rdataset)`` tuple. - - *keys* is the key dictionary, used to find the DNSKEY associated with - a given name. The dictionary is keyed by a ``dns.name.Name``, and has - ``dns.node.Node`` or ``dns.rdataset.Rdataset`` values. - - *origin* is a ``dns.name.Name``, the origin to use for relative names. - - *now* is an ``int``, the time to use when validating the signatures, - in seconds since the UNIX epoch. The default is the current time. - """ - - if isinstance(origin, string_types): - origin = dns.name.from_text(origin, dns.name.root) - - if isinstance(rrset, tuple): - rrname = rrset[0] - else: - rrname = rrset.name - - if isinstance(rrsigset, tuple): - rrsigname = rrsigset[0] - rrsigrdataset = rrsigset[1] - else: - rrsigname = rrsigset.name - rrsigrdataset = rrsigset - - rrname = rrname.choose_relativity(origin) - rrsigname = rrsigname.choose_relativity(origin) - if rrname != rrsigname: - raise ValidationFailure("owner names do not match") - - for rrsig in rrsigrdataset: - try: - _validate_rrsig(rrset, rrsig, keys, origin, now) - return - except ValidationFailure: - pass - raise ValidationFailure("no RRSIGs validated") - - -def _need_pycrypto(*args, **kwargs): - raise NotImplementedError("DNSSEC validation requires pycryptodome/pycryptodomex") - - -try: - try: - # test we're using pycryptodome, not pycrypto (which misses SHA1 for example) - from Crypto.Hash import MD5, SHA1, SHA256, SHA384, SHA512 - from Crypto.PublicKey import RSA as CryptoRSA, DSA as CryptoDSA - from Crypto.Signature import pkcs1_15, DSS - from Crypto.Util import number - except ImportError: - from Cryptodome.Hash import MD5, SHA1, SHA256, SHA384, SHA512 - from Cryptodome.PublicKey import RSA as CryptoRSA, DSA as CryptoDSA - from Cryptodome.Signature import pkcs1_15, DSS - from Cryptodome.Util import number -except ImportError: - validate = _need_pycrypto - validate_rrsig = _need_pycrypto - _have_pycrypto = False - _have_ecdsa = False -else: - validate = _validate - validate_rrsig = _validate_rrsig - _have_pycrypto = True - - try: - import ecdsa - import ecdsa.ecdsa - import ecdsa.ellipticcurve - import ecdsa.keys - except ImportError: - _have_ecdsa = False - else: - _have_ecdsa = True - - class ECKeyWrapper(object): - - def __init__(self, key, key_len): - self.key = key - self.key_len = key_len - - def verify(self, digest, sig): - diglong = number.bytes_to_long(digest) - return self.key.pubkey.verifies(diglong, sig) diff --git a/lib/dns/dnssec.pyi b/lib/dns/dnssec.pyi deleted file mode 100644 index 5699b3e1..00000000 --- a/lib/dns/dnssec.pyi +++ /dev/null @@ -1,19 +0,0 @@ -from typing import Union, Dict, Tuple, Optional -from . import rdataset, rrset, exception, name, rdtypes, rdata, node -import dns.rdtypes.ANY.DS as DS -import dns.rdtypes.ANY.DNSKEY as DNSKEY - -_have_ecdsa : bool -_have_pycrypto : bool - -def validate_rrsig(rrset : Union[Tuple[name.Name, rdataset.Rdataset], rrset.RRset], rrsig : rdata.Rdata, keys : Dict[name.Name, Union[node.Node, rdataset.Rdataset]], origin : Optional[name.Name] = None, now : Optional[int] = None) -> None: - ... - -def validate(rrset: Union[Tuple[name.Name, rdataset.Rdataset], rrset.RRset], rrsigset : Union[Tuple[name.Name, rdataset.Rdataset], rrset.RRset], keys : Dict[name.Name, Union[node.Node, rdataset.Rdataset]], origin=None, now=None) -> None: - ... - -class ValidationFailure(exception.DNSException): - ... - -def make_ds(name : name.Name, key : DNSKEY.DNSKEY, algorithm : str, origin : Optional[name.Name] = None) -> DS.DS: - ... diff --git a/lib/dns/e164.py b/lib/dns/e164.py deleted file mode 100644 index 758c47a7..00000000 --- a/lib/dns/e164.py +++ /dev/null @@ -1,105 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2006-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS E.164 helpers.""" - -import dns.exception -import dns.name -import dns.resolver -from ._compat import string_types, maybe_decode - -#: The public E.164 domain. -public_enum_domain = dns.name.from_text('e164.arpa.') - - -def from_e164(text, origin=public_enum_domain): - """Convert an E.164 number in textual form into a Name object whose - value is the ENUM domain name for that number. - - Non-digits in the text are ignored, i.e. "16505551212", - "+1.650.555.1212" and "1 (650) 555-1212" are all the same. - - *text*, a ``text``, is an E.164 number in textual form. - - *origin*, a ``dns.name.Name``, the domain in which the number - should be constructed. The default is ``e164.arpa.``. - - Returns a ``dns.name.Name``. - """ - - parts = [d for d in text if d.isdigit()] - parts.reverse() - return dns.name.from_text('.'.join(parts), origin=origin) - - -def to_e164(name, origin=public_enum_domain, want_plus_prefix=True): - """Convert an ENUM domain name into an E.164 number. - - Note that dnspython does not have any information about preferred - number formats within national numbering plans, so all numbers are - emitted as a simple string of digits, prefixed by a '+' (unless - *want_plus_prefix* is ``False``). - - *name* is a ``dns.name.Name``, the ENUM domain name. - - *origin* is a ``dns.name.Name``, a domain containing the ENUM - domain name. The name is relativized to this domain before being - converted to text. If ``None``, no relativization is done. - - *want_plus_prefix* is a ``bool``. If True, add a '+' to the beginning of - the returned number. - - Returns a ``text``. - - """ - if origin is not None: - name = name.relativize(origin) - dlabels = [d for d in name.labels if d.isdigit() and len(d) == 1] - if len(dlabels) != len(name.labels): - raise dns.exception.SyntaxError('non-digit labels in ENUM domain name') - dlabels.reverse() - text = b''.join(dlabels) - if want_plus_prefix: - text = b'+' + text - return maybe_decode(text) - - -def query(number, domains, resolver=None): - """Look for NAPTR RRs for the specified number in the specified domains. - - e.g. lookup('16505551212', ['e164.dnspython.org.', 'e164.arpa.']) - - *number*, a ``text`` is the number to look for. - - *domains* is an iterable containing ``dns.name.Name`` values. - - *resolver*, a ``dns.resolver.Resolver``, is the resolver to use. If - ``None``, the default resolver is used. - """ - - if resolver is None: - resolver = dns.resolver.get_default_resolver() - e_nx = dns.resolver.NXDOMAIN() - for domain in domains: - if isinstance(domain, string_types): - domain = dns.name.from_text(domain) - qname = dns.e164.from_e164(number, domain) - try: - return resolver.query(qname, 'NAPTR') - except dns.resolver.NXDOMAIN as e: - e_nx += e - raise e_nx diff --git a/lib/dns/e164.pyi b/lib/dns/e164.pyi deleted file mode 100644 index 37a99fed..00000000 --- a/lib/dns/e164.pyi +++ /dev/null @@ -1,10 +0,0 @@ -from typing import Optional, Iterable -from . import name, resolver -def from_e164(text : str, origin=name.Name(".")) -> name.Name: - ... - -def to_e164(name : name.Name, origin : Optional[name.Name] = None, want_plus_prefix=True) -> str: - ... - -def query(number : str, domains : Iterable[str], resolver : Optional[resolver.Resolver] = None) -> resolver.Answer: - ... diff --git a/lib/dns/edns.py b/lib/dns/edns.py deleted file mode 100644 index 5660f7bb..00000000 --- a/lib/dns/edns.py +++ /dev/null @@ -1,269 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2009-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""EDNS Options""" - -from __future__ import absolute_import - -import math -import struct - -import dns.inet - -#: NSID -NSID = 3 -#: DAU -DAU = 5 -#: DHU -DHU = 6 -#: N3U -N3U = 7 -#: ECS (client-subnet) -ECS = 8 -#: EXPIRE -EXPIRE = 9 -#: COOKIE -COOKIE = 10 -#: KEEPALIVE -KEEPALIVE = 11 -#: PADDING -PADDING = 12 -#: CHAIN -CHAIN = 13 - -class Option(object): - - """Base class for all EDNS option types.""" - - def __init__(self, otype): - """Initialize an option. - - *otype*, an ``int``, is the option type. - """ - self.otype = otype - - def to_wire(self, file): - """Convert an option to wire format. - """ - raise NotImplementedError - - @classmethod - def from_wire(cls, otype, wire, current, olen): - """Build an EDNS option object from wire format. - - *otype*, an ``int``, is the option type. - - *wire*, a ``binary``, is the wire-format message. - - *current*, an ``int``, is the offset in *wire* of the beginning - of the rdata. - - *olen*, an ``int``, is the length of the wire-format option data - - Returns a ``dns.edns.Option``. - """ - - raise NotImplementedError - - def _cmp(self, other): - """Compare an EDNS option with another option of the same type. - - Returns < 0 if < *other*, 0 if == *other*, and > 0 if > *other*. - """ - raise NotImplementedError - - def __eq__(self, other): - if not isinstance(other, Option): - return False - if self.otype != other.otype: - return False - return self._cmp(other) == 0 - - def __ne__(self, other): - if not isinstance(other, Option): - return False - if self.otype != other.otype: - return False - return self._cmp(other) != 0 - - def __lt__(self, other): - if not isinstance(other, Option) or \ - self.otype != other.otype: - return NotImplemented - return self._cmp(other) < 0 - - def __le__(self, other): - if not isinstance(other, Option) or \ - self.otype != other.otype: - return NotImplemented - return self._cmp(other) <= 0 - - def __ge__(self, other): - if not isinstance(other, Option) or \ - self.otype != other.otype: - return NotImplemented - return self._cmp(other) >= 0 - - def __gt__(self, other): - if not isinstance(other, Option) or \ - self.otype != other.otype: - return NotImplemented - return self._cmp(other) > 0 - - -class GenericOption(Option): - - """Generic Option Class - - This class is used for EDNS option types for which we have no better - implementation. - """ - - def __init__(self, otype, data): - super(GenericOption, self).__init__(otype) - self.data = data - - def to_wire(self, file): - file.write(self.data) - - def to_text(self): - return "Generic %d" % self.otype - - @classmethod - def from_wire(cls, otype, wire, current, olen): - return cls(otype, wire[current: current + olen]) - - def _cmp(self, other): - if self.data == other.data: - return 0 - if self.data > other.data: - return 1 - return -1 - - -class ECSOption(Option): - """EDNS Client Subnet (ECS, RFC7871)""" - - def __init__(self, address, srclen=None, scopelen=0): - """*address*, a ``text``, is the client address information. - - *srclen*, an ``int``, the source prefix length, which is the - leftmost number of bits of the address to be used for the - lookup. The default is 24 for IPv4 and 56 for IPv6. - - *scopelen*, an ``int``, the scope prefix length. This value - must be 0 in queries, and should be set in responses. - """ - - super(ECSOption, self).__init__(ECS) - af = dns.inet.af_for_address(address) - - if af == dns.inet.AF_INET6: - self.family = 2 - if srclen is None: - srclen = 56 - elif af == dns.inet.AF_INET: - self.family = 1 - if srclen is None: - srclen = 24 - else: - raise ValueError('Bad ip family') - - self.address = address - self.srclen = srclen - self.scopelen = scopelen - - addrdata = dns.inet.inet_pton(af, address) - nbytes = int(math.ceil(srclen/8.0)) - - # Truncate to srclen and pad to the end of the last octet needed - # See RFC section 6 - self.addrdata = addrdata[:nbytes] - nbits = srclen % 8 - if nbits != 0: - last = struct.pack('B', ord(self.addrdata[-1:]) & (0xff << nbits)) - self.addrdata = self.addrdata[:-1] + last - - def to_text(self): - return "ECS {}/{} scope/{}".format(self.address, self.srclen, - self.scopelen) - - def to_wire(self, file): - file.write(struct.pack('!H', self.family)) - file.write(struct.pack('!BB', self.srclen, self.scopelen)) - file.write(self.addrdata) - - @classmethod - def from_wire(cls, otype, wire, cur, olen): - family, src, scope = struct.unpack('!HBB', wire[cur:cur+4]) - cur += 4 - - addrlen = int(math.ceil(src/8.0)) - - if family == 1: - af = dns.inet.AF_INET - pad = 4 - addrlen - elif family == 2: - af = dns.inet.AF_INET6 - pad = 16 - addrlen - else: - raise ValueError('unsupported family') - - addr = dns.inet.inet_ntop(af, wire[cur:cur+addrlen] + b'\x00' * pad) - return cls(addr, src, scope) - - def _cmp(self, other): - if self.addrdata == other.addrdata: - return 0 - if self.addrdata > other.addrdata: - return 1 - return -1 - -_type_to_class = { - ECS: ECSOption -} - -def get_option_class(otype): - """Return the class for the specified option type. - - The GenericOption class is used if a more specific class is not - known. - """ - - cls = _type_to_class.get(otype) - if cls is None: - cls = GenericOption - return cls - - -def option_from_wire(otype, wire, current, olen): - """Build an EDNS option object from wire format. - - *otype*, an ``int``, is the option type. - - *wire*, a ``binary``, is the wire-format message. - - *current*, an ``int``, is the offset in *wire* of the beginning - of the rdata. - - *olen*, an ``int``, is the length of the wire-format option data - - Returns an instance of a subclass of ``dns.edns.Option``. - """ - - cls = get_option_class(otype) - return cls.from_wire(otype, wire, current, olen) diff --git a/lib/dns/entropy.py b/lib/dns/entropy.py deleted file mode 100644 index 00c6a4b3..00000000 --- a/lib/dns/entropy.py +++ /dev/null @@ -1,148 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2009-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import os -import random -import time -from ._compat import long, binary_type -try: - import threading as _threading -except ImportError: - import dummy_threading as _threading - - -class EntropyPool(object): - - # This is an entropy pool for Python implementations that do not - # have a working SystemRandom. I'm not sure there are any, but - # leaving this code doesn't hurt anything as the library code - # is used if present. - - def __init__(self, seed=None): - self.pool_index = 0 - self.digest = None - self.next_byte = 0 - self.lock = _threading.Lock() - try: - import hashlib - self.hash = hashlib.sha1() - self.hash_len = 20 - except ImportError: - try: - import sha - self.hash = sha.new() - self.hash_len = 20 - except ImportError: - import md5 # pylint: disable=import-error - self.hash = md5.new() - self.hash_len = 16 - self.pool = bytearray(b'\0' * self.hash_len) - if seed is not None: - self.stir(bytearray(seed)) - self.seeded = True - self.seed_pid = os.getpid() - else: - self.seeded = False - self.seed_pid = 0 - - def stir(self, entropy, already_locked=False): - if not already_locked: - self.lock.acquire() - try: - for c in entropy: - if self.pool_index == self.hash_len: - self.pool_index = 0 - b = c & 0xff - self.pool[self.pool_index] ^= b - self.pool_index += 1 - finally: - if not already_locked: - self.lock.release() - - def _maybe_seed(self): - if not self.seeded or self.seed_pid != os.getpid(): - try: - seed = os.urandom(16) - except Exception: - try: - r = open('/dev/urandom', 'rb', 0) - try: - seed = r.read(16) - finally: - r.close() - except Exception: - seed = str(time.time()) - self.seeded = True - self.seed_pid = os.getpid() - self.digest = None - seed = bytearray(seed) - self.stir(seed, True) - - def random_8(self): - self.lock.acquire() - try: - self._maybe_seed() - if self.digest is None or self.next_byte == self.hash_len: - self.hash.update(binary_type(self.pool)) - self.digest = bytearray(self.hash.digest()) - self.stir(self.digest, True) - self.next_byte = 0 - value = self.digest[self.next_byte] - self.next_byte += 1 - finally: - self.lock.release() - return value - - def random_16(self): - return self.random_8() * 256 + self.random_8() - - def random_32(self): - return self.random_16() * 65536 + self.random_16() - - def random_between(self, first, last): - size = last - first + 1 - if size > long(4294967296): - raise ValueError('too big') - if size > 65536: - rand = self.random_32 - max = long(4294967295) - elif size > 256: - rand = self.random_16 - max = 65535 - else: - rand = self.random_8 - max = 255 - return first + size * rand() // (max + 1) - -pool = EntropyPool() - -try: - system_random = random.SystemRandom() -except Exception: - system_random = None - -def random_16(): - if system_random is not None: - return system_random.randrange(0, 65536) - else: - return pool.random_16() - -def between(first, last): - if system_random is not None: - return system_random.randrange(first, last + 1) - else: - return pool.random_between(first, last) diff --git a/lib/dns/entropy.pyi b/lib/dns/entropy.pyi deleted file mode 100644 index 818f805a..00000000 --- a/lib/dns/entropy.pyi +++ /dev/null @@ -1,10 +0,0 @@ -from typing import Optional -from random import SystemRandom - -system_random : Optional[SystemRandom] - -def random_16() -> int: - pass - -def between(first: int, last: int) -> int: - pass diff --git a/lib/dns/exception.py b/lib/dns/exception.py deleted file mode 100644 index 71ff04f1..00000000 --- a/lib/dns/exception.py +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Common DNS Exceptions. - -Dnspython modules may also define their own exceptions, which will -always be subclasses of ``DNSException``. -""" - -class DNSException(Exception): - """Abstract base class shared by all dnspython exceptions. - - It supports two basic modes of operation: - - a) Old/compatible mode is used if ``__init__`` was called with - empty *kwargs*. In compatible mode all *args* are passed - to the standard Python Exception class as before and all *args* are - printed by the standard ``__str__`` implementation. Class variable - ``msg`` (or doc string if ``msg`` is ``None``) is returned from ``str()`` - if *args* is empty. - - b) New/parametrized mode is used if ``__init__`` was called with - non-empty *kwargs*. - In the new mode *args* must be empty and all kwargs must match - those set in class variable ``supp_kwargs``. All kwargs are stored inside - ``self.kwargs`` and used in a new ``__str__`` implementation to construct - a formatted message based on the ``fmt`` class variable, a ``string``. - - In the simplest case it is enough to override the ``supp_kwargs`` - and ``fmt`` class variables to get nice parametrized messages. - """ - - msg = None # non-parametrized message - supp_kwargs = set() # accepted parameters for _fmt_kwargs (sanity check) - fmt = None # message parametrized with results from _fmt_kwargs - - def __init__(self, *args, **kwargs): - self._check_params(*args, **kwargs) - if kwargs: - self.kwargs = self._check_kwargs(**kwargs) - self.msg = str(self) - else: - self.kwargs = dict() # defined but empty for old mode exceptions - if self.msg is None: - # doc string is better implicit message than empty string - self.msg = self.__doc__ - if args: - super(DNSException, self).__init__(*args) - else: - super(DNSException, self).__init__(self.msg) - - def _check_params(self, *args, **kwargs): - """Old exceptions supported only args and not kwargs. - - For sanity we do not allow to mix old and new behavior.""" - if args or kwargs: - assert bool(args) != bool(kwargs), \ - 'keyword arguments are mutually exclusive with positional args' - - def _check_kwargs(self, **kwargs): - if kwargs: - assert set(kwargs.keys()) == self.supp_kwargs, \ - 'following set of keyword args is required: %s' % ( - self.supp_kwargs) - return kwargs - - def _fmt_kwargs(self, **kwargs): - """Format kwargs before printing them. - - Resulting dictionary has to have keys necessary for str.format call - on fmt class variable. - """ - fmtargs = {} - for kw, data in kwargs.items(): - if isinstance(data, (list, set)): - # convert list of <someobj> to list of str(<someobj>) - fmtargs[kw] = list(map(str, data)) - if len(fmtargs[kw]) == 1: - # remove list brackets [] from single-item lists - fmtargs[kw] = fmtargs[kw].pop() - else: - fmtargs[kw] = data - return fmtargs - - def __str__(self): - if self.kwargs and self.fmt: - # provide custom message constructed from keyword arguments - fmtargs = self._fmt_kwargs(**self.kwargs) - return self.fmt.format(**fmtargs) - else: - # print *args directly in the same way as old DNSException - return super(DNSException, self).__str__() - - -class FormError(DNSException): - """DNS message is malformed.""" - - -class SyntaxError(DNSException): - """Text input is malformed.""" - - -class UnexpectedEnd(SyntaxError): - """Text input ended unexpectedly.""" - - -class TooBig(DNSException): - """The DNS message is too big.""" - - -class Timeout(DNSException): - """The DNS operation timed out.""" - supp_kwargs = {'timeout'} - fmt = "The DNS operation timed out after {timeout} seconds" diff --git a/lib/dns/exception.pyi b/lib/dns/exception.pyi deleted file mode 100644 index 4b346cc4..00000000 --- a/lib/dns/exception.pyi +++ /dev/null @@ -1,9 +0,0 @@ -from typing import Set, Optional, Dict - -class DNSException(Exception): - supp_kwargs : Set[str] - kwargs : Optional[Dict] - -class SyntaxError(DNSException): ... -class FormError(DNSException): ... -class Timeout(DNSException): ... diff --git a/lib/dns/flags.py b/lib/dns/flags.py deleted file mode 100644 index 0119dec7..00000000 --- a/lib/dns/flags.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Message Flags.""" - -# Standard DNS flags - -#: Query Response -QR = 0x8000 -#: Authoritative Answer -AA = 0x0400 -#: Truncated Response -TC = 0x0200 -#: Recursion Desired -RD = 0x0100 -#: Recursion Available -RA = 0x0080 -#: Authentic Data -AD = 0x0020 -#: Checking Disabled -CD = 0x0010 - -# EDNS flags - -#: DNSSEC answer OK -DO = 0x8000 - -_by_text = { - 'QR': QR, - 'AA': AA, - 'TC': TC, - 'RD': RD, - 'RA': RA, - 'AD': AD, - 'CD': CD -} - -_edns_by_text = { - 'DO': DO -} - - -# We construct the inverse mappings programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mappings not to be true inverses. - -_by_value = {y: x for x, y in _by_text.items()} - -_edns_by_value = {y: x for x, y in _edns_by_text.items()} - - -def _order_flags(table): - order = list(table.items()) - order.sort() - order.reverse() - return order - -_flags_order = _order_flags(_by_value) - -_edns_flags_order = _order_flags(_edns_by_value) - - -def _from_text(text, table): - flags = 0 - tokens = text.split() - for t in tokens: - flags = flags | table[t.upper()] - return flags - - -def _to_text(flags, table, order): - text_flags = [] - for k, v in order: - if flags & k != 0: - text_flags.append(v) - return ' '.join(text_flags) - - -def from_text(text): - """Convert a space-separated list of flag text values into a flags - value. - - Returns an ``int`` - """ - - return _from_text(text, _by_text) - - -def to_text(flags): - """Convert a flags value into a space-separated list of flag text - values. - - Returns a ``text``. - """ - - return _to_text(flags, _by_value, _flags_order) - - -def edns_from_text(text): - """Convert a space-separated list of EDNS flag text values into a EDNS - flags value. - - Returns an ``int`` - """ - - return _from_text(text, _edns_by_text) - - -def edns_to_text(flags): - """Convert an EDNS flags value into a space-separated list of EDNS flag - text values. - - Returns a ``text``. - """ - - return _to_text(flags, _edns_by_value, _edns_flags_order) diff --git a/lib/dns/grange.py b/lib/dns/grange.py deleted file mode 100644 index ffe8be7c..00000000 --- a/lib/dns/grange.py +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2012-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS GENERATE range conversion.""" - -import dns - -def from_text(text): - """Convert the text form of a range in a ``$GENERATE`` statement to an - integer. - - *text*, a ``str``, the textual range in ``$GENERATE`` form. - - Returns a tuple of three ``int`` values ``(start, stop, step)``. - """ - - # TODO, figure out the bounds on start, stop and step. - step = 1 - cur = '' - state = 0 - # state 0 1 2 3 4 - # x - y / z - - if text and text[0] == '-': - raise dns.exception.SyntaxError("Start cannot be a negative number") - - for c in text: - if c == '-' and state == 0: - start = int(cur) - cur = '' - state = 2 - elif c == '/': - stop = int(cur) - cur = '' - state = 4 - elif c.isdigit(): - cur += c - else: - raise dns.exception.SyntaxError("Could not parse %s" % (c)) - - if state in (1, 3): - raise dns.exception.SyntaxError() - - if state == 2: - stop = int(cur) - - if state == 4: - step = int(cur) - - assert step >= 1 - assert start >= 0 - assert start <= stop - # TODO, can start == stop? - - return (start, stop, step) diff --git a/lib/dns/hash.py b/lib/dns/hash.py deleted file mode 100644 index 1713e628..00000000 --- a/lib/dns/hash.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Hashing backwards compatibility wrapper""" - -import hashlib -import warnings - -warnings.warn( - "dns.hash module will be removed in future versions. Please use hashlib instead.", - DeprecationWarning) - -hashes = {} -hashes['MD5'] = hashlib.md5 -hashes['SHA1'] = hashlib.sha1 -hashes['SHA224'] = hashlib.sha224 -hashes['SHA256'] = hashlib.sha256 -hashes['SHA384'] = hashlib.sha384 -hashes['SHA512'] = hashlib.sha512 - - -def get(algorithm): - return hashes[algorithm.upper()] diff --git a/lib/dns/inet.py b/lib/dns/inet.py deleted file mode 100644 index c8d7c1b4..00000000 --- a/lib/dns/inet.py +++ /dev/null @@ -1,124 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Generic Internet address helper functions.""" - -import socket - -import dns.ipv4 -import dns.ipv6 - -from ._compat import maybe_ord - -# We assume that AF_INET is always defined. - -AF_INET = socket.AF_INET - -# AF_INET6 might not be defined in the socket module, but we need it. -# We'll try to use the socket module's value, and if it doesn't work, -# we'll use our own value. - -try: - AF_INET6 = socket.AF_INET6 -except AttributeError: - AF_INET6 = 9999 - - -def inet_pton(family, text): - """Convert the textual form of a network address into its binary form. - - *family* is an ``int``, the address family. - - *text* is a ``text``, the textual address. - - Raises ``NotImplementedError`` if the address family specified is not - implemented. - - Returns a ``binary``. - """ - - if family == AF_INET: - return dns.ipv4.inet_aton(text) - elif family == AF_INET6: - return dns.ipv6.inet_aton(text) - else: - raise NotImplementedError - - -def inet_ntop(family, address): - """Convert the binary form of a network address into its textual form. - - *family* is an ``int``, the address family. - - *address* is a ``binary``, the network address in binary form. - - Raises ``NotImplementedError`` if the address family specified is not - implemented. - - Returns a ``text``. - """ - - if family == AF_INET: - return dns.ipv4.inet_ntoa(address) - elif family == AF_INET6: - return dns.ipv6.inet_ntoa(address) - else: - raise NotImplementedError - - -def af_for_address(text): - """Determine the address family of a textual-form network address. - - *text*, a ``text``, the textual address. - - Raises ``ValueError`` if the address family cannot be determined - from the input. - - Returns an ``int``. - """ - - try: - dns.ipv4.inet_aton(text) - return AF_INET - except Exception: - try: - dns.ipv6.inet_aton(text) - return AF_INET6 - except: - raise ValueError - - -def is_multicast(text): - """Is the textual-form network address a multicast address? - - *text*, a ``text``, the textual address. - - Raises ``ValueError`` if the address family cannot be determined - from the input. - - Returns a ``bool``. - """ - - try: - first = maybe_ord(dns.ipv4.inet_aton(text)[0]) - return first >= 224 and first <= 239 - except Exception: - try: - first = maybe_ord(dns.ipv6.inet_aton(text)[0]) - return first == 255 - except Exception: - raise ValueError diff --git a/lib/dns/inet.pyi b/lib/dns/inet.pyi deleted file mode 100644 index 6d9dcc70..00000000 --- a/lib/dns/inet.pyi +++ /dev/null @@ -1,4 +0,0 @@ -from typing import Union -from socket import AddressFamily - -AF_INET6 : Union[int, AddressFamily] diff --git a/lib/dns/ipv4.py b/lib/dns/ipv4.py deleted file mode 100644 index 8fc4f7dc..00000000 --- a/lib/dns/ipv4.py +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""IPv4 helper functions.""" - -import struct - -import dns.exception -from ._compat import binary_type - -def inet_ntoa(address): - """Convert an IPv4 address in binary form to text form. - - *address*, a ``binary``, the IPv4 address in binary form. - - Returns a ``text``. - """ - - if len(address) != 4: - raise dns.exception.SyntaxError - if not isinstance(address, bytearray): - address = bytearray(address) - return ('%u.%u.%u.%u' % (address[0], address[1], - address[2], address[3])) - -def inet_aton(text): - """Convert an IPv4 address in text form to binary form. - - *text*, a ``text``, the IPv4 address in textual form. - - Returns a ``binary``. - """ - - if not isinstance(text, binary_type): - text = text.encode() - parts = text.split(b'.') - if len(parts) != 4: - raise dns.exception.SyntaxError - for part in parts: - if not part.isdigit(): - raise dns.exception.SyntaxError - if len(part) > 1 and part[0] == '0': - # No leading zeros - raise dns.exception.SyntaxError - try: - bytes = [int(part) for part in parts] - return struct.pack('BBBB', *bytes) - except: - raise dns.exception.SyntaxError diff --git a/lib/dns/ipv6.py b/lib/dns/ipv6.py deleted file mode 100644 index 128e56c8..00000000 --- a/lib/dns/ipv6.py +++ /dev/null @@ -1,181 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""IPv6 helper functions.""" - -import re -import binascii - -import dns.exception -import dns.ipv4 -from ._compat import xrange, binary_type, maybe_decode - -_leading_zero = re.compile(r'0+([0-9a-f]+)') - -def inet_ntoa(address): - """Convert an IPv6 address in binary form to text form. - - *address*, a ``binary``, the IPv6 address in binary form. - - Raises ``ValueError`` if the address isn't 16 bytes long. - Returns a ``text``. - """ - - if len(address) != 16: - raise ValueError("IPv6 addresses are 16 bytes long") - hex = binascii.hexlify(address) - chunks = [] - i = 0 - l = len(hex) - while i < l: - chunk = maybe_decode(hex[i : i + 4]) - # strip leading zeros. we do this with an re instead of - # with lstrip() because lstrip() didn't support chars until - # python 2.2.2 - m = _leading_zero.match(chunk) - if not m is None: - chunk = m.group(1) - chunks.append(chunk) - i += 4 - # - # Compress the longest subsequence of 0-value chunks to :: - # - best_start = 0 - best_len = 0 - start = -1 - last_was_zero = False - for i in xrange(8): - if chunks[i] != '0': - if last_was_zero: - end = i - current_len = end - start - if current_len > best_len: - best_start = start - best_len = current_len - last_was_zero = False - elif not last_was_zero: - start = i - last_was_zero = True - if last_was_zero: - end = 8 - current_len = end - start - if current_len > best_len: - best_start = start - best_len = current_len - if best_len > 1: - if best_start == 0 and \ - (best_len == 6 or - best_len == 5 and chunks[5] == 'ffff'): - # We have an embedded IPv4 address - if best_len == 6: - prefix = '::' - else: - prefix = '::ffff:' - hex = prefix + dns.ipv4.inet_ntoa(address[12:]) - else: - hex = ':'.join(chunks[:best_start]) + '::' + \ - ':'.join(chunks[best_start + best_len:]) - else: - hex = ':'.join(chunks) - return hex - -_v4_ending = re.compile(br'(.*):(\d+\.\d+\.\d+\.\d+)$') -_colon_colon_start = re.compile(br'::.*') -_colon_colon_end = re.compile(br'.*::$') - -def inet_aton(text): - """Convert an IPv6 address in text form to binary form. - - *text*, a ``text``, the IPv6 address in textual form. - - Returns a ``binary``. - """ - - # - # Our aim here is not something fast; we just want something that works. - # - if not isinstance(text, binary_type): - text = text.encode() - - if text == b'::': - text = b'0::' - # - # Get rid of the icky dot-quad syntax if we have it. - # - m = _v4_ending.match(text) - if not m is None: - b = bytearray(dns.ipv4.inet_aton(m.group(2))) - text = (u"{}:{:02x}{:02x}:{:02x}{:02x}".format(m.group(1).decode(), - b[0], b[1], b[2], - b[3])).encode() - # - # Try to turn '::<whatever>' into ':<whatever>'; if no match try to - # turn '<whatever>::' into '<whatever>:' - # - m = _colon_colon_start.match(text) - if not m is None: - text = text[1:] - else: - m = _colon_colon_end.match(text) - if not m is None: - text = text[:-1] - # - # Now canonicalize into 8 chunks of 4 hex digits each - # - chunks = text.split(b':') - l = len(chunks) - if l > 8: - raise dns.exception.SyntaxError - seen_empty = False - canonical = [] - for c in chunks: - if c == b'': - if seen_empty: - raise dns.exception.SyntaxError - seen_empty = True - for i in xrange(0, 8 - l + 1): - canonical.append(b'0000') - else: - lc = len(c) - if lc > 4: - raise dns.exception.SyntaxError - if lc != 4: - c = (b'0' * (4 - lc)) + c - canonical.append(c) - if l < 8 and not seen_empty: - raise dns.exception.SyntaxError - text = b''.join(canonical) - - # - # Finally we can go to binary. - # - try: - return binascii.unhexlify(text) - except (binascii.Error, TypeError): - raise dns.exception.SyntaxError - -_mapped_prefix = b'\x00' * 10 + b'\xff\xff' - -def is_mapped(address): - """Is the specified address a mapped IPv4 address? - - *address*, a ``binary`` is an IPv6 address in binary form. - - Returns a ``bool``. - """ - - return address.startswith(_mapped_prefix) diff --git a/lib/dns/message.py b/lib/dns/message.py deleted file mode 100644 index 9d2b2f43..00000000 --- a/lib/dns/message.py +++ /dev/null @@ -1,1175 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Messages""" - -from __future__ import absolute_import - -from io import StringIO -import struct -import time - -import dns.edns -import dns.exception -import dns.flags -import dns.name -import dns.opcode -import dns.entropy -import dns.rcode -import dns.rdata -import dns.rdataclass -import dns.rdatatype -import dns.rrset -import dns.renderer -import dns.tsig -import dns.wiredata - -from ._compat import long, xrange, string_types - - -class ShortHeader(dns.exception.FormError): - """The DNS packet passed to from_wire() is too short.""" - - -class TrailingJunk(dns.exception.FormError): - """The DNS packet passed to from_wire() has extra junk at the end of it.""" - - -class UnknownHeaderField(dns.exception.DNSException): - """The header field name was not recognized when converting from text - into a message.""" - - -class BadEDNS(dns.exception.FormError): - """An OPT record occurred somewhere other than the start of - the additional data section.""" - - -class BadTSIG(dns.exception.FormError): - """A TSIG record occurred somewhere other than the end of - the additional data section.""" - - -class UnknownTSIGKey(dns.exception.DNSException): - """A TSIG with an unknown key was received.""" - - -#: The question section number -QUESTION = 0 - -#: The answer section number -ANSWER = 1 - -#: The authority section number -AUTHORITY = 2 - -#: The additional section number -ADDITIONAL = 3 - -class Message(object): - """A DNS message.""" - - def __init__(self, id=None): - if id is None: - self.id = dns.entropy.random_16() - else: - self.id = id - self.flags = 0 - self.question = [] - self.answer = [] - self.authority = [] - self.additional = [] - self.edns = -1 - self.ednsflags = 0 - self.payload = 0 - self.options = [] - self.request_payload = 0 - self.keyring = None - self.keyname = None - self.keyalgorithm = dns.tsig.default_algorithm - self.request_mac = b'' - self.other_data = b'' - self.tsig_error = 0 - self.fudge = 300 - self.original_id = self.id - self.mac = b'' - self.xfr = False - self.origin = None - self.tsig_ctx = None - self.had_tsig = False - self.multi = False - self.first = True - self.index = {} - - def __repr__(self): - return '<DNS message, ID ' + repr(self.id) + '>' - - def __str__(self): - return self.to_text() - - def to_text(self, origin=None, relativize=True, **kw): - """Convert the message to text. - - The *origin*, *relativize*, and any other keyword - arguments are passed to the RRset ``to_wire()`` method. - - Returns a ``text``. - """ - - s = StringIO() - s.write(u'id %d\n' % self.id) - s.write(u'opcode %s\n' % - dns.opcode.to_text(dns.opcode.from_flags(self.flags))) - rc = dns.rcode.from_flags(self.flags, self.ednsflags) - s.write(u'rcode %s\n' % dns.rcode.to_text(rc)) - s.write(u'flags %s\n' % dns.flags.to_text(self.flags)) - if self.edns >= 0: - s.write(u'edns %s\n' % self.edns) - if self.ednsflags != 0: - s.write(u'eflags %s\n' % - dns.flags.edns_to_text(self.ednsflags)) - s.write(u'payload %d\n' % self.payload) - for opt in self.options: - s.write(u'option %s\n' % opt.to_text()) - is_update = dns.opcode.is_update(self.flags) - if is_update: - s.write(u';ZONE\n') - else: - s.write(u';QUESTION\n') - for rrset in self.question: - s.write(rrset.to_text(origin, relativize, **kw)) - s.write(u'\n') - if is_update: - s.write(u';PREREQ\n') - else: - s.write(u';ANSWER\n') - for rrset in self.answer: - s.write(rrset.to_text(origin, relativize, **kw)) - s.write(u'\n') - if is_update: - s.write(u';UPDATE\n') - else: - s.write(u';AUTHORITY\n') - for rrset in self.authority: - s.write(rrset.to_text(origin, relativize, **kw)) - s.write(u'\n') - s.write(u';ADDITIONAL\n') - for rrset in self.additional: - s.write(rrset.to_text(origin, relativize, **kw)) - s.write(u'\n') - # - # We strip off the final \n so the caller can print the result without - # doing weird things to get around eccentricities in Python print - # formatting - # - return s.getvalue()[:-1] - - def __eq__(self, other): - """Two messages are equal if they have the same content in the - header, question, answer, and authority sections. - - Returns a ``bool``. - """ - - if not isinstance(other, Message): - return False - if self.id != other.id: - return False - if self.flags != other.flags: - return False - for n in self.question: - if n not in other.question: - return False - for n in other.question: - if n not in self.question: - return False - for n in self.answer: - if n not in other.answer: - return False - for n in other.answer: - if n not in self.answer: - return False - for n in self.authority: - if n not in other.authority: - return False - for n in other.authority: - if n not in self.authority: - return False - return True - - def __ne__(self, other): - return not self.__eq__(other) - - def is_response(self, other): - """Is this message a response to *other*? - - Returns a ``bool``. - """ - - if other.flags & dns.flags.QR == 0 or \ - self.id != other.id or \ - dns.opcode.from_flags(self.flags) != \ - dns.opcode.from_flags(other.flags): - return False - if dns.rcode.from_flags(other.flags, other.ednsflags) != \ - dns.rcode.NOERROR: - return True - if dns.opcode.is_update(self.flags): - return True - for n in self.question: - if n not in other.question: - return False - for n in other.question: - if n not in self.question: - return False - return True - - def section_number(self, section): - """Return the "section number" of the specified section for use - in indexing. The question section is 0, the answer section is 1, - the authority section is 2, and the additional section is 3. - - *section* is one of the section attributes of this message. - - Raises ``ValueError`` if the section isn't known. - - Returns an ``int``. - """ - - if section is self.question: - return QUESTION - elif section is self.answer: - return ANSWER - elif section is self.authority: - return AUTHORITY - elif section is self.additional: - return ADDITIONAL - else: - raise ValueError('unknown section') - - def section_from_number(self, number): - """Return the "section number" of the specified section for use - in indexing. The question section is 0, the answer section is 1, - the authority section is 2, and the additional section is 3. - - *section* is one of the section attributes of this message. - - Raises ``ValueError`` if the section isn't known. - - Returns an ``int``. - """ - - if number == QUESTION: - return self.question - elif number == ANSWER: - return self.answer - elif number == AUTHORITY: - return self.authority - elif number == ADDITIONAL: - return self.additional - else: - raise ValueError('unknown section') - - def find_rrset(self, section, name, rdclass, rdtype, - covers=dns.rdatatype.NONE, deleting=None, create=False, - force_unique=False): - """Find the RRset with the given attributes in the specified section. - - *section*, an ``int`` section number, or one of the section - attributes of this message. This specifies the - the section of the message to search. For example:: - - my_message.find_rrset(my_message.answer, name, rdclass, rdtype) - my_message.find_rrset(dns.message.ANSWER, name, rdclass, rdtype) - - *name*, a ``dns.name.Name``, the name of the RRset. - - *rdclass*, an ``int``, the class of the RRset. - - *rdtype*, an ``int``, the type of the RRset. - - *covers*, an ``int`` or ``None``, the covers value of the RRset. - The default is ``None``. - - *deleting*, an ``int`` or ``None``, the deleting value of the RRset. - The default is ``None``. - - *create*, a ``bool``. If ``True``, create the RRset if it is not found. - The created RRset is appended to *section*. - - *force_unique*, a ``bool``. If ``True`` and *create* is also ``True``, - create a new RRset regardless of whether a matching RRset exists - already. The default is ``False``. This is useful when creating - DDNS Update messages, as order matters for them. - - Raises ``KeyError`` if the RRset was not found and create was - ``False``. - - Returns a ``dns.rrset.RRset object``. - """ - - if isinstance(section, int): - section_number = section - section = self.section_from_number(section_number) - else: - section_number = self.section_number(section) - key = (section_number, name, rdclass, rdtype, covers, deleting) - if not force_unique: - if self.index is not None: - rrset = self.index.get(key) - if rrset is not None: - return rrset - else: - for rrset in section: - if rrset.match(name, rdclass, rdtype, covers, deleting): - return rrset - if not create: - raise KeyError - rrset = dns.rrset.RRset(name, rdclass, rdtype, covers, deleting) - section.append(rrset) - if self.index is not None: - self.index[key] = rrset - return rrset - - def get_rrset(self, section, name, rdclass, rdtype, - covers=dns.rdatatype.NONE, deleting=None, create=False, - force_unique=False): - """Get the RRset with the given attributes in the specified section. - - If the RRset is not found, None is returned. - - *section*, an ``int`` section number, or one of the section - attributes of this message. This specifies the - the section of the message to search. For example:: - - my_message.get_rrset(my_message.answer, name, rdclass, rdtype) - my_message.get_rrset(dns.message.ANSWER, name, rdclass, rdtype) - - *name*, a ``dns.name.Name``, the name of the RRset. - - *rdclass*, an ``int``, the class of the RRset. - - *rdtype*, an ``int``, the type of the RRset. - - *covers*, an ``int`` or ``None``, the covers value of the RRset. - The default is ``None``. - - *deleting*, an ``int`` or ``None``, the deleting value of the RRset. - The default is ``None``. - - *create*, a ``bool``. If ``True``, create the RRset if it is not found. - The created RRset is appended to *section*. - - *force_unique*, a ``bool``. If ``True`` and *create* is also ``True``, - create a new RRset regardless of whether a matching RRset exists - already. The default is ``False``. This is useful when creating - DDNS Update messages, as order matters for them. - - Returns a ``dns.rrset.RRset object`` or ``None``. - """ - - try: - rrset = self.find_rrset(section, name, rdclass, rdtype, covers, - deleting, create, force_unique) - except KeyError: - rrset = None - return rrset - - def to_wire(self, origin=None, max_size=0, **kw): - """Return a string containing the message in DNS compressed wire - format. - - Additional keyword arguments are passed to the RRset ``to_wire()`` - method. - - *origin*, a ``dns.name.Name`` or ``None``, the origin to be appended - to any relative names. - - *max_size*, an ``int``, the maximum size of the wire format - output; default is 0, which means "the message's request - payload, if nonzero, or 65535". - - Raises ``dns.exception.TooBig`` if *max_size* was exceeded. - - Returns a ``binary``. - """ - - if max_size == 0: - if self.request_payload != 0: - max_size = self.request_payload - else: - max_size = 65535 - if max_size < 512: - max_size = 512 - elif max_size > 65535: - max_size = 65535 - r = dns.renderer.Renderer(self.id, self.flags, max_size, origin) - for rrset in self.question: - r.add_question(rrset.name, rrset.rdtype, rrset.rdclass) - for rrset in self.answer: - r.add_rrset(dns.renderer.ANSWER, rrset, **kw) - for rrset in self.authority: - r.add_rrset(dns.renderer.AUTHORITY, rrset, **kw) - if self.edns >= 0: - r.add_edns(self.edns, self.ednsflags, self.payload, self.options) - for rrset in self.additional: - r.add_rrset(dns.renderer.ADDITIONAL, rrset, **kw) - r.write_header() - if self.keyname is not None: - r.add_tsig(self.keyname, self.keyring[self.keyname], - self.fudge, self.original_id, self.tsig_error, - self.other_data, self.request_mac, - self.keyalgorithm) - self.mac = r.mac - return r.get_wire() - - def use_tsig(self, keyring, keyname=None, fudge=300, - original_id=None, tsig_error=0, other_data=b'', - algorithm=dns.tsig.default_algorithm): - """When sending, a TSIG signature using the specified keyring - and keyname should be added. - - See the documentation of the Message class for a complete - description of the keyring dictionary. - - *keyring*, a ``dict``, the TSIG keyring to use. If a - *keyring* is specified but a *keyname* is not, then the key - used will be the first key in the *keyring*. Note that the - order of keys in a dictionary is not defined, so applications - should supply a keyname when a keyring is used, unless they - know the keyring contains only one key. - - *keyname*, a ``dns.name.Name`` or ``None``, the name of the TSIG key - to use; defaults to ``None``. The key must be defined in the keyring. - - *fudge*, an ``int``, the TSIG time fudge. - - *original_id*, an ``int``, the TSIG original id. If ``None``, - the message's id is used. - - *tsig_error*, an ``int``, the TSIG error code. - - *other_data*, a ``binary``, the TSIG other data. - - *algorithm*, a ``dns.name.Name``, the TSIG algorithm to use. - """ - - self.keyring = keyring - if keyname is None: - self.keyname = list(self.keyring.keys())[0] - else: - if isinstance(keyname, string_types): - keyname = dns.name.from_text(keyname) - self.keyname = keyname - self.keyalgorithm = algorithm - self.fudge = fudge - if original_id is None: - self.original_id = self.id - else: - self.original_id = original_id - self.tsig_error = tsig_error - self.other_data = other_data - - def use_edns(self, edns=0, ednsflags=0, payload=1280, request_payload=None, - options=None): - """Configure EDNS behavior. - - *edns*, an ``int``, is the EDNS level to use. Specifying - ``None``, ``False``, or ``-1`` means "do not use EDNS", and in this case - the other parameters are ignored. Specifying ``True`` is - equivalent to specifying 0, i.e. "use EDNS0". - - *ednsflags*, an ``int``, the EDNS flag values. - - *payload*, an ``int``, is the EDNS sender's payload field, which is the - maximum size of UDP datagram the sender can handle. I.e. how big - a response to this message can be. - - *request_payload*, an ``int``, is the EDNS payload size to use when - sending this message. If not specified, defaults to the value of - *payload*. - - *options*, a list of ``dns.edns.Option`` objects or ``None``, the EDNS - options. - """ - - if edns is None or edns is False: - edns = -1 - if edns is True: - edns = 0 - if request_payload is None: - request_payload = payload - if edns < 0: - ednsflags = 0 - payload = 0 - request_payload = 0 - options = [] - else: - # make sure the EDNS version in ednsflags agrees with edns - ednsflags &= long(0xFF00FFFF) - ednsflags |= (edns << 16) - if options is None: - options = [] - self.edns = edns - self.ednsflags = ednsflags - self.payload = payload - self.options = options - self.request_payload = request_payload - - def want_dnssec(self, wanted=True): - """Enable or disable 'DNSSEC desired' flag in requests. - - *wanted*, a ``bool``. If ``True``, then DNSSEC data is - desired in the response, EDNS is enabled if required, and then - the DO bit is set. If ``False``, the DO bit is cleared if - EDNS is enabled. - """ - - if wanted: - if self.edns < 0: - self.use_edns() - self.ednsflags |= dns.flags.DO - elif self.edns >= 0: - self.ednsflags &= ~dns.flags.DO - - def rcode(self): - """Return the rcode. - - Returns an ``int``. - """ - return dns.rcode.from_flags(self.flags, self.ednsflags) - - def set_rcode(self, rcode): - """Set the rcode. - - *rcode*, an ``int``, is the rcode to set. - """ - (value, evalue) = dns.rcode.to_flags(rcode) - self.flags &= 0xFFF0 - self.flags |= value - self.ednsflags &= long(0x00FFFFFF) - self.ednsflags |= evalue - if self.ednsflags != 0 and self.edns < 0: - self.edns = 0 - - def opcode(self): - """Return the opcode. - - Returns an ``int``. - """ - return dns.opcode.from_flags(self.flags) - - def set_opcode(self, opcode): - """Set the opcode. - - *opcode*, an ``int``, is the opcode to set. - """ - self.flags &= 0x87FF - self.flags |= dns.opcode.to_flags(opcode) - - -class _WireReader(object): - - """Wire format reader. - - wire: a binary, is the wire-format message. - message: The message object being built - current: When building a message object from wire format, this - variable contains the offset from the beginning of wire of the next octet - to be read. - updating: Is the message a dynamic update? - one_rr_per_rrset: Put each RR into its own RRset? - ignore_trailing: Ignore trailing junk at end of request? - zone_rdclass: The class of the zone in messages which are - DNS dynamic updates. - """ - - def __init__(self, wire, message, question_only=False, - one_rr_per_rrset=False, ignore_trailing=False): - self.wire = dns.wiredata.maybe_wrap(wire) - self.message = message - self.current = 0 - self.updating = False - self.zone_rdclass = dns.rdataclass.IN - self.question_only = question_only - self.one_rr_per_rrset = one_rr_per_rrset - self.ignore_trailing = ignore_trailing - - def _get_question(self, qcount): - """Read the next *qcount* records from the wire data and add them to - the question section. - """ - - if self.updating and qcount > 1: - raise dns.exception.FormError - - for i in xrange(0, qcount): - (qname, used) = dns.name.from_wire(self.wire, self.current) - if self.message.origin is not None: - qname = qname.relativize(self.message.origin) - self.current = self.current + used - (rdtype, rdclass) = \ - struct.unpack('!HH', - self.wire[self.current:self.current + 4]) - self.current = self.current + 4 - self.message.find_rrset(self.message.question, qname, - rdclass, rdtype, create=True, - force_unique=True) - if self.updating: - self.zone_rdclass = rdclass - - def _get_section(self, section, count): - """Read the next I{count} records from the wire data and add them to - the specified section. - - section: the section of the message to which to add records - count: the number of records to read - """ - - if self.updating or self.one_rr_per_rrset: - force_unique = True - else: - force_unique = False - seen_opt = False - for i in xrange(0, count): - rr_start = self.current - (name, used) = dns.name.from_wire(self.wire, self.current) - absolute_name = name - if self.message.origin is not None: - name = name.relativize(self.message.origin) - self.current = self.current + used - (rdtype, rdclass, ttl, rdlen) = \ - struct.unpack('!HHIH', - self.wire[self.current:self.current + 10]) - self.current = self.current + 10 - if rdtype == dns.rdatatype.OPT: - if section is not self.message.additional or seen_opt: - raise BadEDNS - self.message.payload = rdclass - self.message.ednsflags = ttl - self.message.edns = (ttl & 0xff0000) >> 16 - self.message.options = [] - current = self.current - optslen = rdlen - while optslen > 0: - (otype, olen) = \ - struct.unpack('!HH', - self.wire[current:current + 4]) - current = current + 4 - opt = dns.edns.option_from_wire( - otype, self.wire, current, olen) - self.message.options.append(opt) - current = current + olen - optslen = optslen - 4 - olen - seen_opt = True - elif rdtype == dns.rdatatype.TSIG: - if not (section is self.message.additional and - i == (count - 1)): - raise BadTSIG - if self.message.keyring is None: - raise UnknownTSIGKey('got signed message without keyring') - secret = self.message.keyring.get(absolute_name) - if secret is None: - raise UnknownTSIGKey("key '%s' unknown" % name) - self.message.keyname = absolute_name - (self.message.keyalgorithm, self.message.mac) = \ - dns.tsig.get_algorithm_and_mac(self.wire, self.current, - rdlen) - self.message.tsig_ctx = \ - dns.tsig.validate(self.wire, - absolute_name, - secret, - int(time.time()), - self.message.request_mac, - rr_start, - self.current, - rdlen, - self.message.tsig_ctx, - self.message.multi, - self.message.first) - self.message.had_tsig = True - else: - if ttl < 0: - ttl = 0 - if self.updating and \ - (rdclass == dns.rdataclass.ANY or - rdclass == dns.rdataclass.NONE): - deleting = rdclass - rdclass = self.zone_rdclass - else: - deleting = None - if deleting == dns.rdataclass.ANY or \ - (deleting == dns.rdataclass.NONE and - section is self.message.answer): - covers = dns.rdatatype.NONE - rd = None - else: - rd = dns.rdata.from_wire(rdclass, rdtype, self.wire, - self.current, rdlen, - self.message.origin) - covers = rd.covers() - if self.message.xfr and rdtype == dns.rdatatype.SOA: - force_unique = True - rrset = self.message.find_rrset(section, name, - rdclass, rdtype, covers, - deleting, True, force_unique) - if rd is not None: - rrset.add(rd, ttl) - self.current = self.current + rdlen - - def read(self): - """Read a wire format DNS message and build a dns.message.Message - object.""" - - l = len(self.wire) - if l < 12: - raise ShortHeader - (self.message.id, self.message.flags, qcount, ancount, - aucount, adcount) = struct.unpack('!HHHHHH', self.wire[:12]) - self.current = 12 - if dns.opcode.is_update(self.message.flags): - self.updating = True - self._get_question(qcount) - if self.question_only: - return - self._get_section(self.message.answer, ancount) - self._get_section(self.message.authority, aucount) - self._get_section(self.message.additional, adcount) - if not self.ignore_trailing and self.current != l: - raise TrailingJunk - if self.message.multi and self.message.tsig_ctx and \ - not self.message.had_tsig: - self.message.tsig_ctx.update(self.wire) - - -def from_wire(wire, keyring=None, request_mac=b'', xfr=False, origin=None, - tsig_ctx=None, multi=False, first=True, - question_only=False, one_rr_per_rrset=False, - ignore_trailing=False): - """Convert a DNS wire format message into a message - object. - - *keyring*, a ``dict``, the keyring to use if the message is signed. - - *request_mac*, a ``binary``. If the message is a response to a - TSIG-signed request, *request_mac* should be set to the MAC of - that request. - - *xfr*, a ``bool``, should be set to ``True`` if this message is part of - a zone transfer. - - *origin*, a ``dns.name.Name`` or ``None``. If the message is part - of a zone transfer, *origin* should be the origin name of the - zone. - - *tsig_ctx*, a ``hmac.HMAC`` objext, the ongoing TSIG context, used - when validating zone transfers. - - *multi*, a ``bool``, should be set to ``True`` if this message - part of a multiple message sequence. - - *first*, a ``bool``, should be set to ``True`` if this message is - stand-alone, or the first message in a multi-message sequence. - - *question_only*, a ``bool``. If ``True``, read only up to - the end of the question section. - - *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its - own RRset. - - *ignore_trailing*, a ``bool``. If ``True``, ignore trailing - junk at end of the message. - - Raises ``dns.message.ShortHeader`` if the message is less than 12 octets - long. - - Raises ``dns.messaage.TrailingJunk`` if there were octets in the message - past the end of the proper DNS message, and *ignore_trailing* is ``False``. - - Raises ``dns.message.BadEDNS`` if an OPT record was in the - wrong section, or occurred more than once. - - Raises ``dns.message.BadTSIG`` if a TSIG record was not the last - record of the additional data section. - - Returns a ``dns.message.Message``. - """ - - m = Message(id=0) - m.keyring = keyring - m.request_mac = request_mac - m.xfr = xfr - m.origin = origin - m.tsig_ctx = tsig_ctx - m.multi = multi - m.first = first - - reader = _WireReader(wire, m, question_only, one_rr_per_rrset, - ignore_trailing) - reader.read() - - return m - - -class _TextReader(object): - - """Text format reader. - - tok: the tokenizer. - message: The message object being built. - updating: Is the message a dynamic update? - zone_rdclass: The class of the zone in messages which are - DNS dynamic updates. - last_name: The most recently read name when building a message object. - """ - - def __init__(self, text, message): - self.message = message - self.tok = dns.tokenizer.Tokenizer(text) - self.last_name = None - self.zone_rdclass = dns.rdataclass.IN - self.updating = False - - def _header_line(self, section): - """Process one line from the text format header section.""" - - token = self.tok.get() - what = token.value - if what == 'id': - self.message.id = self.tok.get_int() - elif what == 'flags': - while True: - token = self.tok.get() - if not token.is_identifier(): - self.tok.unget(token) - break - self.message.flags = self.message.flags | \ - dns.flags.from_text(token.value) - if dns.opcode.is_update(self.message.flags): - self.updating = True - elif what == 'edns': - self.message.edns = self.tok.get_int() - self.message.ednsflags = self.message.ednsflags | \ - (self.message.edns << 16) - elif what == 'eflags': - if self.message.edns < 0: - self.message.edns = 0 - while True: - token = self.tok.get() - if not token.is_identifier(): - self.tok.unget(token) - break - self.message.ednsflags = self.message.ednsflags | \ - dns.flags.edns_from_text(token.value) - elif what == 'payload': - self.message.payload = self.tok.get_int() - if self.message.edns < 0: - self.message.edns = 0 - elif what == 'opcode': - text = self.tok.get_string() - self.message.flags = self.message.flags | \ - dns.opcode.to_flags(dns.opcode.from_text(text)) - elif what == 'rcode': - text = self.tok.get_string() - self.message.set_rcode(dns.rcode.from_text(text)) - else: - raise UnknownHeaderField - self.tok.get_eol() - - def _question_line(self, section): - """Process one line from the text format question section.""" - - token = self.tok.get(want_leading=True) - if not token.is_whitespace(): - self.last_name = dns.name.from_text(token.value, None) - name = self.last_name - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - # Class - try: - rdclass = dns.rdataclass.from_text(token.value) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except dns.exception.SyntaxError: - raise dns.exception.SyntaxError - except Exception: - rdclass = dns.rdataclass.IN - # Type - rdtype = dns.rdatatype.from_text(token.value) - self.message.find_rrset(self.message.question, name, - rdclass, rdtype, create=True, - force_unique=True) - if self.updating: - self.zone_rdclass = rdclass - self.tok.get_eol() - - def _rr_line(self, section): - """Process one line from the text format answer, authority, or - additional data sections. - """ - - deleting = None - # Name - token = self.tok.get(want_leading=True) - if not token.is_whitespace(): - self.last_name = dns.name.from_text(token.value, None) - name = self.last_name - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - # TTL - try: - ttl = int(token.value, 0) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except dns.exception.SyntaxError: - raise dns.exception.SyntaxError - except Exception: - ttl = 0 - # Class - try: - rdclass = dns.rdataclass.from_text(token.value) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - if rdclass == dns.rdataclass.ANY or rdclass == dns.rdataclass.NONE: - deleting = rdclass - rdclass = self.zone_rdclass - except dns.exception.SyntaxError: - raise dns.exception.SyntaxError - except Exception: - rdclass = dns.rdataclass.IN - # Type - rdtype = dns.rdatatype.from_text(token.value) - token = self.tok.get() - if not token.is_eol_or_eof(): - self.tok.unget(token) - rd = dns.rdata.from_text(rdclass, rdtype, self.tok, None) - covers = rd.covers() - else: - rd = None - covers = dns.rdatatype.NONE - rrset = self.message.find_rrset(section, name, - rdclass, rdtype, covers, - deleting, True, self.updating) - if rd is not None: - rrset.add(rd, ttl) - - def read(self): - """Read a text format DNS message and build a dns.message.Message - object.""" - - line_method = self._header_line - section = None - while 1: - token = self.tok.get(True, True) - if token.is_eol_or_eof(): - break - if token.is_comment(): - u = token.value.upper() - if u == 'HEADER': - line_method = self._header_line - elif u == 'QUESTION' or u == 'ZONE': - line_method = self._question_line - section = self.message.question - elif u == 'ANSWER' or u == 'PREREQ': - line_method = self._rr_line - section = self.message.answer - elif u == 'AUTHORITY' or u == 'UPDATE': - line_method = self._rr_line - section = self.message.authority - elif u == 'ADDITIONAL': - line_method = self._rr_line - section = self.message.additional - self.tok.get_eol() - continue - self.tok.unget(token) - line_method(section) - - -def from_text(text): - """Convert the text format message into a message object. - - *text*, a ``text``, the text format message. - - Raises ``dns.message.UnknownHeaderField`` if a header is unknown. - - Raises ``dns.exception.SyntaxError`` if the text is badly formed. - - Returns a ``dns.message.Message object`` - """ - - # 'text' can also be a file, but we don't publish that fact - # since it's an implementation detail. The official file - # interface is from_file(). - - m = Message() - - reader = _TextReader(text, m) - reader.read() - - return m - - -def from_file(f): - """Read the next text format message from the specified file. - - *f*, a ``file`` or ``text``. If *f* is text, it is treated as the - pathname of a file to open. - - Raises ``dns.message.UnknownHeaderField`` if a header is unknown. - - Raises ``dns.exception.SyntaxError`` if the text is badly formed. - - Returns a ``dns.message.Message object`` - """ - - str_type = string_types - opts = 'rU' - - if isinstance(f, str_type): - f = open(f, opts) - want_close = True - else: - want_close = False - - try: - m = from_text(f) - finally: - if want_close: - f.close() - return m - - -def make_query(qname, rdtype, rdclass=dns.rdataclass.IN, use_edns=None, - want_dnssec=False, ednsflags=None, payload=None, - request_payload=None, options=None): - """Make a query message. - - The query name, type, and class may all be specified either - as objects of the appropriate type, or as strings. - - The query will have a randomly chosen query id, and its DNS flags - will be set to dns.flags.RD. - - qname, a ``dns.name.Name`` or ``text``, the query name. - - *rdtype*, an ``int`` or ``text``, the desired rdata type. - - *rdclass*, an ``int`` or ``text``, the desired rdata class; the default - is class IN. - - *use_edns*, an ``int``, ``bool`` or ``None``. The EDNS level to use; the - default is None (no EDNS). - See the description of dns.message.Message.use_edns() for the possible - values for use_edns and their meanings. - - *want_dnssec*, a ``bool``. If ``True``, DNSSEC data is desired. - - *ednsflags*, an ``int``, the EDNS flag values. - - *payload*, an ``int``, is the EDNS sender's payload field, which is the - maximum size of UDP datagram the sender can handle. I.e. how big - a response to this message can be. - - *request_payload*, an ``int``, is the EDNS payload size to use when - sending this message. If not specified, defaults to the value of - *payload*. - - *options*, a list of ``dns.edns.Option`` objects or ``None``, the EDNS - options. - - Returns a ``dns.message.Message`` - """ - - if isinstance(qname, string_types): - qname = dns.name.from_text(qname) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if isinstance(rdclass, string_types): - rdclass = dns.rdataclass.from_text(rdclass) - m = Message() - m.flags |= dns.flags.RD - m.find_rrset(m.question, qname, rdclass, rdtype, create=True, - force_unique=True) - # only pass keywords on to use_edns if they have been set to a - # non-None value. Setting a field will turn EDNS on if it hasn't - # been configured. - kwargs = {} - if ednsflags is not None: - kwargs['ednsflags'] = ednsflags - if use_edns is None: - use_edns = 0 - if payload is not None: - kwargs['payload'] = payload - if use_edns is None: - use_edns = 0 - if request_payload is not None: - kwargs['request_payload'] = request_payload - if use_edns is None: - use_edns = 0 - if options is not None: - kwargs['options'] = options - if use_edns is None: - use_edns = 0 - kwargs['edns'] = use_edns - m.use_edns(**kwargs) - m.want_dnssec(want_dnssec) - return m - - -def make_response(query, recursion_available=False, our_payload=8192, - fudge=300): - """Make a message which is a response for the specified query. - The message returned is really a response skeleton; it has all - of the infrastructure required of a response, but none of the - content. - - The response's question section is a shallow copy of the query's - question section, so the query's question RRsets should not be - changed. - - *query*, a ``dns.message.Message``, the query to respond to. - - *recursion_available*, a ``bool``, should RA be set in the response? - - *our_payload*, an ``int``, the payload size to advertise in EDNS - responses. - - *fudge*, an ``int``, the TSIG time fudge. - - Returns a ``dns.message.Message`` object. - """ - - if query.flags & dns.flags.QR: - raise dns.exception.FormError('specified query message is not a query') - response = dns.message.Message(query.id) - response.flags = dns.flags.QR | (query.flags & dns.flags.RD) - if recursion_available: - response.flags |= dns.flags.RA - response.set_opcode(query.opcode()) - response.question = list(query.question) - if query.edns >= 0: - response.use_edns(0, 0, our_payload, query.payload) - if query.had_tsig: - response.use_tsig(query.keyring, query.keyname, fudge, None, 0, b'', - query.keyalgorithm) - response.request_mac = query.mac - return response diff --git a/lib/dns/message.pyi b/lib/dns/message.pyi deleted file mode 100644 index ed99b3c0..00000000 --- a/lib/dns/message.pyi +++ /dev/null @@ -1,55 +0,0 @@ -from typing import Optional, Dict, List, Tuple, Union -from . import name, rrset, tsig, rdatatype, entropy, edns, rdataclass -import hmac - -class Message: - def to_wire(self, origin : Optional[name.Name]=None, max_size=0, **kw) -> bytes: - ... - def find_rrset(self, section : List[rrset.RRset], name : name.Name, rdclass : int, rdtype : int, - covers=rdatatype.NONE, deleting : Optional[int]=None, create=False, - force_unique=False) -> rrset.RRset: - ... - def __init__(self, id : Optional[int] =None) -> None: - self.id : int - self.flags = 0 - self.question : List[rrset.RRset] = [] - self.answer : List[rrset.RRset] = [] - self.authority : List[rrset.RRset] = [] - self.additional : List[rrset.RRset] = [] - self.edns = -1 - self.ednsflags = 0 - self.payload = 0 - self.options : List[edns.Option] = [] - self.request_payload = 0 - self.keyring = None - self.keyname = None - self.keyalgorithm = tsig.default_algorithm - self.request_mac = b'' - self.other_data = b'' - self.tsig_error = 0 - self.fudge = 300 - self.original_id = self.id - self.mac = b'' - self.xfr = False - self.origin = None - self.tsig_ctx = None - self.had_tsig = False - self.multi = False - self.first = True - self.index : Dict[Tuple[rrset.RRset, name.Name, int, int, Union[int,str], int], rrset.RRset] = {} -def from_text(a : str) -> Message: - ... - -def from_wire(wire, keyring : Optional[Dict[name.Name,bytes]] = None, request_mac = b'', xfr=False, origin=None, - tsig_ctx : Optional[hmac.HMAC] = None, multi=False, first=True, - question_only=False, one_rr_per_rrset=False, - ignore_trailing=False) -> Message: - ... -def make_response(query : Message, recursion_available=False, our_payload=8192, - fudge=300) -> Message: - ... - -def make_query(qname : Union[name.Name,str], rdtype : Union[str,int], rdclass : Union[int,str] =rdataclass.IN, use_edns : Optional[bool] = None, - want_dnssec=False, ednsflags : Optional[int] = None, payload : Optional[int] = None, - request_payload : Optional[int] = None, options : Optional[List[edns.Option]] = None) -> Message: - ... diff --git a/lib/dns/name.py b/lib/dns/name.py deleted file mode 100644 index 0bcfd834..00000000 --- a/lib/dns/name.py +++ /dev/null @@ -1,994 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Names. -""" - -from io import BytesIO -import struct -import sys -import copy -import encodings.idna -try: - import idna - have_idna_2008 = True -except ImportError: - have_idna_2008 = False - -import dns.exception -import dns.wiredata - -from ._compat import long, binary_type, text_type, unichr, maybe_decode - -try: - maxint = sys.maxint # pylint: disable=sys-max-int -except AttributeError: - maxint = (1 << (8 * struct.calcsize("P"))) // 2 - 1 - - -# fullcompare() result values - -#: The compared names have no relationship to each other. -NAMERELN_NONE = 0 -#: the first name is a superdomain of the second. -NAMERELN_SUPERDOMAIN = 1 -#: The first name is a subdomain of the second. -NAMERELN_SUBDOMAIN = 2 -#: The compared names are equal. -NAMERELN_EQUAL = 3 -#: The compared names have a common ancestor. -NAMERELN_COMMONANCESTOR = 4 - - -class EmptyLabel(dns.exception.SyntaxError): - """A DNS label is empty.""" - - -class BadEscape(dns.exception.SyntaxError): - """An escaped code in a text format of DNS name is invalid.""" - - -class BadPointer(dns.exception.FormError): - """A DNS compression pointer points forward instead of backward.""" - - -class BadLabelType(dns.exception.FormError): - """The label type in DNS name wire format is unknown.""" - - -class NeedAbsoluteNameOrOrigin(dns.exception.DNSException): - """An attempt was made to convert a non-absolute name to - wire when there was also a non-absolute (or missing) origin.""" - - -class NameTooLong(dns.exception.FormError): - """A DNS name is > 255 octets long.""" - - -class LabelTooLong(dns.exception.SyntaxError): - """A DNS label is > 63 octets long.""" - - -class AbsoluteConcatenation(dns.exception.DNSException): - """An attempt was made to append anything other than the - empty name to an absolute DNS name.""" - - -class NoParent(dns.exception.DNSException): - """An attempt was made to get the parent of the root name - or the empty name.""" - -class NoIDNA2008(dns.exception.DNSException): - """IDNA 2008 processing was requested but the idna module is not - available.""" - - -class IDNAException(dns.exception.DNSException): - """IDNA processing raised an exception.""" - - supp_kwargs = {'idna_exception'} - fmt = "IDNA processing exception: {idna_exception}" - - -class IDNACodec(object): - """Abstract base class for IDNA encoder/decoders.""" - - def __init__(self): - pass - - def encode(self, label): - raise NotImplementedError - - def decode(self, label): - # We do not apply any IDNA policy on decode; we just - downcased = label.lower() - if downcased.startswith(b'xn--'): - try: - label = downcased[4:].decode('punycode') - except Exception as e: - raise IDNAException(idna_exception=e) - else: - label = maybe_decode(label) - return _escapify(label, True) - - -class IDNA2003Codec(IDNACodec): - """IDNA 2003 encoder/decoder.""" - - def __init__(self, strict_decode=False): - """Initialize the IDNA 2003 encoder/decoder. - - *strict_decode* is a ``bool``. If `True`, then IDNA2003 checking - is done when decoding. This can cause failures if the name - was encoded with IDNA2008. The default is `False`. - """ - - super(IDNA2003Codec, self).__init__() - self.strict_decode = strict_decode - - def encode(self, label): - """Encode *label*.""" - - if label == '': - return b'' - try: - return encodings.idna.ToASCII(label) - except UnicodeError: - raise LabelTooLong - - def decode(self, label): - """Decode *label*.""" - if not self.strict_decode: - return super(IDNA2003Codec, self).decode(label) - if label == b'': - return u'' - try: - return _escapify(encodings.idna.ToUnicode(label), True) - except Exception as e: - raise IDNAException(idna_exception=e) - - -class IDNA2008Codec(IDNACodec): - """IDNA 2008 encoder/decoder. - - *uts_46* is a ``bool``. If True, apply Unicode IDNA - compatibility processing as described in Unicode Technical - Standard #46 (http://unicode.org/reports/tr46/). - If False, do not apply the mapping. The default is False. - - *transitional* is a ``bool``: If True, use the - "transitional" mode described in Unicode Technical Standard - #46. The default is False. - - *allow_pure_ascii* is a ``bool``. If True, then a label which - consists of only ASCII characters is allowed. This is less - strict than regular IDNA 2008, but is also necessary for mixed - names, e.g. a name with starting with "_sip._tcp." and ending - in an IDN suffix which would otherwise be disallowed. The - default is False. - - *strict_decode* is a ``bool``: If True, then IDNA2008 checking - is done when decoding. This can cause failures if the name - was encoded with IDNA2003. The default is False. - """ - - def __init__(self, uts_46=False, transitional=False, - allow_pure_ascii=False, strict_decode=False): - """Initialize the IDNA 2008 encoder/decoder.""" - super(IDNA2008Codec, self).__init__() - self.uts_46 = uts_46 - self.transitional = transitional - self.allow_pure_ascii = allow_pure_ascii - self.strict_decode = strict_decode - - def is_all_ascii(self, label): - for c in label: - if ord(c) > 0x7f: - return False - return True - - def encode(self, label): - if label == '': - return b'' - if self.allow_pure_ascii and self.is_all_ascii(label): - return label.encode('ascii') - if not have_idna_2008: - raise NoIDNA2008 - try: - if self.uts_46: - label = idna.uts46_remap(label, False, self.transitional) - return idna.alabel(label) - except idna.IDNAError as e: - raise IDNAException(idna_exception=e) - - def decode(self, label): - if not self.strict_decode: - return super(IDNA2008Codec, self).decode(label) - if label == b'': - return u'' - if not have_idna_2008: - raise NoIDNA2008 - try: - if self.uts_46: - label = idna.uts46_remap(label, False, False) - return _escapify(idna.ulabel(label), True) - except idna.IDNAError as e: - raise IDNAException(idna_exception=e) - -_escaped = bytearray(b'"().;\\@$') - -IDNA_2003_Practical = IDNA2003Codec(False) -IDNA_2003_Strict = IDNA2003Codec(True) -IDNA_2003 = IDNA_2003_Practical -IDNA_2008_Practical = IDNA2008Codec(True, False, True, False) -IDNA_2008_UTS_46 = IDNA2008Codec(True, False, False, False) -IDNA_2008_Strict = IDNA2008Codec(False, False, False, True) -IDNA_2008_Transitional = IDNA2008Codec(True, True, False, False) -IDNA_2008 = IDNA_2008_Practical - -def _escapify(label, unicode_mode=False): - """Escape the characters in label which need it. - @param unicode_mode: escapify only special and whitespace (<= 0x20) - characters - @returns: the escaped string - @rtype: string""" - if not unicode_mode: - text = '' - if isinstance(label, text_type): - label = label.encode() - for c in bytearray(label): - if c in _escaped: - text += '\\' + chr(c) - elif c > 0x20 and c < 0x7F: - text += chr(c) - else: - text += '\\%03d' % c - return text.encode() - - text = u'' - if isinstance(label, binary_type): - label = label.decode() - for c in label: - if c > u'\x20' and c < u'\x7f': - text += c - else: - if c >= u'\x7f': - text += c - else: - text += u'\\%03d' % ord(c) - return text - -def _validate_labels(labels): - """Check for empty labels in the middle of a label sequence, - labels that are too long, and for too many labels. - - Raises ``dns.name.NameTooLong`` if the name as a whole is too long. - - Raises ``dns.name.EmptyLabel`` if a label is empty (i.e. the root - label) and appears in a position other than the end of the label - sequence - - """ - - l = len(labels) - total = 0 - i = -1 - j = 0 - for label in labels: - ll = len(label) - total += ll + 1 - if ll > 63: - raise LabelTooLong - if i < 0 and label == b'': - i = j - j += 1 - if total > 255: - raise NameTooLong - if i >= 0 and i != l - 1: - raise EmptyLabel - - -def _maybe_convert_to_binary(label): - """If label is ``text``, convert it to ``binary``. If it is already - ``binary`` just return it. - - """ - - if isinstance(label, binary_type): - return label - if isinstance(label, text_type): - return label.encode() - raise ValueError - - -class Name(object): - - """A DNS name. - - The dns.name.Name class represents a DNS name as a tuple of - labels. Each label is a `binary` in DNS wire format. Instances - of the class are immutable. - """ - - __slots__ = ['labels'] - - def __init__(self, labels): - """*labels* is any iterable whose values are ``text`` or ``binary``. - """ - - labels = [_maybe_convert_to_binary(x) for x in labels] - super(Name, self).__setattr__('labels', tuple(labels)) - _validate_labels(self.labels) - - def __setattr__(self, name, value): - # Names are immutable - raise TypeError("object doesn't support attribute assignment") - - def __copy__(self): - return Name(self.labels) - - def __deepcopy__(self, memo): - return Name(copy.deepcopy(self.labels, memo)) - - def __getstate__(self): - # Names can be pickled - return {'labels': self.labels} - - def __setstate__(self, state): - super(Name, self).__setattr__('labels', state['labels']) - _validate_labels(self.labels) - - def is_absolute(self): - """Is the most significant label of this name the root label? - - Returns a ``bool``. - """ - - return len(self.labels) > 0 and self.labels[-1] == b'' - - def is_wild(self): - """Is this name wild? (I.e. Is the least significant label '*'?) - - Returns a ``bool``. - """ - - return len(self.labels) > 0 and self.labels[0] == b'*' - - def __hash__(self): - """Return a case-insensitive hash of the name. - - Returns an ``int``. - """ - - h = long(0) - for label in self.labels: - for c in bytearray(label.lower()): - h += (h << 3) + c - return int(h % maxint) - - def fullcompare(self, other): - """Compare two names, returning a 3-tuple - ``(relation, order, nlabels)``. - - *relation* describes the relation ship between the names, - and is one of: ``dns.name.NAMERELN_NONE``, - ``dns.name.NAMERELN_SUPERDOMAIN``, ``dns.name.NAMERELN_SUBDOMAIN``, - ``dns.name.NAMERELN_EQUAL``, or ``dns.name.NAMERELN_COMMONANCESTOR``. - - *order* is < 0 if *self* < *other*, > 0 if *self* > *other*, and == - 0 if *self* == *other*. A relative name is always less than an - absolute name. If both names have the same relativity, then - the DNSSEC order relation is used to order them. - - *nlabels* is the number of significant labels that the two names - have in common. - - Here are some examples. Names ending in "." are absolute names, - those not ending in "." are relative names. - - ============= ============= =========== ===== ======= - self other relation order nlabels - ============= ============= =========== ===== ======= - www.example. www.example. equal 0 3 - www.example. example. subdomain > 0 2 - example. www.example. superdomain < 0 2 - example1.com. example2.com. common anc. < 0 2 - example1 example2. none < 0 0 - example1. example2 none > 0 0 - ============= ============= =========== ===== ======= - """ - - sabs = self.is_absolute() - oabs = other.is_absolute() - if sabs != oabs: - if sabs: - return (NAMERELN_NONE, 1, 0) - else: - return (NAMERELN_NONE, -1, 0) - l1 = len(self.labels) - l2 = len(other.labels) - ldiff = l1 - l2 - if ldiff < 0: - l = l1 - else: - l = l2 - - order = 0 - nlabels = 0 - namereln = NAMERELN_NONE - while l > 0: - l -= 1 - l1 -= 1 - l2 -= 1 - label1 = self.labels[l1].lower() - label2 = other.labels[l2].lower() - if label1 < label2: - order = -1 - if nlabels > 0: - namereln = NAMERELN_COMMONANCESTOR - return (namereln, order, nlabels) - elif label1 > label2: - order = 1 - if nlabels > 0: - namereln = NAMERELN_COMMONANCESTOR - return (namereln, order, nlabels) - nlabels += 1 - order = ldiff - if ldiff < 0: - namereln = NAMERELN_SUPERDOMAIN - elif ldiff > 0: - namereln = NAMERELN_SUBDOMAIN - else: - namereln = NAMERELN_EQUAL - return (namereln, order, nlabels) - - def is_subdomain(self, other): - """Is self a subdomain of other? - - Note that the notion of subdomain includes equality, e.g. - "dnpython.org" is a subdomain of itself. - - Returns a ``bool``. - """ - - (nr, o, nl) = self.fullcompare(other) - if nr == NAMERELN_SUBDOMAIN or nr == NAMERELN_EQUAL: - return True - return False - - def is_superdomain(self, other): - """Is self a superdomain of other? - - Note that the notion of superdomain includes equality, e.g. - "dnpython.org" is a superdomain of itself. - - Returns a ``bool``. - """ - - (nr, o, nl) = self.fullcompare(other) - if nr == NAMERELN_SUPERDOMAIN or nr == NAMERELN_EQUAL: - return True - return False - - def canonicalize(self): - """Return a name which is equal to the current name, but is in - DNSSEC canonical form. - """ - - return Name([x.lower() for x in self.labels]) - - def __eq__(self, other): - if isinstance(other, Name): - return self.fullcompare(other)[1] == 0 - else: - return False - - def __ne__(self, other): - if isinstance(other, Name): - return self.fullcompare(other)[1] != 0 - else: - return True - - def __lt__(self, other): - if isinstance(other, Name): - return self.fullcompare(other)[1] < 0 - else: - return NotImplemented - - def __le__(self, other): - if isinstance(other, Name): - return self.fullcompare(other)[1] <= 0 - else: - return NotImplemented - - def __ge__(self, other): - if isinstance(other, Name): - return self.fullcompare(other)[1] >= 0 - else: - return NotImplemented - - def __gt__(self, other): - if isinstance(other, Name): - return self.fullcompare(other)[1] > 0 - else: - return NotImplemented - - def __repr__(self): - return '<DNS name ' + self.__str__() + '>' - - def __str__(self): - return self.to_text(False) - - def to_text(self, omit_final_dot=False): - """Convert name to DNS text format. - - *omit_final_dot* is a ``bool``. If True, don't emit the final - dot (denoting the root label) for absolute names. The default - is False. - - Returns a ``text``. - """ - - if len(self.labels) == 0: - return maybe_decode(b'@') - if len(self.labels) == 1 and self.labels[0] == b'': - return maybe_decode(b'.') - if omit_final_dot and self.is_absolute(): - l = self.labels[:-1] - else: - l = self.labels - s = b'.'.join(map(_escapify, l)) - return maybe_decode(s) - - def to_unicode(self, omit_final_dot=False, idna_codec=None): - """Convert name to Unicode text format. - - IDN ACE labels are converted to Unicode. - - *omit_final_dot* is a ``bool``. If True, don't emit the final - dot (denoting the root label) for absolute names. The default - is False. - *idna_codec* specifies the IDNA encoder/decoder. If None, the - dns.name.IDNA_2003_Practical encoder/decoder is used. - The IDNA_2003_Practical decoder does - not impose any policy, it just decodes punycode, so if you - don't want checking for compliance, you can use this decoder - for IDNA2008 as well. - - Returns a ``text``. - """ - - if len(self.labels) == 0: - return u'@' - if len(self.labels) == 1 and self.labels[0] == b'': - return u'.' - if omit_final_dot and self.is_absolute(): - l = self.labels[:-1] - else: - l = self.labels - if idna_codec is None: - idna_codec = IDNA_2003_Practical - return u'.'.join([idna_codec.decode(x) for x in l]) - - def to_digestable(self, origin=None): - """Convert name to a format suitable for digesting in hashes. - - The name is canonicalized and converted to uncompressed wire - format. All names in wire format are absolute. If the name - is a relative name, then an origin must be supplied. - - *origin* is a ``dns.name.Name`` or ``None``. If the name is - relative and origin is not ``None``, then origin will be appended - to the name. - - Raises ``dns.name.NeedAbsoluteNameOrOrigin`` if the name is - relative and no origin was provided. - - Returns a ``binary``. - """ - - if not self.is_absolute(): - if origin is None or not origin.is_absolute(): - raise NeedAbsoluteNameOrOrigin - labels = list(self.labels) - labels.extend(list(origin.labels)) - else: - labels = self.labels - dlabels = [struct.pack('!B%ds' % len(x), len(x), x.lower()) - for x in labels] - return b''.join(dlabels) - - def to_wire(self, file=None, compress=None, origin=None): - """Convert name to wire format, possibly compressing it. - - *file* is the file where the name is emitted (typically a - BytesIO file). If ``None`` (the default), a ``binary`` - containing the wire name will be returned. - - *compress*, a ``dict``, is the compression table to use. If - ``None`` (the default), names will not be compressed. - - *origin* is a ``dns.name.Name`` or ``None``. If the name is - relative and origin is not ``None``, then *origin* will be appended - to it. - - Raises ``dns.name.NeedAbsoluteNameOrOrigin`` if the name is - relative and no origin was provided. - - Returns a ``binary`` or ``None``. - """ - - if file is None: - file = BytesIO() - want_return = True - else: - want_return = False - - if not self.is_absolute(): - if origin is None or not origin.is_absolute(): - raise NeedAbsoluteNameOrOrigin - labels = list(self.labels) - labels.extend(list(origin.labels)) - else: - labels = self.labels - i = 0 - for label in labels: - n = Name(labels[i:]) - i += 1 - if compress is not None: - pos = compress.get(n) - else: - pos = None - if pos is not None: - value = 0xc000 + pos - s = struct.pack('!H', value) - file.write(s) - break - else: - if compress is not None and len(n) > 1: - pos = file.tell() - if pos <= 0x3fff: - compress[n] = pos - l = len(label) - file.write(struct.pack('!B', l)) - if l > 0: - file.write(label) - if want_return: - return file.getvalue() - - def __len__(self): - """The length of the name (in labels). - - Returns an ``int``. - """ - - return len(self.labels) - - def __getitem__(self, index): - return self.labels[index] - - def __add__(self, other): - return self.concatenate(other) - - def __sub__(self, other): - return self.relativize(other) - - def split(self, depth): - """Split a name into a prefix and suffix names at the specified depth. - - *depth* is an ``int`` specifying the number of labels in the suffix - - Raises ``ValueError`` if *depth* was not >= 0 and <= the length of the - name. - - Returns the tuple ``(prefix, suffix)``. - """ - - l = len(self.labels) - if depth == 0: - return (self, dns.name.empty) - elif depth == l: - return (dns.name.empty, self) - elif depth < 0 or depth > l: - raise ValueError( - 'depth must be >= 0 and <= the length of the name') - return (Name(self[: -depth]), Name(self[-depth:])) - - def concatenate(self, other): - """Return a new name which is the concatenation of self and other. - - Raises ``dns.name.AbsoluteConcatenation`` if the name is - absolute and *other* is not the empty name. - - Returns a ``dns.name.Name``. - """ - - if self.is_absolute() and len(other) > 0: - raise AbsoluteConcatenation - labels = list(self.labels) - labels.extend(list(other.labels)) - return Name(labels) - - def relativize(self, origin): - """If the name is a subdomain of *origin*, return a new name which is - the name relative to origin. Otherwise return the name. - - For example, relativizing ``www.dnspython.org.`` to origin - ``dnspython.org.`` returns the name ``www``. Relativizing ``example.`` - to origin ``dnspython.org.`` returns ``example.``. - - Returns a ``dns.name.Name``. - """ - - if origin is not None and self.is_subdomain(origin): - return Name(self[: -len(origin)]) - else: - return self - - def derelativize(self, origin): - """If the name is a relative name, return a new name which is the - concatenation of the name and origin. Otherwise return the name. - - For example, derelativizing ``www`` to origin ``dnspython.org.`` - returns the name ``www.dnspython.org.``. Derelativizing ``example.`` - to origin ``dnspython.org.`` returns ``example.``. - - Returns a ``dns.name.Name``. - """ - - if not self.is_absolute(): - return self.concatenate(origin) - else: - return self - - def choose_relativity(self, origin=None, relativize=True): - """Return a name with the relativity desired by the caller. - - If *origin* is ``None``, then the name is returned. - Otherwise, if *relativize* is ``True`` the name is - relativized, and if *relativize* is ``False`` the name is - derelativized. - - Returns a ``dns.name.Name``. - """ - - if origin: - if relativize: - return self.relativize(origin) - else: - return self.derelativize(origin) - else: - return self - - def parent(self): - """Return the parent of the name. - - For example, the parent of ``www.dnspython.org.`` is ``dnspython.org``. - - Raises ``dns.name.NoParent`` if the name is either the root name or the - empty name, and thus has no parent. - - Returns a ``dns.name.Name``. - """ - - if self == root or self == empty: - raise NoParent - return Name(self.labels[1:]) - -#: The root name, '.' -root = Name([b'']) - -#: The empty name. -empty = Name([]) - -def from_unicode(text, origin=root, idna_codec=None): - """Convert unicode text into a Name object. - - Labels are encoded in IDN ACE form according to rules specified by - the IDNA codec. - - *text*, a ``text``, is the text to convert into a name. - - *origin*, a ``dns.name.Name``, specifies the origin to - append to non-absolute names. The default is the root name. - - *idna_codec*, a ``dns.name.IDNACodec``, specifies the IDNA - encoder/decoder. If ``None``, the default IDNA 2003 encoder/decoder - is used. - - Returns a ``dns.name.Name``. - """ - - if not isinstance(text, text_type): - raise ValueError("input to from_unicode() must be a unicode string") - if not (origin is None or isinstance(origin, Name)): - raise ValueError("origin must be a Name or None") - labels = [] - label = u'' - escaping = False - edigits = 0 - total = 0 - if idna_codec is None: - idna_codec = IDNA_2003 - if text == u'@': - text = u'' - if text: - if text == u'.': - return Name([b'']) # no Unicode "u" on this constant! - for c in text: - if escaping: - if edigits == 0: - if c.isdigit(): - total = int(c) - edigits += 1 - else: - label += c - escaping = False - else: - if not c.isdigit(): - raise BadEscape - total *= 10 - total += int(c) - edigits += 1 - if edigits == 3: - escaping = False - label += unichr(total) - elif c in [u'.', u'\u3002', u'\uff0e', u'\uff61']: - if len(label) == 0: - raise EmptyLabel - labels.append(idna_codec.encode(label)) - label = u'' - elif c == u'\\': - escaping = True - edigits = 0 - total = 0 - else: - label += c - if escaping: - raise BadEscape - if len(label) > 0: - labels.append(idna_codec.encode(label)) - else: - labels.append(b'') - - if (len(labels) == 0 or labels[-1] != b'') and origin is not None: - labels.extend(list(origin.labels)) - return Name(labels) - - -def from_text(text, origin=root, idna_codec=None): - """Convert text into a Name object. - - *text*, a ``text``, is the text to convert into a name. - - *origin*, a ``dns.name.Name``, specifies the origin to - append to non-absolute names. The default is the root name. - - *idna_codec*, a ``dns.name.IDNACodec``, specifies the IDNA - encoder/decoder. If ``None``, the default IDNA 2003 encoder/decoder - is used. - - Returns a ``dns.name.Name``. - """ - - if isinstance(text, text_type): - return from_unicode(text, origin, idna_codec) - if not isinstance(text, binary_type): - raise ValueError("input to from_text() must be a string") - if not (origin is None or isinstance(origin, Name)): - raise ValueError("origin must be a Name or None") - labels = [] - label = b'' - escaping = False - edigits = 0 - total = 0 - if text == b'@': - text = b'' - if text: - if text == b'.': - return Name([b'']) - for c in bytearray(text): - byte_ = struct.pack('!B', c) - if escaping: - if edigits == 0: - if byte_.isdigit(): - total = int(byte_) - edigits += 1 - else: - label += byte_ - escaping = False - else: - if not byte_.isdigit(): - raise BadEscape - total *= 10 - total += int(byte_) - edigits += 1 - if edigits == 3: - escaping = False - label += struct.pack('!B', total) - elif byte_ == b'.': - if len(label) == 0: - raise EmptyLabel - labels.append(label) - label = b'' - elif byte_ == b'\\': - escaping = True - edigits = 0 - total = 0 - else: - label += byte_ - if escaping: - raise BadEscape - if len(label) > 0: - labels.append(label) - else: - labels.append(b'') - if (len(labels) == 0 or labels[-1] != b'') and origin is not None: - labels.extend(list(origin.labels)) - return Name(labels) - - -def from_wire(message, current): - """Convert possibly compressed wire format into a Name. - - *message* is a ``binary`` containing an entire DNS message in DNS - wire form. - - *current*, an ``int``, is the offset of the beginning of the name - from the start of the message - - Raises ``dns.name.BadPointer`` if a compression pointer did not - point backwards in the message. - - Raises ``dns.name.BadLabelType`` if an invalid label type was encountered. - - Returns a ``(dns.name.Name, int)`` tuple consisting of the name - that was read and the number of bytes of the wire format message - which were consumed reading it. - """ - - if not isinstance(message, binary_type): - raise ValueError("input to from_wire() must be a byte string") - message = dns.wiredata.maybe_wrap(message) - labels = [] - biggest_pointer = current - hops = 0 - count = message[current] - current += 1 - cused = 1 - while count != 0: - if count < 64: - labels.append(message[current: current + count].unwrap()) - current += count - if hops == 0: - cused += count - elif count >= 192: - current = (count & 0x3f) * 256 + message[current] - if hops == 0: - cused += 1 - if current >= biggest_pointer: - raise BadPointer - biggest_pointer = current - hops += 1 - else: - raise BadLabelType - count = message[current] - current += 1 - if hops == 0: - cused += 1 - labels.append('') - return (Name(labels), cused) diff --git a/lib/dns/name.pyi b/lib/dns/name.pyi deleted file mode 100644 index 5a8061b2..00000000 --- a/lib/dns/name.pyi +++ /dev/null @@ -1,35 +0,0 @@ -from typing import Optional, Union, Tuple, Iterable, List - -class Name: - def is_subdomain(self, o : Name) -> bool: ... - def is_superdomain(self, o : Name) -> bool: ... - def __init__(self, labels : Iterable[Union[bytes,str]]) -> None: - self.labels : List[bytes] - def is_absolute(self) -> bool: ... - def is_wild(self) -> bool: ... - def fullcompare(self, other) -> Tuple[int,int,int]: ... - def canonicalize(self) -> Name: ... - def __lt__(self, other : Name): ... - def __le__(self, other : Name): ... - def __ge__(self, other : Name): ... - def __gt__(self, other : Name): ... - def to_text(self, omit_final_dot=False) -> str: ... - def to_unicode(self, omit_final_dot=False, idna_codec=None) -> str: ... - def to_digestable(self, origin=None) -> bytes: ... - def to_wire(self, file=None, compress=None, origin=None) -> Optional[bytes]: ... - def __add__(self, other : Name): ... - def __sub__(self, other : Name): ... - def split(self, depth) -> List[Tuple[str,str]]: ... - def concatenate(self, other : Name) -> Name: ... - def relativize(self, origin): ... - def derelativize(self, origin): ... - def choose_relativity(self, origin : Optional[Name] = None, relativize=True): ... - def parent(self) -> Name: ... - -class IDNACodec: - pass - -def from_text(text, origin : Optional[Name] = Name('.'), idna_codec : Optional[IDNACodec] = None) -> Name: - ... - -empty : Name diff --git a/lib/dns/namedict.py b/lib/dns/namedict.py deleted file mode 100644 index 37a13104..00000000 --- a/lib/dns/namedict.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# Copyright (C) 2016 Coresec Systems AB -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND CORESEC SYSTEMS AB DISCLAIMS ALL -# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL CORESEC -# SYSTEMS AB BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS name dictionary""" - -import collections -import dns.name -from ._compat import xrange - - -class NameDict(collections.MutableMapping): - """A dictionary whose keys are dns.name.Name objects. - - In addition to being like a regular Python dictionary, this - dictionary can also get the deepest match for a given key. - """ - - __slots__ = ["max_depth", "max_depth_items", "__store"] - - def __init__(self, *args, **kwargs): - super(NameDict, self).__init__() - self.__store = dict() - #: the maximum depth of the keys that have ever been added - self.max_depth = 0 - #: the number of items of maximum depth - self.max_depth_items = 0 - self.update(dict(*args, **kwargs)) - - def __update_max_depth(self, key): - if len(key) == self.max_depth: - self.max_depth_items = self.max_depth_items + 1 - elif len(key) > self.max_depth: - self.max_depth = len(key) - self.max_depth_items = 1 - - def __getitem__(self, key): - return self.__store[key] - - def __setitem__(self, key, value): - if not isinstance(key, dns.name.Name): - raise ValueError('NameDict key must be a name') - self.__store[key] = value - self.__update_max_depth(key) - - def __delitem__(self, key): - value = self.__store.pop(key) - if len(value) == self.max_depth: - self.max_depth_items = self.max_depth_items - 1 - if self.max_depth_items == 0: - self.max_depth = 0 - for k in self.__store: - self.__update_max_depth(k) - - def __iter__(self): - return iter(self.__store) - - def __len__(self): - return len(self.__store) - - def has_key(self, key): - return key in self.__store - - def get_deepest_match(self, name): - """Find the deepest match to *fname* in the dictionary. - - The deepest match is the longest name in the dictionary which is - a superdomain of *name*. Note that *superdomain* includes matching - *name* itself. - - *name*, a ``dns.name.Name``, the name to find. - - Returns a ``(key, value)`` where *key* is the deepest - ``dns.name.Name``, and *value* is the value associated with *key*. - """ - - depth = len(name) - if depth > self.max_depth: - depth = self.max_depth - for i in xrange(-depth, 0): - n = dns.name.Name(name[i:]) - if n in self: - return (n, self[n]) - v = self[dns.name.empty] - return (dns.name.empty, v) diff --git a/lib/dns/node.py b/lib/dns/node.py deleted file mode 100644 index 8a7f19f5..00000000 --- a/lib/dns/node.py +++ /dev/null @@ -1,182 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS nodes. A node is a set of rdatasets.""" - -from io import StringIO - -import dns.rdataset -import dns.rdatatype -import dns.renderer - - -class Node(object): - - """A Node is a set of rdatasets.""" - - __slots__ = ['rdatasets'] - - def __init__(self): - #: the set of rdatsets, represented as a list. - self.rdatasets = [] - - def to_text(self, name, **kw): - """Convert a node to text format. - - Each rdataset at the node is printed. Any keyword arguments - to this method are passed on to the rdataset's to_text() method. - - *name*, a ``dns.name.Name`` or ``text``, the owner name of the rdatasets. - - Returns a ``text``. - """ - - s = StringIO() - for rds in self.rdatasets: - if len(rds) > 0: - s.write(rds.to_text(name, **kw)) - s.write(u'\n') - return s.getvalue()[:-1] - - def __repr__(self): - return '<DNS node ' + str(id(self)) + '>' - - def __eq__(self, other): - # - # This is inefficient. Good thing we don't need to do it much. - # - for rd in self.rdatasets: - if rd not in other.rdatasets: - return False - for rd in other.rdatasets: - if rd not in self.rdatasets: - return False - return True - - def __ne__(self, other): - return not self.__eq__(other) - - def __len__(self): - return len(self.rdatasets) - - def __iter__(self): - return iter(self.rdatasets) - - def find_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE, - create=False): - """Find an rdataset matching the specified properties in the - current node. - - *rdclass*, an ``int``, the class of the rdataset. - - *rdtype*, an ``int``, the type of the rdataset. - - *covers*, an ``int``, the covered type. Usually this value is - dns.rdatatype.NONE, but if the rdtype is dns.rdatatype.SIG or - dns.rdatatype.RRSIG, then the covers value will be the rdata - type the SIG/RRSIG covers. The library treats the SIG and RRSIG - types as if they were a family of - types, e.g. RRSIG(A), RRSIG(NS), RRSIG(SOA). This makes RRSIGs much - easier to work with than if RRSIGs covering different rdata - types were aggregated into a single RRSIG rdataset. - - *create*, a ``bool``. If True, create the rdataset if it is not found. - - Raises ``KeyError`` if an rdataset of the desired type and class does - not exist and *create* is not ``True``. - - Returns a ``dns.rdataset.Rdataset``. - """ - - for rds in self.rdatasets: - if rds.match(rdclass, rdtype, covers): - return rds - if not create: - raise KeyError - rds = dns.rdataset.Rdataset(rdclass, rdtype) - self.rdatasets.append(rds) - return rds - - def get_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE, - create=False): - """Get an rdataset matching the specified properties in the - current node. - - None is returned if an rdataset of the specified type and - class does not exist and *create* is not ``True``. - - *rdclass*, an ``int``, the class of the rdataset. - - *rdtype*, an ``int``, the type of the rdataset. - - *covers*, an ``int``, the covered type. Usually this value is - dns.rdatatype.NONE, but if the rdtype is dns.rdatatype.SIG or - dns.rdatatype.RRSIG, then the covers value will be the rdata - type the SIG/RRSIG covers. The library treats the SIG and RRSIG - types as if they were a family of - types, e.g. RRSIG(A), RRSIG(NS), RRSIG(SOA). This makes RRSIGs much - easier to work with than if RRSIGs covering different rdata - types were aggregated into a single RRSIG rdataset. - - *create*, a ``bool``. If True, create the rdataset if it is not found. - - Returns a ``dns.rdataset.Rdataset`` or ``None``. - """ - - try: - rds = self.find_rdataset(rdclass, rdtype, covers, create) - except KeyError: - rds = None - return rds - - def delete_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE): - """Delete the rdataset matching the specified properties in the - current node. - - If a matching rdataset does not exist, it is not an error. - - *rdclass*, an ``int``, the class of the rdataset. - - *rdtype*, an ``int``, the type of the rdataset. - - *covers*, an ``int``, the covered type. - """ - - rds = self.get_rdataset(rdclass, rdtype, covers) - if rds is not None: - self.rdatasets.remove(rds) - - def replace_rdataset(self, replacement): - """Replace an rdataset. - - It is not an error if there is no rdataset matching *replacement*. - - Ownership of the *replacement* object is transferred to the node; - in other words, this method does not store a copy of *replacement* - at the node, it stores *replacement* itself. - - *replacement*, a ``dns.rdataset.Rdataset``. - - Raises ``ValueError`` if *replacement* is not a - ``dns.rdataset.Rdataset``. - """ - - if not isinstance(replacement, dns.rdataset.Rdataset): - raise ValueError('replacement is not an rdataset') - self.delete_rdataset(replacement.rdclass, replacement.rdtype, - replacement.covers) - self.rdatasets.append(replacement) diff --git a/lib/dns/node.pyi b/lib/dns/node.pyi deleted file mode 100644 index 0997edf9..00000000 --- a/lib/dns/node.pyi +++ /dev/null @@ -1,17 +0,0 @@ -from typing import List, Optional, Union -from . import rdataset, rdatatype, name -class Node: - def __init__(self): - self.rdatasets : List[rdataset.Rdataset] - def to_text(self, name : Union[str,name.Name], **kw) -> str: - ... - def find_rdataset(self, rdclass : int, rdtype : int, covers=rdatatype.NONE, - create=False) -> rdataset.Rdataset: - ... - def get_rdataset(self, rdclass : int, rdtype : int, covers=rdatatype.NONE, - create=False) -> Optional[rdataset.Rdataset]: - ... - def delete_rdataset(self, rdclass : int, rdtype : int, covers=rdatatype.NONE): - ... - def replace_rdataset(self, replacement : rdataset.Rdataset) -> None: - ... diff --git a/lib/dns/opcode.py b/lib/dns/opcode.py deleted file mode 100644 index c0735ba4..00000000 --- a/lib/dns/opcode.py +++ /dev/null @@ -1,119 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Opcodes.""" - -import dns.exception - -#: Query -QUERY = 0 -#: Inverse Query (historical) -IQUERY = 1 -#: Server Status (unspecified and unimplemented anywhere) -STATUS = 2 -#: Notify -NOTIFY = 4 -#: Dynamic Update -UPDATE = 5 - -_by_text = { - 'QUERY': QUERY, - 'IQUERY': IQUERY, - 'STATUS': STATUS, - 'NOTIFY': NOTIFY, - 'UPDATE': UPDATE -} - -# We construct the inverse mapping programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mapping not to be true inverse. - -_by_value = {y: x for x, y in _by_text.items()} - - -class UnknownOpcode(dns.exception.DNSException): - """An DNS opcode is unknown.""" - - -def from_text(text): - """Convert text into an opcode. - - *text*, a ``text``, the textual opcode - - Raises ``dns.opcode.UnknownOpcode`` if the opcode is unknown. - - Returns an ``int``. - """ - - if text.isdigit(): - value = int(text) - if value >= 0 and value <= 15: - return value - value = _by_text.get(text.upper()) - if value is None: - raise UnknownOpcode - return value - - -def from_flags(flags): - """Extract an opcode from DNS message flags. - - *flags*, an ``int``, the DNS flags. - - Returns an ``int``. - """ - - return (flags & 0x7800) >> 11 - - -def to_flags(value): - """Convert an opcode to a value suitable for ORing into DNS message - flags. - - *value*, an ``int``, the DNS opcode value. - - Returns an ``int``. - """ - - return (value << 11) & 0x7800 - - -def to_text(value): - """Convert an opcode to text. - - *value*, an ``int`` the opcode value, - - Raises ``dns.opcode.UnknownOpcode`` if the opcode is unknown. - - Returns a ``text``. - """ - - text = _by_value.get(value) - if text is None: - text = str(value) - return text - - -def is_update(flags): - """Is the opcode in flags UPDATE? - - *flags*, an ``int``, the DNS message flags. - - Returns a ``bool``. - """ - - return from_flags(flags) == UPDATE diff --git a/lib/dns/py.typed b/lib/dns/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/dns/query.py b/lib/dns/query.py deleted file mode 100644 index c0c517cc..00000000 --- a/lib/dns/query.py +++ /dev/null @@ -1,683 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Talk to a DNS server.""" - -from __future__ import generators - -import errno -import select -import socket -import struct -import sys -import time - -import dns.exception -import dns.inet -import dns.name -import dns.message -import dns.rcode -import dns.rdataclass -import dns.rdatatype -from ._compat import long, string_types, PY3 - -if PY3: - select_error = OSError -else: - select_error = select.error - -# Function used to create a socket. Can be overridden if needed in special -# situations. -socket_factory = socket.socket - -class UnexpectedSource(dns.exception.DNSException): - """A DNS query response came from an unexpected address or port.""" - - -class BadResponse(dns.exception.FormError): - """A DNS query response does not respond to the question asked.""" - - -class TransferError(dns.exception.DNSException): - """A zone transfer response got a non-zero rcode.""" - - def __init__(self, rcode): - message = 'Zone transfer error: %s' % dns.rcode.to_text(rcode) - super(TransferError, self).__init__(message) - self.rcode = rcode - - -def _compute_expiration(timeout): - if timeout is None: - return None - else: - return time.time() + timeout - -# This module can use either poll() or select() as the "polling backend". -# -# A backend function takes an fd, bools for readability, writablity, and -# error detection, and a timeout. - -def _poll_for(fd, readable, writable, error, timeout): - """Poll polling backend.""" - - event_mask = 0 - if readable: - event_mask |= select.POLLIN - if writable: - event_mask |= select.POLLOUT - if error: - event_mask |= select.POLLERR - - pollable = select.poll() - pollable.register(fd, event_mask) - - if timeout: - event_list = pollable.poll(long(timeout * 1000)) - else: - event_list = pollable.poll() - - return bool(event_list) - - -def _select_for(fd, readable, writable, error, timeout): - """Select polling backend.""" - - rset, wset, xset = [], [], [] - - if readable: - rset = [fd] - if writable: - wset = [fd] - if error: - xset = [fd] - - if timeout is None: - (rcount, wcount, xcount) = select.select(rset, wset, xset) - else: - (rcount, wcount, xcount) = select.select(rset, wset, xset, timeout) - - return bool((rcount or wcount or xcount)) - - -def _wait_for(fd, readable, writable, error, expiration): - # Use the selected polling backend to wait for any of the specified - # events. An "expiration" absolute time is converted into a relative - # timeout. - - done = False - while not done: - if expiration is None: - timeout = None - else: - timeout = expiration - time.time() - if timeout <= 0.0: - raise dns.exception.Timeout - try: - if not _polling_backend(fd, readable, writable, error, timeout): - raise dns.exception.Timeout - except select_error as e: - if e.args[0] != errno.EINTR: - raise e - done = True - - -def _set_polling_backend(fn): - # Internal API. Do not use. - - global _polling_backend - - _polling_backend = fn - -if hasattr(select, 'poll'): - # Prefer poll() on platforms that support it because it has no - # limits on the maximum value of a file descriptor (plus it will - # be more efficient for high values). - _polling_backend = _poll_for -else: - _polling_backend = _select_for - - -def _wait_for_readable(s, expiration): - _wait_for(s, True, False, True, expiration) - - -def _wait_for_writable(s, expiration): - _wait_for(s, False, True, True, expiration) - - -def _addresses_equal(af, a1, a2): - # Convert the first value of the tuple, which is a textual format - # address into binary form, so that we are not confused by different - # textual representations of the same address - try: - n1 = dns.inet.inet_pton(af, a1[0]) - n2 = dns.inet.inet_pton(af, a2[0]) - except dns.exception.SyntaxError: - return False - return n1 == n2 and a1[1:] == a2[1:] - - -def _destination_and_source(af, where, port, source, source_port): - # Apply defaults and compute destination and source tuples - # suitable for use in connect(), sendto(), or bind(). - if af is None: - try: - af = dns.inet.af_for_address(where) - except Exception: - af = dns.inet.AF_INET - if af == dns.inet.AF_INET: - destination = (where, port) - if source is not None or source_port != 0: - if source is None: - source = '0.0.0.0' - source = (source, source_port) - elif af == dns.inet.AF_INET6: - destination = (where, port, 0, 0) - if source is not None or source_port != 0: - if source is None: - source = '::' - source = (source, source_port, 0, 0) - return (af, destination, source) - - -def send_udp(sock, what, destination, expiration=None): - """Send a DNS message to the specified UDP socket. - - *sock*, a ``socket``. - - *what*, a ``binary`` or ``dns.message.Message``, the message to send. - - *destination*, a destination tuple appropriate for the address family - of the socket, specifying where to send the query. - - *expiration*, a ``float`` or ``None``, the absolute time at which - a timeout exception should be raised. If ``None``, no timeout will - occur. - - Returns an ``(int, float)`` tuple of bytes sent and the sent time. - """ - - if isinstance(what, dns.message.Message): - what = what.to_wire() - _wait_for_writable(sock, expiration) - sent_time = time.time() - n = sock.sendto(what, destination) - return (n, sent_time) - - -def receive_udp(sock, destination, expiration=None, - ignore_unexpected=False, one_rr_per_rrset=False, - keyring=None, request_mac=b'', ignore_trailing=False): - """Read a DNS message from a UDP socket. - - *sock*, a ``socket``. - - *destination*, a destination tuple appropriate for the address family - of the socket, specifying where the associated query was sent. - - *expiration*, a ``float`` or ``None``, the absolute time at which - a timeout exception should be raised. If ``None``, no timeout will - occur. - - *ignore_unexpected*, a ``bool``. If ``True``, ignore responses from - unexpected sources. - - *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own - RRset. - - *keyring*, a ``dict``, the keyring to use for TSIG. - - *request_mac*, a ``binary``, the MAC of the request (for TSIG). - - *ignore_trailing*, a ``bool``. If ``True``, ignore trailing - junk at end of the received message. - - Raises if the message is malformed, if network errors occur, of if - there is a timeout. - - Returns a ``dns.message.Message`` object. - """ - - wire = b'' - while 1: - _wait_for_readable(sock, expiration) - (wire, from_address) = sock.recvfrom(65535) - if _addresses_equal(sock.family, from_address, destination) or \ - (dns.inet.is_multicast(destination[0]) and - from_address[1:] == destination[1:]): - break - if not ignore_unexpected: - raise UnexpectedSource('got a response from ' - '%s instead of %s' % (from_address, - destination)) - received_time = time.time() - r = dns.message.from_wire(wire, keyring=keyring, request_mac=request_mac, - one_rr_per_rrset=one_rr_per_rrset, - ignore_trailing=ignore_trailing) - return (r, received_time) - -def udp(q, where, timeout=None, port=53, af=None, source=None, source_port=0, - ignore_unexpected=False, one_rr_per_rrset=False, ignore_trailing=False): - """Return the response obtained after sending a query via UDP. - - *q*, a ``dns.message.Message``, the query to send - - *where*, a ``text`` containing an IPv4 or IPv6 address, where - to send the message. - - *timeout*, a ``float`` or ``None``, the number of seconds to wait before the - query times out. If ``None``, the default, wait forever. - - *port*, an ``int``, the port send the message to. The default is 53. - - *af*, an ``int``, the address family to use. The default is ``None``, - which causes the address family to use to be inferred from the form of - *where*. If the inference attempt fails, AF_INET is used. This - parameter is historical; you need never set it. - - *source*, a ``text`` containing an IPv4 or IPv6 address, specifying - the source address. The default is the wildcard address. - - *source_port*, an ``int``, the port from which to send the message. - The default is 0. - - *ignore_unexpected*, a ``bool``. If ``True``, ignore responses from - unexpected sources. - - *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own - RRset. - - *ignore_trailing*, a ``bool``. If ``True``, ignore trailing - junk at end of the received message. - - Returns a ``dns.message.Message``. - """ - - wire = q.to_wire() - (af, destination, source) = _destination_and_source(af, where, port, - source, source_port) - s = socket_factory(af, socket.SOCK_DGRAM, 0) - received_time = None - sent_time = None - try: - expiration = _compute_expiration(timeout) - s.setblocking(0) - if source is not None: - s.bind(source) - (_, sent_time) = send_udp(s, wire, destination, expiration) - (r, received_time) = receive_udp(s, destination, expiration, - ignore_unexpected, one_rr_per_rrset, - q.keyring, q.mac, ignore_trailing) - finally: - if sent_time is None or received_time is None: - response_time = 0 - else: - response_time = received_time - sent_time - s.close() - r.time = response_time - if not q.is_response(r): - raise BadResponse - return r - - -def _net_read(sock, count, expiration): - """Read the specified number of bytes from sock. Keep trying until we - either get the desired amount, or we hit EOF. - A Timeout exception will be raised if the operation is not completed - by the expiration time. - """ - s = b'' - while count > 0: - _wait_for_readable(sock, expiration) - n = sock.recv(count) - if n == b'': - raise EOFError - count = count - len(n) - s = s + n - return s - - -def _net_write(sock, data, expiration): - """Write the specified data to the socket. - A Timeout exception will be raised if the operation is not completed - by the expiration time. - """ - current = 0 - l = len(data) - while current < l: - _wait_for_writable(sock, expiration) - current += sock.send(data[current:]) - - -def send_tcp(sock, what, expiration=None): - """Send a DNS message to the specified TCP socket. - - *sock*, a ``socket``. - - *what*, a ``binary`` or ``dns.message.Message``, the message to send. - - *expiration*, a ``float`` or ``None``, the absolute time at which - a timeout exception should be raised. If ``None``, no timeout will - occur. - - Returns an ``(int, float)`` tuple of bytes sent and the sent time. - """ - - if isinstance(what, dns.message.Message): - what = what.to_wire() - l = len(what) - # copying the wire into tcpmsg is inefficient, but lets us - # avoid writev() or doing a short write that would get pushed - # onto the net - tcpmsg = struct.pack("!H", l) + what - _wait_for_writable(sock, expiration) - sent_time = time.time() - _net_write(sock, tcpmsg, expiration) - return (len(tcpmsg), sent_time) - -def receive_tcp(sock, expiration=None, one_rr_per_rrset=False, - keyring=None, request_mac=b'', ignore_trailing=False): - """Read a DNS message from a TCP socket. - - *sock*, a ``socket``. - - *expiration*, a ``float`` or ``None``, the absolute time at which - a timeout exception should be raised. If ``None``, no timeout will - occur. - - *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own - RRset. - - *keyring*, a ``dict``, the keyring to use for TSIG. - - *request_mac*, a ``binary``, the MAC of the request (for TSIG). - - *ignore_trailing*, a ``bool``. If ``True``, ignore trailing - junk at end of the received message. - - Raises if the message is malformed, if network errors occur, of if - there is a timeout. - - Returns a ``dns.message.Message`` object. - """ - - ldata = _net_read(sock, 2, expiration) - (l,) = struct.unpack("!H", ldata) - wire = _net_read(sock, l, expiration) - received_time = time.time() - r = dns.message.from_wire(wire, keyring=keyring, request_mac=request_mac, - one_rr_per_rrset=one_rr_per_rrset, - ignore_trailing=ignore_trailing) - return (r, received_time) - -def _connect(s, address): - try: - s.connect(address) - except socket.error: - (ty, v) = sys.exc_info()[:2] - - if hasattr(v, 'errno'): - v_err = v.errno - else: - v_err = v[0] - if v_err not in [errno.EINPROGRESS, errno.EWOULDBLOCK, errno.EALREADY]: - raise v - - -def tcp(q, where, timeout=None, port=53, af=None, source=None, source_port=0, - one_rr_per_rrset=False, ignore_trailing=False): - """Return the response obtained after sending a query via TCP. - - *q*, a ``dns.message.Message``, the query to send - - *where*, a ``text`` containing an IPv4 or IPv6 address, where - to send the message. - - *timeout*, a ``float`` or ``None``, the number of seconds to wait before the - query times out. If ``None``, the default, wait forever. - - *port*, an ``int``, the port send the message to. The default is 53. - - *af*, an ``int``, the address family to use. The default is ``None``, - which causes the address family to use to be inferred from the form of - *where*. If the inference attempt fails, AF_INET is used. This - parameter is historical; you need never set it. - - *source*, a ``text`` containing an IPv4 or IPv6 address, specifying - the source address. The default is the wildcard address. - - *source_port*, an ``int``, the port from which to send the message. - The default is 0. - - *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own - RRset. - - *ignore_trailing*, a ``bool``. If ``True``, ignore trailing - junk at end of the received message. - - Returns a ``dns.message.Message``. - """ - - wire = q.to_wire() - (af, destination, source) = _destination_and_source(af, where, port, - source, source_port) - s = socket_factory(af, socket.SOCK_STREAM, 0) - begin_time = None - received_time = None - try: - expiration = _compute_expiration(timeout) - s.setblocking(0) - begin_time = time.time() - if source is not None: - s.bind(source) - _connect(s, destination) - send_tcp(s, wire, expiration) - (r, received_time) = receive_tcp(s, expiration, one_rr_per_rrset, - q.keyring, q.mac, ignore_trailing) - finally: - if begin_time is None or received_time is None: - response_time = 0 - else: - response_time = received_time - begin_time - s.close() - r.time = response_time - if not q.is_response(r): - raise BadResponse - return r - - -def xfr(where, zone, rdtype=dns.rdatatype.AXFR, rdclass=dns.rdataclass.IN, - timeout=None, port=53, keyring=None, keyname=None, relativize=True, - af=None, lifetime=None, source=None, source_port=0, serial=0, - use_udp=False, keyalgorithm=dns.tsig.default_algorithm): - """Return a generator for the responses to a zone transfer. - - *where*. If the inference attempt fails, AF_INET is used. This - parameter is historical; you need never set it. - - *zone*, a ``dns.name.Name`` or ``text``, the name of the zone to transfer. - - *rdtype*, an ``int`` or ``text``, the type of zone transfer. The - default is ``dns.rdatatype.AXFR``. ``dns.rdatatype.IXFR`` can be - used to do an incremental transfer instead. - - *rdclass*, an ``int`` or ``text``, the class of the zone transfer. - The default is ``dns.rdataclass.IN``. - - *timeout*, a ``float``, the number of seconds to wait for each - response message. If None, the default, wait forever. - - *port*, an ``int``, the port send the message to. The default is 53. - - *keyring*, a ``dict``, the keyring to use for TSIG. - - *keyname*, a ``dns.name.Name`` or ``text``, the name of the TSIG - key to use. - - *relativize*, a ``bool``. If ``True``, all names in the zone will be - relativized to the zone origin. It is essential that the - relativize setting matches the one specified to - ``dns.zone.from_xfr()`` if using this generator to make a zone. - - *af*, an ``int``, the address family to use. The default is ``None``, - which causes the address family to use to be inferred from the form of - *where*. If the inference attempt fails, AF_INET is used. This - parameter is historical; you need never set it. - - *lifetime*, a ``float``, the total number of seconds to spend - doing the transfer. If ``None``, the default, then there is no - limit on the time the transfer may take. - - *source*, a ``text`` containing an IPv4 or IPv6 address, specifying - the source address. The default is the wildcard address. - - *source_port*, an ``int``, the port from which to send the message. - The default is 0. - - *serial*, an ``int``, the SOA serial number to use as the base for - an IXFR diff sequence (only meaningful if *rdtype* is - ``dns.rdatatype.IXFR``). - - *use_udp*, a ``bool``. If ``True``, use UDP (only meaningful for IXFR). - - *keyalgorithm*, a ``dns.name.Name`` or ``text``, the TSIG algorithm to use. - - Raises on errors, and so does the generator. - - Returns a generator of ``dns.message.Message`` objects. - """ - - if isinstance(zone, string_types): - zone = dns.name.from_text(zone) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - q = dns.message.make_query(zone, rdtype, rdclass) - if rdtype == dns.rdatatype.IXFR: - rrset = dns.rrset.from_text(zone, 0, 'IN', 'SOA', - '. . %u 0 0 0 0' % serial) - q.authority.append(rrset) - if keyring is not None: - q.use_tsig(keyring, keyname, algorithm=keyalgorithm) - wire = q.to_wire() - (af, destination, source) = _destination_and_source(af, where, port, - source, source_port) - if use_udp: - if rdtype != dns.rdatatype.IXFR: - raise ValueError('cannot do a UDP AXFR') - s = socket_factory(af, socket.SOCK_DGRAM, 0) - else: - s = socket_factory(af, socket.SOCK_STREAM, 0) - s.setblocking(0) - if source is not None: - s.bind(source) - expiration = _compute_expiration(lifetime) - _connect(s, destination) - l = len(wire) - if use_udp: - _wait_for_writable(s, expiration) - s.send(wire) - else: - tcpmsg = struct.pack("!H", l) + wire - _net_write(s, tcpmsg, expiration) - done = False - delete_mode = True - expecting_SOA = False - soa_rrset = None - if relativize: - origin = zone - oname = dns.name.empty - else: - origin = None - oname = zone - tsig_ctx = None - first = True - while not done: - mexpiration = _compute_expiration(timeout) - if mexpiration is None or mexpiration > expiration: - mexpiration = expiration - if use_udp: - _wait_for_readable(s, expiration) - (wire, from_address) = s.recvfrom(65535) - else: - ldata = _net_read(s, 2, mexpiration) - (l,) = struct.unpack("!H", ldata) - wire = _net_read(s, l, mexpiration) - is_ixfr = (rdtype == dns.rdatatype.IXFR) - r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac, - xfr=True, origin=origin, tsig_ctx=tsig_ctx, - multi=True, first=first, - one_rr_per_rrset=is_ixfr) - rcode = r.rcode() - if rcode != dns.rcode.NOERROR: - raise TransferError(rcode) - tsig_ctx = r.tsig_ctx - first = False - answer_index = 0 - if soa_rrset is None: - if not r.answer or r.answer[0].name != oname: - raise dns.exception.FormError( - "No answer or RRset not for qname") - rrset = r.answer[0] - if rrset.rdtype != dns.rdatatype.SOA: - raise dns.exception.FormError("first RRset is not an SOA") - answer_index = 1 - soa_rrset = rrset.copy() - if rdtype == dns.rdatatype.IXFR: - if soa_rrset[0].serial <= serial: - # - # We're already up-to-date. - # - done = True - else: - expecting_SOA = True - # - # Process SOAs in the answer section (other than the initial - # SOA in the first message). - # - for rrset in r.answer[answer_index:]: - if done: - raise dns.exception.FormError("answers after final SOA") - if rrset.rdtype == dns.rdatatype.SOA and rrset.name == oname: - if expecting_SOA: - if rrset[0].serial != serial: - raise dns.exception.FormError( - "IXFR base serial mismatch") - expecting_SOA = False - elif rdtype == dns.rdatatype.IXFR: - delete_mode = not delete_mode - # - # If this SOA RRset is equal to the first we saw then we're - # finished. If this is an IXFR we also check that we're seeing - # the record in the expected part of the response. - # - if rrset == soa_rrset and \ - (rdtype == dns.rdatatype.AXFR or - (rdtype == dns.rdatatype.IXFR and delete_mode)): - done = True - elif expecting_SOA: - # - # We made an IXFR request and are expecting another - # SOA RR, but saw something else, so this must be an - # AXFR response. - # - rdtype = dns.rdatatype.AXFR - expecting_SOA = False - if done and q.keyring and not r.had_tsig: - raise dns.exception.FormError("missing TSIG") - yield r - s.close() diff --git a/lib/dns/query.pyi b/lib/dns/query.pyi deleted file mode 100644 index fe5ef826..00000000 --- a/lib/dns/query.pyi +++ /dev/null @@ -1,15 +0,0 @@ -from typing import Optional, Union, Dict, Generator, Any -from . import message, tsig, rdatatype, rdataclass, name, message -def tcp(q : message.Message, where : str, timeout : float = None, port=53, af : Optional[int] = None, source : Optional[str] = None, source_port : int = 0, - one_rr_per_rrset=False) -> message.Message: - pass - -def xfr(where : None, zone : Union[name.Name,str], rdtype=rdatatype.AXFR, rdclass=rdataclass.IN, - timeout : Optional[float] =None, port=53, keyring : Optional[Dict[name.Name, bytes]] =None, keyname : Union[str,name.Name]=None, relativize=True, - af : Optional[int] =None, lifetime : Optional[float]=None, source : Optional[str] =None, source_port=0, serial=0, - use_udp=False, keyalgorithm=tsig.default_algorithm) -> Generator[Any,Any,message.Message]: - pass - -def udp(q : message.Message, where : str, timeout : Optional[float] = None, port=53, af : Optional[int] = None, source : Optional[str] = None, source_port=0, - ignore_unexpected=False, one_rr_per_rrset=False) -> message.Message: - ... diff --git a/lib/dns/rcode.py b/lib/dns/rcode.py deleted file mode 100644 index 5191e1b1..00000000 --- a/lib/dns/rcode.py +++ /dev/null @@ -1,144 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Result Codes.""" - -import dns.exception -from ._compat import long - -#: No error -NOERROR = 0 -#: Form error -FORMERR = 1 -#: Server failure -SERVFAIL = 2 -#: Name does not exist ("Name Error" in RFC 1025 terminology). -NXDOMAIN = 3 -#: Not implemented -NOTIMP = 4 -#: Refused -REFUSED = 5 -#: Name exists. -YXDOMAIN = 6 -#: RRset exists. -YXRRSET = 7 -#: RRset does not exist. -NXRRSET = 8 -#: Not authoritative. -NOTAUTH = 9 -#: Name not in zone. -NOTZONE = 10 -#: Bad EDNS version. -BADVERS = 16 - -_by_text = { - 'NOERROR': NOERROR, - 'FORMERR': FORMERR, - 'SERVFAIL': SERVFAIL, - 'NXDOMAIN': NXDOMAIN, - 'NOTIMP': NOTIMP, - 'REFUSED': REFUSED, - 'YXDOMAIN': YXDOMAIN, - 'YXRRSET': YXRRSET, - 'NXRRSET': NXRRSET, - 'NOTAUTH': NOTAUTH, - 'NOTZONE': NOTZONE, - 'BADVERS': BADVERS -} - -# We construct the inverse mapping programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mapping not to be a true inverse. - -_by_value = {y: x for x, y in _by_text.items()} - - -class UnknownRcode(dns.exception.DNSException): - """A DNS rcode is unknown.""" - - -def from_text(text): - """Convert text into an rcode. - - *text*, a ``text``, the textual rcode or an integer in textual form. - - Raises ``dns.rcode.UnknownRcode`` if the rcode mnemonic is unknown. - - Returns an ``int``. - """ - - if text.isdigit(): - v = int(text) - if v >= 0 and v <= 4095: - return v - v = _by_text.get(text.upper()) - if v is None: - raise UnknownRcode - return v - - -def from_flags(flags, ednsflags): - """Return the rcode value encoded by flags and ednsflags. - - *flags*, an ``int``, the DNS flags field. - - *ednsflags*, an ``int``, the EDNS flags field. - - Raises ``ValueError`` if rcode is < 0 or > 4095 - - Returns an ``int``. - """ - - value = (flags & 0x000f) | ((ednsflags >> 20) & 0xff0) - if value < 0 or value > 4095: - raise ValueError('rcode must be >= 0 and <= 4095') - return value - - -def to_flags(value): - """Return a (flags, ednsflags) tuple which encodes the rcode. - - *value*, an ``int``, the rcode. - - Raises ``ValueError`` if rcode is < 0 or > 4095. - - Returns an ``(int, int)`` tuple. - """ - - if value < 0 or value > 4095: - raise ValueError('rcode must be >= 0 and <= 4095') - v = value & 0xf - ev = long(value & 0xff0) << 20 - return (v, ev) - - -def to_text(value): - """Convert rcode into text. - - *value*, and ``int``, the rcode. - - Raises ``ValueError`` if rcode is < 0 or > 4095. - - Returns a ``text``. - """ - - if value < 0 or value > 4095: - raise ValueError('rcode must be >= 0 and <= 4095') - text = _by_value.get(value) - if text is None: - text = str(value) - return text diff --git a/lib/dns/rdata.py b/lib/dns/rdata.py deleted file mode 100644 index ea1971dc..00000000 --- a/lib/dns/rdata.py +++ /dev/null @@ -1,456 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS rdata.""" - -from io import BytesIO -import base64 -import binascii - -import dns.exception -import dns.name -import dns.rdataclass -import dns.rdatatype -import dns.tokenizer -import dns.wiredata -from ._compat import xrange, string_types, text_type - -try: - import threading as _threading -except ImportError: - import dummy_threading as _threading - -_hex_chunksize = 32 - - -def _hexify(data, chunksize=_hex_chunksize): - """Convert a binary string into its hex encoding, broken up into chunks - of chunksize characters separated by a space. - """ - - line = binascii.hexlify(data) - return b' '.join([line[i:i + chunksize] - for i - in range(0, len(line), chunksize)]).decode() - -_base64_chunksize = 32 - - -def _base64ify(data, chunksize=_base64_chunksize): - """Convert a binary string into its base64 encoding, broken up into chunks - of chunksize characters separated by a space. - """ - - line = base64.b64encode(data) - return b' '.join([line[i:i + chunksize] - for i - in range(0, len(line), chunksize)]).decode() - -__escaped = bytearray(b'"\\') - -def _escapify(qstring): - """Escape the characters in a quoted string which need it.""" - - if isinstance(qstring, text_type): - qstring = qstring.encode() - if not isinstance(qstring, bytearray): - qstring = bytearray(qstring) - - text = '' - for c in qstring: - if c in __escaped: - text += '\\' + chr(c) - elif c >= 0x20 and c < 0x7F: - text += chr(c) - else: - text += '\\%03d' % c - return text - - -def _truncate_bitmap(what): - """Determine the index of greatest byte that isn't all zeros, and - return the bitmap that contains all the bytes less than that index. - """ - - for i in xrange(len(what) - 1, -1, -1): - if what[i] != 0: - return what[0: i + 1] - return what[0:1] - - -class Rdata(object): - """Base class for all DNS rdata types.""" - - __slots__ = ['rdclass', 'rdtype'] - - def __init__(self, rdclass, rdtype): - """Initialize an rdata. - - *rdclass*, an ``int`` is the rdataclass of the Rdata. - *rdtype*, an ``int`` is the rdatatype of the Rdata. - """ - - self.rdclass = rdclass - self.rdtype = rdtype - - def covers(self): - """Return the type a Rdata covers. - - DNS SIG/RRSIG rdatas apply to a specific type; this type is - returned by the covers() function. If the rdata type is not - SIG or RRSIG, dns.rdatatype.NONE is returned. This is useful when - creating rdatasets, allowing the rdataset to contain only RRSIGs - of a particular type, e.g. RRSIG(NS). - - Returns an ``int``. - """ - - return dns.rdatatype.NONE - - def extended_rdatatype(self): - """Return a 32-bit type value, the least significant 16 bits of - which are the ordinary DNS type, and the upper 16 bits of which are - the "covered" type, if any. - - Returns an ``int``. - """ - - return self.covers() << 16 | self.rdtype - - def to_text(self, origin=None, relativize=True, **kw): - """Convert an rdata to text format. - - Returns a ``text``. - """ - - raise NotImplementedError - - def to_wire(self, file, compress=None, origin=None): - """Convert an rdata to wire format. - - Returns a ``binary``. - """ - - raise NotImplementedError - - def to_digestable(self, origin=None): - """Convert rdata to a format suitable for digesting in hashes. This - is also the DNSSEC canonical form. - - Returns a ``binary``. - """ - - f = BytesIO() - self.to_wire(f, None, origin) - return f.getvalue() - - def validate(self): - """Check that the current contents of the rdata's fields are - valid. - - If you change an rdata by assigning to its fields, - it is a good idea to call validate() when you are done making - changes. - - Raises various exceptions if there are problems. - - Returns ``None``. - """ - - dns.rdata.from_text(self.rdclass, self.rdtype, self.to_text()) - - def __repr__(self): - covers = self.covers() - if covers == dns.rdatatype.NONE: - ctext = '' - else: - ctext = '(' + dns.rdatatype.to_text(covers) + ')' - return '<DNS ' + dns.rdataclass.to_text(self.rdclass) + ' ' + \ - dns.rdatatype.to_text(self.rdtype) + ctext + ' rdata: ' + \ - str(self) + '>' - - def __str__(self): - return self.to_text() - - def _cmp(self, other): - """Compare an rdata with another rdata of the same rdtype and - rdclass. - - Return < 0 if self < other in the DNSSEC ordering, 0 if self - == other, and > 0 if self > other. - - """ - our = self.to_digestable(dns.name.root) - their = other.to_digestable(dns.name.root) - if our == their: - return 0 - elif our > their: - return 1 - else: - return -1 - - def __eq__(self, other): - if not isinstance(other, Rdata): - return False - if self.rdclass != other.rdclass or self.rdtype != other.rdtype: - return False - return self._cmp(other) == 0 - - def __ne__(self, other): - if not isinstance(other, Rdata): - return True - if self.rdclass != other.rdclass or self.rdtype != other.rdtype: - return True - return self._cmp(other) != 0 - - def __lt__(self, other): - if not isinstance(other, Rdata) or \ - self.rdclass != other.rdclass or self.rdtype != other.rdtype: - - return NotImplemented - return self._cmp(other) < 0 - - def __le__(self, other): - if not isinstance(other, Rdata) or \ - self.rdclass != other.rdclass or self.rdtype != other.rdtype: - return NotImplemented - return self._cmp(other) <= 0 - - def __ge__(self, other): - if not isinstance(other, Rdata) or \ - self.rdclass != other.rdclass or self.rdtype != other.rdtype: - return NotImplemented - return self._cmp(other) >= 0 - - def __gt__(self, other): - if not isinstance(other, Rdata) or \ - self.rdclass != other.rdclass or self.rdtype != other.rdtype: - return NotImplemented - return self._cmp(other) > 0 - - def __hash__(self): - return hash(self.to_digestable(dns.name.root)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - raise NotImplementedError - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - raise NotImplementedError - - def choose_relativity(self, origin=None, relativize=True): - """Convert any domain names in the rdata to the specified - relativization. - """ - -class GenericRdata(Rdata): - - """Generic Rdata Class - - This class is used for rdata types for which we have no better - implementation. It implements the DNS "unknown RRs" scheme. - """ - - __slots__ = ['data'] - - def __init__(self, rdclass, rdtype, data): - super(GenericRdata, self).__init__(rdclass, rdtype) - self.data = data - - def to_text(self, origin=None, relativize=True, **kw): - return r'\# %d ' % len(self.data) + _hexify(self.data) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - token = tok.get() - if not token.is_identifier() or token.value != r'\#': - raise dns.exception.SyntaxError( - r'generic rdata does not start with \#') - length = tok.get_int() - chunks = [] - while 1: - token = tok.get() - if token.is_eol_or_eof(): - break - chunks.append(token.value.encode()) - hex = b''.join(chunks) - data = binascii.unhexlify(hex) - if len(data) != length: - raise dns.exception.SyntaxError( - 'generic rdata hex data has wrong length') - return cls(rdclass, rdtype, data) - - def to_wire(self, file, compress=None, origin=None): - file.write(self.data) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - return cls(rdclass, rdtype, wire[current: current + rdlen]) - -_rdata_modules = {} -_module_prefix = 'dns.rdtypes' -_import_lock = _threading.Lock() - -def get_rdata_class(rdclass, rdtype): - - def import_module(name): - with _import_lock: - mod = __import__(name) - components = name.split('.') - for comp in components[1:]: - mod = getattr(mod, comp) - return mod - - mod = _rdata_modules.get((rdclass, rdtype)) - rdclass_text = dns.rdataclass.to_text(rdclass) - rdtype_text = dns.rdatatype.to_text(rdtype) - rdtype_text = rdtype_text.replace('-', '_') - if not mod: - mod = _rdata_modules.get((dns.rdatatype.ANY, rdtype)) - if not mod: - try: - mod = import_module('.'.join([_module_prefix, - rdclass_text, rdtype_text])) - _rdata_modules[(rdclass, rdtype)] = mod - except ImportError: - try: - mod = import_module('.'.join([_module_prefix, - 'ANY', rdtype_text])) - _rdata_modules[(dns.rdataclass.ANY, rdtype)] = mod - except ImportError: - mod = None - if mod: - cls = getattr(mod, rdtype_text) - else: - cls = GenericRdata - return cls - - -def from_text(rdclass, rdtype, tok, origin=None, relativize=True): - """Build an rdata object from text format. - - This function attempts to dynamically load a class which - implements the specified rdata class and type. If there is no - class-and-type-specific implementation, the GenericRdata class - is used. - - Once a class is chosen, its from_text() class method is called - with the parameters to this function. - - If *tok* is a ``text``, then a tokenizer is created and the string - is used as its input. - - *rdclass*, an ``int``, the rdataclass. - - *rdtype*, an ``int``, the rdatatype. - - *tok*, a ``dns.tokenizer.Tokenizer`` or a ``text``. - - *origin*, a ``dns.name.Name`` (or ``None``), the - origin to use for relative names. - - *relativize*, a ``bool``. If true, name will be relativized to - the specified origin. - - Returns an instance of the chosen Rdata subclass. - """ - - if isinstance(tok, string_types): - tok = dns.tokenizer.Tokenizer(tok) - cls = get_rdata_class(rdclass, rdtype) - if cls != GenericRdata: - # peek at first token - token = tok.get() - tok.unget(token) - if token.is_identifier() and \ - token.value == r'\#': - # - # Known type using the generic syntax. Extract the - # wire form from the generic syntax, and then run - # from_wire on it. - # - rdata = GenericRdata.from_text(rdclass, rdtype, tok, origin, - relativize) - return from_wire(rdclass, rdtype, rdata.data, 0, len(rdata.data), - origin) - return cls.from_text(rdclass, rdtype, tok, origin, relativize) - - -def from_wire(rdclass, rdtype, wire, current, rdlen, origin=None): - """Build an rdata object from wire format - - This function attempts to dynamically load a class which - implements the specified rdata class and type. If there is no - class-and-type-specific implementation, the GenericRdata class - is used. - - Once a class is chosen, its from_wire() class method is called - with the parameters to this function. - - *rdclass*, an ``int``, the rdataclass. - - *rdtype*, an ``int``, the rdatatype. - - *wire*, a ``binary``, the wire-format message. - - *current*, an ``int``, the offset in wire of the beginning of - the rdata. - - *rdlen*, an ``int``, the length of the wire-format rdata - - *origin*, a ``dns.name.Name`` (or ``None``). If not ``None``, - then names will be relativized to this origin. - - Returns an instance of the chosen Rdata subclass. - """ - - wire = dns.wiredata.maybe_wrap(wire) - cls = get_rdata_class(rdclass, rdtype) - return cls.from_wire(rdclass, rdtype, wire, current, rdlen, origin) - - -class RdatatypeExists(dns.exception.DNSException): - """DNS rdatatype already exists.""" - supp_kwargs = {'rdclass', 'rdtype'} - fmt = "The rdata type with class {rdclass} and rdtype {rdtype} " + \ - "already exists." - - -def register_type(implementation, rdtype, rdtype_text, is_singleton=False, - rdclass=dns.rdataclass.IN): - """Dynamically register a module to handle an rdatatype. - - *implementation*, a module implementing the type in the usual dnspython - way. - - *rdtype*, an ``int``, the rdatatype to register. - - *rdtype_text*, a ``text``, the textual form of the rdatatype. - - *is_singleton*, a ``bool``, indicating if the type is a singleton (i.e. - RRsets of the type can have only one member.) - - *rdclass*, the rdataclass of the type, or ``dns.rdataclass.ANY`` if - it applies to all classes. - """ - - existing_cls = get_rdata_class(rdclass, rdtype) - if existing_cls != GenericRdata: - raise RdatatypeExists(rdclass=rdclass, rdtype=rdtype) - _rdata_modules[(rdclass, rdtype)] = implementation - dns.rdatatype.register_type(rdtype, rdtype_text, is_singleton) diff --git a/lib/dns/rdata.pyi b/lib/dns/rdata.pyi deleted file mode 100644 index 8663955c..00000000 --- a/lib/dns/rdata.pyi +++ /dev/null @@ -1,17 +0,0 @@ -from typing import Dict, Tuple, Any, Optional -from .name import Name -class Rdata: - def __init__(self): - self.address : str - def to_wire(self, file, compress : Optional[Dict[Name,int]], origin : Optional[Name]) -> bytes: - ... - @classmethod - def from_text(cls, rdclass : int, rdtype : int, tok, origin=None, relativize=True): - ... -_rdata_modules : Dict[Tuple[Any,Rdata],Any] - -def from_text(rdclass : int, rdtype : int, tok : Optional[str], origin : Optional[Name] = None, relativize : bool = True): - ... - -def from_wire(rdclass : int, rdtype : int, wire : bytes, current : int, rdlen : int, origin : Optional[Name] = None): - ... diff --git a/lib/dns/rdataclass.py b/lib/dns/rdataclass.py deleted file mode 100644 index b88aa85b..00000000 --- a/lib/dns/rdataclass.py +++ /dev/null @@ -1,122 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Rdata Classes.""" - -import re - -import dns.exception - -RESERVED0 = 0 -IN = 1 -CH = 3 -HS = 4 -NONE = 254 -ANY = 255 - -_by_text = { - 'RESERVED0': RESERVED0, - 'IN': IN, - 'CH': CH, - 'HS': HS, - 'NONE': NONE, - 'ANY': ANY -} - -# We construct the inverse mapping programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mapping not to be true inverse. - -_by_value = {y: x for x, y in _by_text.items()} - -# Now that we've built the inverse map, we can add class aliases to -# the _by_text mapping. - -_by_text.update({ - 'INTERNET': IN, - 'CHAOS': CH, - 'HESIOD': HS -}) - -_metaclasses = { - NONE: True, - ANY: True -} - -_unknown_class_pattern = re.compile('CLASS([0-9]+)$', re.I) - - -class UnknownRdataclass(dns.exception.DNSException): - """A DNS class is unknown.""" - - -def from_text(text): - """Convert text into a DNS rdata class value. - - The input text can be a defined DNS RR class mnemonic or - instance of the DNS generic class syntax. - - For example, "IN" and "CLASS1" will both result in a value of 1. - - Raises ``dns.rdatatype.UnknownRdataclass`` if the class is unknown. - - Raises ``ValueError`` if the rdata class value is not >= 0 and <= 65535. - - Returns an ``int``. - """ - - value = _by_text.get(text.upper()) - if value is None: - match = _unknown_class_pattern.match(text) - if match is None: - raise UnknownRdataclass - value = int(match.group(1)) - if value < 0 or value > 65535: - raise ValueError("class must be between >= 0 and <= 65535") - return value - - -def to_text(value): - """Convert a DNS rdata type value to text. - - If the value has a known mnemonic, it will be used, otherwise the - DNS generic class syntax will be used. - - Raises ``ValueError`` if the rdata class value is not >= 0 and <= 65535. - - Returns a ``str``. - """ - - if value < 0 or value > 65535: - raise ValueError("class must be between >= 0 and <= 65535") - text = _by_value.get(value) - if text is None: - text = 'CLASS' + repr(value) - return text - - -def is_metaclass(rdclass): - """True if the specified class is a metaclass. - - The currently defined metaclasses are ANY and NONE. - - *rdclass* is an ``int``. - """ - - if rdclass in _metaclasses: - return True - return False diff --git a/lib/dns/rdataset.py b/lib/dns/rdataset.py deleted file mode 100644 index f1afe241..00000000 --- a/lib/dns/rdataset.py +++ /dev/null @@ -1,347 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS rdatasets (an rdataset is a set of rdatas of a given type and class)""" - -import random -from io import StringIO -import struct - -import dns.exception -import dns.rdatatype -import dns.rdataclass -import dns.rdata -import dns.set -from ._compat import string_types - -# define SimpleSet here for backwards compatibility -SimpleSet = dns.set.Set - - -class DifferingCovers(dns.exception.DNSException): - """An attempt was made to add a DNS SIG/RRSIG whose covered type - is not the same as that of the other rdatas in the rdataset.""" - - -class IncompatibleTypes(dns.exception.DNSException): - """An attempt was made to add DNS RR data of an incompatible type.""" - - -class Rdataset(dns.set.Set): - - """A DNS rdataset.""" - - __slots__ = ['rdclass', 'rdtype', 'covers', 'ttl'] - - def __init__(self, rdclass, rdtype, covers=dns.rdatatype.NONE, ttl=0): - """Create a new rdataset of the specified class and type. - - *rdclass*, an ``int``, the rdataclass. - - *rdtype*, an ``int``, the rdatatype. - - *covers*, an ``int``, the covered rdatatype. - - *ttl*, an ``int``, the TTL. - """ - - super(Rdataset, self).__init__() - self.rdclass = rdclass - self.rdtype = rdtype - self.covers = covers - self.ttl = ttl - - def _clone(self): - obj = super(Rdataset, self)._clone() - obj.rdclass = self.rdclass - obj.rdtype = self.rdtype - obj.covers = self.covers - obj.ttl = self.ttl - return obj - - def update_ttl(self, ttl): - """Perform TTL minimization. - - Set the TTL of the rdataset to be the lesser of the set's current - TTL or the specified TTL. If the set contains no rdatas, set the TTL - to the specified TTL. - - *ttl*, an ``int``. - """ - - if len(self) == 0: - self.ttl = ttl - elif ttl < self.ttl: - self.ttl = ttl - - def add(self, rd, ttl=None): - """Add the specified rdata to the rdataset. - - If the optional *ttl* parameter is supplied, then - ``self.update_ttl(ttl)`` will be called prior to adding the rdata. - - *rd*, a ``dns.rdata.Rdata``, the rdata - - *ttl*, an ``int``, the TTL. - - Raises ``dns.rdataset.IncompatibleTypes`` if the type and class - do not match the type and class of the rdataset. - - Raises ``dns.rdataset.DifferingCovers`` if the type is a signature - type and the covered type does not match that of the rdataset. - """ - - # - # If we're adding a signature, do some special handling to - # check that the signature covers the same type as the - # other rdatas in this rdataset. If this is the first rdata - # in the set, initialize the covers field. - # - if self.rdclass != rd.rdclass or self.rdtype != rd.rdtype: - raise IncompatibleTypes - if ttl is not None: - self.update_ttl(ttl) - if self.rdtype == dns.rdatatype.RRSIG or \ - self.rdtype == dns.rdatatype.SIG: - covers = rd.covers() - if len(self) == 0 and self.covers == dns.rdatatype.NONE: - self.covers = covers - elif self.covers != covers: - raise DifferingCovers - if dns.rdatatype.is_singleton(rd.rdtype) and len(self) > 0: - self.clear() - super(Rdataset, self).add(rd) - - def union_update(self, other): - self.update_ttl(other.ttl) - super(Rdataset, self).union_update(other) - - def intersection_update(self, other): - self.update_ttl(other.ttl) - super(Rdataset, self).intersection_update(other) - - def update(self, other): - """Add all rdatas in other to self. - - *other*, a ``dns.rdataset.Rdataset``, the rdataset from which - to update. - """ - - self.update_ttl(other.ttl) - super(Rdataset, self).update(other) - - def __repr__(self): - if self.covers == 0: - ctext = '' - else: - ctext = '(' + dns.rdatatype.to_text(self.covers) + ')' - return '<DNS ' + dns.rdataclass.to_text(self.rdclass) + ' ' + \ - dns.rdatatype.to_text(self.rdtype) + ctext + ' rdataset>' - - def __str__(self): - return self.to_text() - - def __eq__(self, other): - if not isinstance(other, Rdataset): - return False - if self.rdclass != other.rdclass or \ - self.rdtype != other.rdtype or \ - self.covers != other.covers: - return False - return super(Rdataset, self).__eq__(other) - - def __ne__(self, other): - return not self.__eq__(other) - - def to_text(self, name=None, origin=None, relativize=True, - override_rdclass=None, **kw): - """Convert the rdataset into DNS master file format. - - See ``dns.name.Name.choose_relativity`` for more information - on how *origin* and *relativize* determine the way names - are emitted. - - Any additional keyword arguments are passed on to the rdata - ``to_text()`` method. - - *name*, a ``dns.name.Name``. If name is not ``None``, emit RRs with - *name* as the owner name. - - *origin*, a ``dns.name.Name`` or ``None``, the origin for relative - names. - - *relativize*, a ``bool``. If ``True``, names will be relativized - to *origin*. - """ - - if name is not None: - name = name.choose_relativity(origin, relativize) - ntext = str(name) - pad = ' ' - else: - ntext = '' - pad = '' - s = StringIO() - if override_rdclass is not None: - rdclass = override_rdclass - else: - rdclass = self.rdclass - if len(self) == 0: - # - # Empty rdatasets are used for the question section, and in - # some dynamic updates, so we don't need to print out the TTL - # (which is meaningless anyway). - # - s.write(u'{}{}{} {}\n'.format(ntext, pad, - dns.rdataclass.to_text(rdclass), - dns.rdatatype.to_text(self.rdtype))) - else: - for rd in self: - s.write(u'%s%s%d %s %s %s\n' % - (ntext, pad, self.ttl, dns.rdataclass.to_text(rdclass), - dns.rdatatype.to_text(self.rdtype), - rd.to_text(origin=origin, relativize=relativize, - **kw))) - # - # We strip off the final \n for the caller's convenience in printing - # - return s.getvalue()[:-1] - - def to_wire(self, name, file, compress=None, origin=None, - override_rdclass=None, want_shuffle=True): - """Convert the rdataset to wire format. - - *name*, a ``dns.name.Name`` is the owner name to use. - - *file* is the file where the name is emitted (typically a - BytesIO file). - - *compress*, a ``dict``, is the compression table to use. If - ``None`` (the default), names will not be compressed. - - *origin* is a ``dns.name.Name`` or ``None``. If the name is - relative and origin is not ``None``, then *origin* will be appended - to it. - - *override_rdclass*, an ``int``, is used as the class instead of the - class of the rdataset. This is useful when rendering rdatasets - associated with dynamic updates. - - *want_shuffle*, a ``bool``. If ``True``, then the order of the - Rdatas within the Rdataset will be shuffled before rendering. - - Returns an ``int``, the number of records emitted. - """ - - if override_rdclass is not None: - rdclass = override_rdclass - want_shuffle = False - else: - rdclass = self.rdclass - file.seek(0, 2) - if len(self) == 0: - name.to_wire(file, compress, origin) - stuff = struct.pack("!HHIH", self.rdtype, rdclass, 0, 0) - file.write(stuff) - return 1 - else: - if want_shuffle: - l = list(self) - random.shuffle(l) - else: - l = self - for rd in l: - name.to_wire(file, compress, origin) - stuff = struct.pack("!HHIH", self.rdtype, rdclass, - self.ttl, 0) - file.write(stuff) - start = file.tell() - rd.to_wire(file, compress, origin) - end = file.tell() - assert end - start < 65536 - file.seek(start - 2) - stuff = struct.pack("!H", end - start) - file.write(stuff) - file.seek(0, 2) - return len(self) - - def match(self, rdclass, rdtype, covers): - """Returns ``True`` if this rdataset matches the specified class, - type, and covers. - """ - if self.rdclass == rdclass and \ - self.rdtype == rdtype and \ - self.covers == covers: - return True - return False - - -def from_text_list(rdclass, rdtype, ttl, text_rdatas): - """Create an rdataset with the specified class, type, and TTL, and with - the specified list of rdatas in text format. - - Returns a ``dns.rdataset.Rdataset`` object. - """ - - if isinstance(rdclass, string_types): - rdclass = dns.rdataclass.from_text(rdclass) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - r = Rdataset(rdclass, rdtype) - r.update_ttl(ttl) - for t in text_rdatas: - rd = dns.rdata.from_text(r.rdclass, r.rdtype, t) - r.add(rd) - return r - - -def from_text(rdclass, rdtype, ttl, *text_rdatas): - """Create an rdataset with the specified class, type, and TTL, and with - the specified rdatas in text format. - - Returns a ``dns.rdataset.Rdataset`` object. - """ - - return from_text_list(rdclass, rdtype, ttl, text_rdatas) - - -def from_rdata_list(ttl, rdatas): - """Create an rdataset with the specified TTL, and with - the specified list of rdata objects. - - Returns a ``dns.rdataset.Rdataset`` object. - """ - - if len(rdatas) == 0: - raise ValueError("rdata list must not be empty") - r = None - for rd in rdatas: - if r is None: - r = Rdataset(rd.rdclass, rd.rdtype) - r.update_ttl(ttl) - r.add(rd) - return r - - -def from_rdata(ttl, *rdatas): - """Create an rdataset with the specified TTL, and with - the specified rdata objects. - - Returns a ``dns.rdataset.Rdataset`` object. - """ - - return from_rdata_list(ttl, rdatas) diff --git a/lib/dns/rdataset.pyi b/lib/dns/rdataset.pyi deleted file mode 100644 index 3efff88a..00000000 --- a/lib/dns/rdataset.pyi +++ /dev/null @@ -1,58 +0,0 @@ -from typing import Optional, Dict, List, Union -from io import BytesIO -from . import exception, name, set, rdatatype, rdata, rdataset - -class DifferingCovers(exception.DNSException): - """An attempt was made to add a DNS SIG/RRSIG whose covered type - is not the same as that of the other rdatas in the rdataset.""" - - -class IncompatibleTypes(exception.DNSException): - """An attempt was made to add DNS RR data of an incompatible type.""" - - -class Rdataset(set.Set): - def __init__(self, rdclass, rdtype, covers=rdatatype.NONE, ttl=0): - self.rdclass : int = rdclass - self.rdtype : int = rdtype - self.covers : int = covers - self.ttl : int = ttl - - def update_ttl(self, ttl : int) -> None: - ... - - def add(self, rd : rdata.Rdata, ttl : Optional[int] =None): - ... - - def union_update(self, other : Rdataset): - ... - - def intersection_update(self, other : Rdataset): - ... - - def update(self, other : Rdataset): - ... - - def to_text(self, name : Optional[name.Name] =None, origin : Optional[name.Name] =None, relativize=True, - override_rdclass : Optional[int] =None, **kw) -> bytes: - ... - - def to_wire(self, name : Optional[name.Name], file : BytesIO, compress : Optional[Dict[name.Name, int]] = None, origin : Optional[name.Name] = None, - override_rdclass : Optional[int] = None, want_shuffle=True) -> int: - ... - - def match(self, rdclass : int, rdtype : int, covers : int) -> bool: - ... - - -def from_text_list(rdclass : Union[int,str], rdtype : Union[int,str], ttl : int, text_rdatas : str) -> rdataset.Rdataset: - ... - -def from_text(rdclass : Union[int,str], rdtype : Union[int,str], ttl : int, *text_rdatas : str) -> rdataset.Rdataset: - ... - -def from_rdata_list(ttl : int, rdatas : List[rdata.Rdata]) -> rdataset.Rdataset: - ... - -def from_rdata(ttl : int, *rdatas : List[rdata.Rdata]) -> rdataset.Rdataset: - ... diff --git a/lib/dns/rdatatype.py b/lib/dns/rdatatype.py deleted file mode 100644 index b247bc9c..00000000 --- a/lib/dns/rdatatype.py +++ /dev/null @@ -1,287 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Rdata Types.""" - -import re - -import dns.exception - -NONE = 0 -A = 1 -NS = 2 -MD = 3 -MF = 4 -CNAME = 5 -SOA = 6 -MB = 7 -MG = 8 -MR = 9 -NULL = 10 -WKS = 11 -PTR = 12 -HINFO = 13 -MINFO = 14 -MX = 15 -TXT = 16 -RP = 17 -AFSDB = 18 -X25 = 19 -ISDN = 20 -RT = 21 -NSAP = 22 -NSAP_PTR = 23 -SIG = 24 -KEY = 25 -PX = 26 -GPOS = 27 -AAAA = 28 -LOC = 29 -NXT = 30 -SRV = 33 -NAPTR = 35 -KX = 36 -CERT = 37 -A6 = 38 -DNAME = 39 -OPT = 41 -APL = 42 -DS = 43 -SSHFP = 44 -IPSECKEY = 45 -RRSIG = 46 -NSEC = 47 -DNSKEY = 48 -DHCID = 49 -NSEC3 = 50 -NSEC3PARAM = 51 -TLSA = 52 -HIP = 55 -CDS = 59 -CDNSKEY = 60 -OPENPGPKEY = 61 -CSYNC = 62 -SPF = 99 -UNSPEC = 103 -EUI48 = 108 -EUI64 = 109 -TKEY = 249 -TSIG = 250 -IXFR = 251 -AXFR = 252 -MAILB = 253 -MAILA = 254 -ANY = 255 -URI = 256 -CAA = 257 -AVC = 258 -TA = 32768 -DLV = 32769 - -_by_text = { - 'NONE': NONE, - 'A': A, - 'NS': NS, - 'MD': MD, - 'MF': MF, - 'CNAME': CNAME, - 'SOA': SOA, - 'MB': MB, - 'MG': MG, - 'MR': MR, - 'NULL': NULL, - 'WKS': WKS, - 'PTR': PTR, - 'HINFO': HINFO, - 'MINFO': MINFO, - 'MX': MX, - 'TXT': TXT, - 'RP': RP, - 'AFSDB': AFSDB, - 'X25': X25, - 'ISDN': ISDN, - 'RT': RT, - 'NSAP': NSAP, - 'NSAP-PTR': NSAP_PTR, - 'SIG': SIG, - 'KEY': KEY, - 'PX': PX, - 'GPOS': GPOS, - 'AAAA': AAAA, - 'LOC': LOC, - 'NXT': NXT, - 'SRV': SRV, - 'NAPTR': NAPTR, - 'KX': KX, - 'CERT': CERT, - 'A6': A6, - 'DNAME': DNAME, - 'OPT': OPT, - 'APL': APL, - 'DS': DS, - 'SSHFP': SSHFP, - 'IPSECKEY': IPSECKEY, - 'RRSIG': RRSIG, - 'NSEC': NSEC, - 'DNSKEY': DNSKEY, - 'DHCID': DHCID, - 'NSEC3': NSEC3, - 'NSEC3PARAM': NSEC3PARAM, - 'TLSA': TLSA, - 'HIP': HIP, - 'CDS': CDS, - 'CDNSKEY': CDNSKEY, - 'OPENPGPKEY': OPENPGPKEY, - 'CSYNC': CSYNC, - 'SPF': SPF, - 'UNSPEC': UNSPEC, - 'EUI48': EUI48, - 'EUI64': EUI64, - 'TKEY': TKEY, - 'TSIG': TSIG, - 'IXFR': IXFR, - 'AXFR': AXFR, - 'MAILB': MAILB, - 'MAILA': MAILA, - 'ANY': ANY, - 'URI': URI, - 'CAA': CAA, - 'AVC': AVC, - 'TA': TA, - 'DLV': DLV, -} - -# We construct the inverse mapping programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mapping not to be true inverse. - -_by_value = {y: x for x, y in _by_text.items()} - -_metatypes = { - OPT: True -} - -_singletons = { - SOA: True, - NXT: True, - DNAME: True, - NSEC: True, - CNAME: True, -} - -_unknown_type_pattern = re.compile('TYPE([0-9]+)$', re.I) - - -class UnknownRdatatype(dns.exception.DNSException): - """DNS resource record type is unknown.""" - - -def from_text(text): - """Convert text into a DNS rdata type value. - - The input text can be a defined DNS RR type mnemonic or - instance of the DNS generic type syntax. - - For example, "NS" and "TYPE2" will both result in a value of 2. - - Raises ``dns.rdatatype.UnknownRdatatype`` if the type is unknown. - - Raises ``ValueError`` if the rdata type value is not >= 0 and <= 65535. - - Returns an ``int``. - """ - - value = _by_text.get(text.upper()) - if value is None: - match = _unknown_type_pattern.match(text) - if match is None: - raise UnknownRdatatype - value = int(match.group(1)) - if value < 0 or value > 65535: - raise ValueError("type must be between >= 0 and <= 65535") - return value - - -def to_text(value): - """Convert a DNS rdata type value to text. - - If the value has a known mnemonic, it will be used, otherwise the - DNS generic type syntax will be used. - - Raises ``ValueError`` if the rdata type value is not >= 0 and <= 65535. - - Returns a ``str``. - """ - - if value < 0 or value > 65535: - raise ValueError("type must be between >= 0 and <= 65535") - text = _by_value.get(value) - if text is None: - text = 'TYPE' + repr(value) - return text - - -def is_metatype(rdtype): - """True if the specified type is a metatype. - - *rdtype* is an ``int``. - - The currently defined metatypes are TKEY, TSIG, IXFR, AXFR, MAILA, - MAILB, ANY, and OPT. - - Returns a ``bool``. - """ - - if rdtype >= TKEY and rdtype <= ANY or rdtype in _metatypes: - return True - return False - - -def is_singleton(rdtype): - """Is the specified type a singleton type? - - Singleton types can only have a single rdata in an rdataset, or a single - RR in an RRset. - - The currently defined singleton types are CNAME, DNAME, NSEC, NXT, and - SOA. - - *rdtype* is an ``int``. - - Returns a ``bool``. - """ - - if rdtype in _singletons: - return True - return False - - -def register_type(rdtype, rdtype_text, is_singleton=False): # pylint: disable=redefined-outer-name - """Dynamically register an rdatatype. - - *rdtype*, an ``int``, the rdatatype to register. - - *rdtype_text*, a ``text``, the textual form of the rdatatype. - - *is_singleton*, a ``bool``, indicating if the type is a singleton (i.e. - RRsets of the type can have only one member.) - """ - - _by_text[rdtype_text] = rdtype - _by_value[rdtype] = rdtype_text - if is_singleton: - _singletons[rdtype] = True diff --git a/lib/dns/rdtypes/ANY/AFSDB.py b/lib/dns/rdtypes/ANY/AFSDB.py deleted file mode 100644 index c6a700cf..00000000 --- a/lib/dns/rdtypes/ANY/AFSDB.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.mxbase - - -class AFSDB(dns.rdtypes.mxbase.UncompressedDowncasingMX): - - """AFSDB record - - @ivar subtype: the subtype value - @type subtype: int - @ivar hostname: the hostname name - @type hostname: dns.name.Name object""" - - # Use the property mechanism to make "subtype" an alias for the - # "preference" attribute, and "hostname" an alias for the "exchange" - # attribute. - # - # This lets us inherit the UncompressedMX implementation but lets - # the caller use appropriate attribute names for the rdata type. - # - # We probably lose some performance vs. a cut-and-paste - # implementation, but this way we don't copy code, and that's - # good. - - def get_subtype(self): - return self.preference - - def set_subtype(self, subtype): - self.preference = subtype - - subtype = property(get_subtype, set_subtype) - - def get_hostname(self): - return self.exchange - - def set_hostname(self, hostname): - self.exchange = hostname - - hostname = property(get_hostname, set_hostname) diff --git a/lib/dns/rdtypes/ANY/AVC.py b/lib/dns/rdtypes/ANY/AVC.py deleted file mode 100644 index 7f340b39..00000000 --- a/lib/dns/rdtypes/ANY/AVC.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2016 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.txtbase - - -class AVC(dns.rdtypes.txtbase.TXTBase): - - """AVC record - - @see: U{http://www.iana.org/assignments/dns-parameters/AVC/avc-completed-template}""" diff --git a/lib/dns/rdtypes/ANY/CAA.py b/lib/dns/rdtypes/ANY/CAA.py deleted file mode 100644 index 0acf201a..00000000 --- a/lib/dns/rdtypes/ANY/CAA.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.tokenizer - - -class CAA(dns.rdata.Rdata): - - """CAA (Certification Authority Authorization) record - - @ivar flags: the flags - @type flags: int - @ivar tag: the tag - @type tag: string - @ivar value: the value - @type value: string - @see: RFC 6844""" - - __slots__ = ['flags', 'tag', 'value'] - - def __init__(self, rdclass, rdtype, flags, tag, value): - super(CAA, self).__init__(rdclass, rdtype) - self.flags = flags - self.tag = tag - self.value = value - - def to_text(self, origin=None, relativize=True, **kw): - return '%u %s "%s"' % (self.flags, - dns.rdata._escapify(self.tag), - dns.rdata._escapify(self.value)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - flags = tok.get_uint8() - tag = tok.get_string().encode() - if len(tag) > 255: - raise dns.exception.SyntaxError("tag too long") - if not tag.isalnum(): - raise dns.exception.SyntaxError("tag is not alphanumeric") - value = tok.get_string().encode() - return cls(rdclass, rdtype, flags, tag, value) - - def to_wire(self, file, compress=None, origin=None): - file.write(struct.pack('!B', self.flags)) - l = len(self.tag) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.tag) - file.write(self.value) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (flags, l) = struct.unpack('!BB', wire[current: current + 2]) - current += 2 - tag = wire[current: current + l] - value = wire[current + l:current + rdlen - 2] - return cls(rdclass, rdtype, flags, tag, value) diff --git a/lib/dns/rdtypes/ANY/CDNSKEY.py b/lib/dns/rdtypes/ANY/CDNSKEY.py deleted file mode 100644 index 653ae1be..00000000 --- a/lib/dns/rdtypes/ANY/CDNSKEY.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.dnskeybase -from dns.rdtypes.dnskeybase import flags_to_text_set, flags_from_text_set - - -__all__ = ['flags_to_text_set', 'flags_from_text_set'] - - -class CDNSKEY(dns.rdtypes.dnskeybase.DNSKEYBase): - - """CDNSKEY record""" diff --git a/lib/dns/rdtypes/ANY/CDS.py b/lib/dns/rdtypes/ANY/CDS.py deleted file mode 100644 index a63041dd..00000000 --- a/lib/dns/rdtypes/ANY/CDS.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.dsbase - - -class CDS(dns.rdtypes.dsbase.DSBase): - - """CDS record""" diff --git a/lib/dns/rdtypes/ANY/CERT.py b/lib/dns/rdtypes/ANY/CERT.py deleted file mode 100644 index eea27b52..00000000 --- a/lib/dns/rdtypes/ANY/CERT.py +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct -import base64 - -import dns.exception -import dns.dnssec -import dns.rdata -import dns.tokenizer - -_ctype_by_value = { - 1: 'PKIX', - 2: 'SPKI', - 3: 'PGP', - 253: 'URI', - 254: 'OID', -} - -_ctype_by_name = { - 'PKIX': 1, - 'SPKI': 2, - 'PGP': 3, - 'URI': 253, - 'OID': 254, -} - - -def _ctype_from_text(what): - v = _ctype_by_name.get(what) - if v is not None: - return v - return int(what) - - -def _ctype_to_text(what): - v = _ctype_by_value.get(what) - if v is not None: - return v - return str(what) - - -class CERT(dns.rdata.Rdata): - - """CERT record - - @ivar certificate_type: certificate type - @type certificate_type: int - @ivar key_tag: key tag - @type key_tag: int - @ivar algorithm: algorithm - @type algorithm: int - @ivar certificate: the certificate or CRL - @type certificate: string - @see: RFC 2538""" - - __slots__ = ['certificate_type', 'key_tag', 'algorithm', 'certificate'] - - def __init__(self, rdclass, rdtype, certificate_type, key_tag, algorithm, - certificate): - super(CERT, self).__init__(rdclass, rdtype) - self.certificate_type = certificate_type - self.key_tag = key_tag - self.algorithm = algorithm - self.certificate = certificate - - def to_text(self, origin=None, relativize=True, **kw): - certificate_type = _ctype_to_text(self.certificate_type) - return "%s %d %s %s" % (certificate_type, self.key_tag, - dns.dnssec.algorithm_to_text(self.algorithm), - dns.rdata._base64ify(self.certificate)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - certificate_type = _ctype_from_text(tok.get_string()) - key_tag = tok.get_uint16() - algorithm = dns.dnssec.algorithm_from_text(tok.get_string()) - if algorithm < 0 or algorithm > 255: - raise dns.exception.SyntaxError("bad algorithm type") - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - b64 = b''.join(chunks) - certificate = base64.b64decode(b64) - return cls(rdclass, rdtype, certificate_type, key_tag, - algorithm, certificate) - - def to_wire(self, file, compress=None, origin=None): - prefix = struct.pack("!HHB", self.certificate_type, self.key_tag, - self.algorithm) - file.write(prefix) - file.write(self.certificate) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - prefix = wire[current: current + 5].unwrap() - current += 5 - rdlen -= 5 - if rdlen < 0: - raise dns.exception.FormError - (certificate_type, key_tag, algorithm) = struct.unpack("!HHB", prefix) - certificate = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, certificate_type, key_tag, algorithm, - certificate) diff --git a/lib/dns/rdtypes/ANY/CNAME.py b/lib/dns/rdtypes/ANY/CNAME.py deleted file mode 100644 index 11d42aa7..00000000 --- a/lib/dns/rdtypes/ANY/CNAME.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.nsbase - - -class CNAME(dns.rdtypes.nsbase.NSBase): - - """CNAME record - - Note: although CNAME is officially a singleton type, dnspython allows - non-singleton CNAME rdatasets because such sets have been commonly - used by BIND and other nameservers for load balancing.""" diff --git a/lib/dns/rdtypes/ANY/CSYNC.py b/lib/dns/rdtypes/ANY/CSYNC.py deleted file mode 100644 index 06292fb2..00000000 --- a/lib/dns/rdtypes/ANY/CSYNC.py +++ /dev/null @@ -1,126 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2007, 2009-2011, 2016 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.rdatatype -import dns.name -from dns._compat import xrange - -class CSYNC(dns.rdata.Rdata): - - """CSYNC record - - @ivar serial: the SOA serial number - @type serial: int - @ivar flags: the CSYNC flags - @type flags: int - @ivar windows: the windowed bitmap list - @type windows: list of (window number, string) tuples""" - - __slots__ = ['serial', 'flags', 'windows'] - - def __init__(self, rdclass, rdtype, serial, flags, windows): - super(CSYNC, self).__init__(rdclass, rdtype) - self.serial = serial - self.flags = flags - self.windows = windows - - def to_text(self, origin=None, relativize=True, **kw): - text = '' - for (window, bitmap) in self.windows: - bits = [] - for i in xrange(0, len(bitmap)): - byte = bitmap[i] - for j in xrange(0, 8): - if byte & (0x80 >> j): - bits.append(dns.rdatatype.to_text(window * 256 + - i * 8 + j)) - text += (' ' + ' '.join(bits)) - return '%d %d%s' % (self.serial, self.flags, text) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - serial = tok.get_uint32() - flags = tok.get_uint16() - rdtypes = [] - while 1: - token = tok.get().unescape() - if token.is_eol_or_eof(): - break - nrdtype = dns.rdatatype.from_text(token.value) - if nrdtype == 0: - raise dns.exception.SyntaxError("CSYNC with bit 0") - if nrdtype > 65535: - raise dns.exception.SyntaxError("CSYNC with bit > 65535") - rdtypes.append(nrdtype) - rdtypes.sort() - window = 0 - octets = 0 - prior_rdtype = 0 - bitmap = bytearray(b'\0' * 32) - windows = [] - for nrdtype in rdtypes: - if nrdtype == prior_rdtype: - continue - prior_rdtype = nrdtype - new_window = nrdtype // 256 - if new_window != window: - windows.append((window, bitmap[0:octets])) - bitmap = bytearray(b'\0' * 32) - window = new_window - offset = nrdtype % 256 - byte = offset // 8 - bit = offset % 8 - octets = byte + 1 - bitmap[byte] = bitmap[byte] | (0x80 >> bit) - - windows.append((window, bitmap[0:octets])) - return cls(rdclass, rdtype, serial, flags, windows) - - def to_wire(self, file, compress=None, origin=None): - file.write(struct.pack('!IH', self.serial, self.flags)) - for (window, bitmap) in self.windows: - file.write(struct.pack('!BB', window, len(bitmap))) - file.write(bitmap) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - if rdlen < 6: - raise dns.exception.FormError("CSYNC too short") - (serial, flags) = struct.unpack("!IH", wire[current: current + 6]) - current += 6 - rdlen -= 6 - windows = [] - while rdlen > 0: - if rdlen < 3: - raise dns.exception.FormError("CSYNC too short") - window = wire[current] - octets = wire[current + 1] - if octets == 0 or octets > 32: - raise dns.exception.FormError("bad CSYNC octets") - current += 2 - rdlen -= 2 - if rdlen < octets: - raise dns.exception.FormError("bad CSYNC bitmap length") - bitmap = bytearray(wire[current: current + octets].unwrap()) - current += octets - rdlen -= octets - windows.append((window, bitmap)) - return cls(rdclass, rdtype, serial, flags, windows) diff --git a/lib/dns/rdtypes/ANY/DLV.py b/lib/dns/rdtypes/ANY/DLV.py deleted file mode 100644 index 16352125..00000000 --- a/lib/dns/rdtypes/ANY/DLV.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.dsbase - - -class DLV(dns.rdtypes.dsbase.DSBase): - - """DLV record""" diff --git a/lib/dns/rdtypes/ANY/DNAME.py b/lib/dns/rdtypes/ANY/DNAME.py deleted file mode 100644 index 2499283c..00000000 --- a/lib/dns/rdtypes/ANY/DNAME.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.nsbase - - -class DNAME(dns.rdtypes.nsbase.UncompressedNS): - - """DNAME record""" - - def to_digestable(self, origin=None): - return self.target.to_digestable(origin) diff --git a/lib/dns/rdtypes/ANY/DNSKEY.py b/lib/dns/rdtypes/ANY/DNSKEY.py deleted file mode 100644 index e36f7bc5..00000000 --- a/lib/dns/rdtypes/ANY/DNSKEY.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.dnskeybase -from dns.rdtypes.dnskeybase import flags_to_text_set, flags_from_text_set - - -__all__ = ['flags_to_text_set', 'flags_from_text_set'] - - -class DNSKEY(dns.rdtypes.dnskeybase.DNSKEYBase): - - """DNSKEY record""" diff --git a/lib/dns/rdtypes/ANY/DS.py b/lib/dns/rdtypes/ANY/DS.py deleted file mode 100644 index 7d457b22..00000000 --- a/lib/dns/rdtypes/ANY/DS.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.dsbase - - -class DS(dns.rdtypes.dsbase.DSBase): - - """DS record""" diff --git a/lib/dns/rdtypes/ANY/EUI48.py b/lib/dns/rdtypes/ANY/EUI48.py deleted file mode 100644 index aa260e20..00000000 --- a/lib/dns/rdtypes/ANY/EUI48.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright (C) 2015 Red Hat, Inc. -# Author: Petr Spacek <pspacek@redhat.com> -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.euibase - - -class EUI48(dns.rdtypes.euibase.EUIBase): - - """EUI48 record - - @ivar fingerprint: 48-bit Extended Unique Identifier (EUI-48) - @type fingerprint: string - @see: rfc7043.txt""" - - byte_len = 6 # 0123456789ab (in hex) - text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab diff --git a/lib/dns/rdtypes/ANY/EUI64.py b/lib/dns/rdtypes/ANY/EUI64.py deleted file mode 100644 index 5eba350d..00000000 --- a/lib/dns/rdtypes/ANY/EUI64.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright (C) 2015 Red Hat, Inc. -# Author: Petr Spacek <pspacek@redhat.com> -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.euibase - - -class EUI64(dns.rdtypes.euibase.EUIBase): - - """EUI64 record - - @ivar fingerprint: 64-bit Extended Unique Identifier (EUI-64) - @type fingerprint: string - @see: rfc7043.txt""" - - byte_len = 8 # 0123456789abcdef (in hex) - text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab-cd-ef diff --git a/lib/dns/rdtypes/ANY/GPOS.py b/lib/dns/rdtypes/ANY/GPOS.py deleted file mode 100644 index 422822f0..00000000 --- a/lib/dns/rdtypes/ANY/GPOS.py +++ /dev/null @@ -1,162 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.tokenizer -from dns._compat import long, text_type - - -def _validate_float_string(what): - if what[0] == b'-'[0] or what[0] == b'+'[0]: - what = what[1:] - if what.isdigit(): - return - (left, right) = what.split(b'.') - if left == b'' and right == b'': - raise dns.exception.FormError - if not left == b'' and not left.decode().isdigit(): - raise dns.exception.FormError - if not right == b'' and not right.decode().isdigit(): - raise dns.exception.FormError - - -def _sanitize(value): - if isinstance(value, text_type): - return value.encode() - return value - - -class GPOS(dns.rdata.Rdata): - - """GPOS record - - @ivar latitude: latitude - @type latitude: string - @ivar longitude: longitude - @type longitude: string - @ivar altitude: altitude - @type altitude: string - @see: RFC 1712""" - - __slots__ = ['latitude', 'longitude', 'altitude'] - - def __init__(self, rdclass, rdtype, latitude, longitude, altitude): - super(GPOS, self).__init__(rdclass, rdtype) - if isinstance(latitude, float) or \ - isinstance(latitude, int) or \ - isinstance(latitude, long): - latitude = str(latitude) - if isinstance(longitude, float) or \ - isinstance(longitude, int) or \ - isinstance(longitude, long): - longitude = str(longitude) - if isinstance(altitude, float) or \ - isinstance(altitude, int) or \ - isinstance(altitude, long): - altitude = str(altitude) - latitude = _sanitize(latitude) - longitude = _sanitize(longitude) - altitude = _sanitize(altitude) - _validate_float_string(latitude) - _validate_float_string(longitude) - _validate_float_string(altitude) - self.latitude = latitude - self.longitude = longitude - self.altitude = altitude - - def to_text(self, origin=None, relativize=True, **kw): - return '{} {} {}'.format(self.latitude.decode(), - self.longitude.decode(), - self.altitude.decode()) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - latitude = tok.get_string() - longitude = tok.get_string() - altitude = tok.get_string() - tok.get_eol() - return cls(rdclass, rdtype, latitude, longitude, altitude) - - def to_wire(self, file, compress=None, origin=None): - l = len(self.latitude) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.latitude) - l = len(self.longitude) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.longitude) - l = len(self.altitude) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.altitude) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - l = wire[current] - current += 1 - rdlen -= 1 - if l > rdlen: - raise dns.exception.FormError - latitude = wire[current: current + l].unwrap() - current += l - rdlen -= l - l = wire[current] - current += 1 - rdlen -= 1 - if l > rdlen: - raise dns.exception.FormError - longitude = wire[current: current + l].unwrap() - current += l - rdlen -= l - l = wire[current] - current += 1 - rdlen -= 1 - if l != rdlen: - raise dns.exception.FormError - altitude = wire[current: current + l].unwrap() - return cls(rdclass, rdtype, latitude, longitude, altitude) - - def _get_float_latitude(self): - return float(self.latitude) - - def _set_float_latitude(self, value): - self.latitude = str(value) - - float_latitude = property(_get_float_latitude, _set_float_latitude, - doc="latitude as a floating point value") - - def _get_float_longitude(self): - return float(self.longitude) - - def _set_float_longitude(self, value): - self.longitude = str(value) - - float_longitude = property(_get_float_longitude, _set_float_longitude, - doc="longitude as a floating point value") - - def _get_float_altitude(self): - return float(self.altitude) - - def _set_float_altitude(self, value): - self.altitude = str(value) - - float_altitude = property(_get_float_altitude, _set_float_altitude, - doc="altitude as a floating point value") diff --git a/lib/dns/rdtypes/ANY/HINFO.py b/lib/dns/rdtypes/ANY/HINFO.py deleted file mode 100644 index e4e0b34a..00000000 --- a/lib/dns/rdtypes/ANY/HINFO.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.tokenizer -from dns._compat import text_type - - -class HINFO(dns.rdata.Rdata): - - """HINFO record - - @ivar cpu: the CPU type - @type cpu: string - @ivar os: the OS type - @type os: string - @see: RFC 1035""" - - __slots__ = ['cpu', 'os'] - - def __init__(self, rdclass, rdtype, cpu, os): - super(HINFO, self).__init__(rdclass, rdtype) - if isinstance(cpu, text_type): - self.cpu = cpu.encode() - else: - self.cpu = cpu - if isinstance(os, text_type): - self.os = os.encode() - else: - self.os = os - - def to_text(self, origin=None, relativize=True, **kw): - return '"{}" "{}"'.format(dns.rdata._escapify(self.cpu), - dns.rdata._escapify(self.os)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - cpu = tok.get_string() - os = tok.get_string() - tok.get_eol() - return cls(rdclass, rdtype, cpu, os) - - def to_wire(self, file, compress=None, origin=None): - l = len(self.cpu) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.cpu) - l = len(self.os) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.os) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - l = wire[current] - current += 1 - rdlen -= 1 - if l > rdlen: - raise dns.exception.FormError - cpu = wire[current:current + l].unwrap() - current += l - rdlen -= l - l = wire[current] - current += 1 - rdlen -= 1 - if l != rdlen: - raise dns.exception.FormError - os = wire[current: current + l].unwrap() - return cls(rdclass, rdtype, cpu, os) diff --git a/lib/dns/rdtypes/ANY/HIP.py b/lib/dns/rdtypes/ANY/HIP.py deleted file mode 100644 index 7c876b2d..00000000 --- a/lib/dns/rdtypes/ANY/HIP.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2010, 2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct -import base64 -import binascii - -import dns.exception -import dns.rdata -import dns.rdatatype - - -class HIP(dns.rdata.Rdata): - - """HIP record - - @ivar hit: the host identity tag - @type hit: string - @ivar algorithm: the public key cryptographic algorithm - @type algorithm: int - @ivar key: the public key - @type key: string - @ivar servers: the rendezvous servers - @type servers: list of dns.name.Name objects - @see: RFC 5205""" - - __slots__ = ['hit', 'algorithm', 'key', 'servers'] - - def __init__(self, rdclass, rdtype, hit, algorithm, key, servers): - super(HIP, self).__init__(rdclass, rdtype) - self.hit = hit - self.algorithm = algorithm - self.key = key - self.servers = servers - - def to_text(self, origin=None, relativize=True, **kw): - hit = binascii.hexlify(self.hit).decode() - key = base64.b64encode(self.key).replace(b'\n', b'').decode() - text = u'' - servers = [] - for server in self.servers: - servers.append(server.choose_relativity(origin, relativize)) - if len(servers) > 0: - text += (u' ' + u' '.join((x.to_unicode() for x in servers))) - return u'%u %s %s%s' % (self.algorithm, hit, key, text) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - algorithm = tok.get_uint8() - hit = binascii.unhexlify(tok.get_string().encode()) - if len(hit) > 255: - raise dns.exception.SyntaxError("HIT too long") - key = base64.b64decode(tok.get_string().encode()) - servers = [] - while 1: - token = tok.get() - if token.is_eol_or_eof(): - break - server = dns.name.from_text(token.value, origin) - server.choose_relativity(origin, relativize) - servers.append(server) - return cls(rdclass, rdtype, hit, algorithm, key, servers) - - def to_wire(self, file, compress=None, origin=None): - lh = len(self.hit) - lk = len(self.key) - file.write(struct.pack("!BBH", lh, self.algorithm, lk)) - file.write(self.hit) - file.write(self.key) - for server in self.servers: - server.to_wire(file, None, origin) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (lh, algorithm, lk) = struct.unpack('!BBH', - wire[current: current + 4]) - current += 4 - rdlen -= 4 - hit = wire[current: current + lh].unwrap() - current += lh - rdlen -= lh - key = wire[current: current + lk].unwrap() - current += lk - rdlen -= lk - servers = [] - while rdlen > 0: - (server, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - current += cused - rdlen -= cused - if origin is not None: - server = server.relativize(origin) - servers.append(server) - return cls(rdclass, rdtype, hit, algorithm, key, servers) - - def choose_relativity(self, origin=None, relativize=True): - servers = [] - for server in self.servers: - server = server.choose_relativity(origin, relativize) - servers.append(server) - self.servers = servers diff --git a/lib/dns/rdtypes/ANY/ISDN.py b/lib/dns/rdtypes/ANY/ISDN.py deleted file mode 100644 index f5f5f8b9..00000000 --- a/lib/dns/rdtypes/ANY/ISDN.py +++ /dev/null @@ -1,99 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.tokenizer -from dns._compat import text_type - - -class ISDN(dns.rdata.Rdata): - - """ISDN record - - @ivar address: the ISDN address - @type address: string - @ivar subaddress: the ISDN subaddress (or '' if not present) - @type subaddress: string - @see: RFC 1183""" - - __slots__ = ['address', 'subaddress'] - - def __init__(self, rdclass, rdtype, address, subaddress): - super(ISDN, self).__init__(rdclass, rdtype) - if isinstance(address, text_type): - self.address = address.encode() - else: - self.address = address - if isinstance(address, text_type): - self.subaddress = subaddress.encode() - else: - self.subaddress = subaddress - - def to_text(self, origin=None, relativize=True, **kw): - if self.subaddress: - return '"{}" "{}"'.format(dns.rdata._escapify(self.address), - dns.rdata._escapify(self.subaddress)) - else: - return '"%s"' % dns.rdata._escapify(self.address) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - address = tok.get_string() - t = tok.get() - if not t.is_eol_or_eof(): - tok.unget(t) - subaddress = tok.get_string() - else: - tok.unget(t) - subaddress = '' - tok.get_eol() - return cls(rdclass, rdtype, address, subaddress) - - def to_wire(self, file, compress=None, origin=None): - l = len(self.address) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.address) - l = len(self.subaddress) - if l > 0: - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.subaddress) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - l = wire[current] - current += 1 - rdlen -= 1 - if l > rdlen: - raise dns.exception.FormError - address = wire[current: current + l].unwrap() - current += l - rdlen -= l - if rdlen > 0: - l = wire[current] - current += 1 - rdlen -= 1 - if l != rdlen: - raise dns.exception.FormError - subaddress = wire[current: current + l].unwrap() - else: - subaddress = '' - return cls(rdclass, rdtype, address, subaddress) diff --git a/lib/dns/rdtypes/ANY/LOC.py b/lib/dns/rdtypes/ANY/LOC.py deleted file mode 100644 index da9bb03a..00000000 --- a/lib/dns/rdtypes/ANY/LOC.py +++ /dev/null @@ -1,327 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import division - -import struct - -import dns.exception -import dns.rdata -from dns._compat import long, xrange, round_py2_compat - - -_pows = tuple(long(10**i) for i in range(0, 11)) - -# default values are in centimeters -_default_size = 100.0 -_default_hprec = 1000000.0 -_default_vprec = 1000.0 - - -def _exponent_of(what, desc): - if what == 0: - return 0 - exp = None - for i in xrange(len(_pows)): - if what // _pows[i] == long(0): - exp = i - 1 - break - if exp is None or exp < 0: - raise dns.exception.SyntaxError("%s value out of bounds" % desc) - return exp - - -def _float_to_tuple(what): - if what < 0: - sign = -1 - what *= -1 - else: - sign = 1 - what = round_py2_compat(what * 3600000) - degrees = int(what // 3600000) - what -= degrees * 3600000 - minutes = int(what // 60000) - what -= minutes * 60000 - seconds = int(what // 1000) - what -= int(seconds * 1000) - what = int(what) - return (degrees, minutes, seconds, what, sign) - - -def _tuple_to_float(what): - value = float(what[0]) - value += float(what[1]) / 60.0 - value += float(what[2]) / 3600.0 - value += float(what[3]) / 3600000.0 - return float(what[4]) * value - - -def _encode_size(what, desc): - what = long(what) - exponent = _exponent_of(what, desc) & 0xF - base = what // pow(10, exponent) & 0xF - return base * 16 + exponent - - -def _decode_size(what, desc): - exponent = what & 0x0F - if exponent > 9: - raise dns.exception.SyntaxError("bad %s exponent" % desc) - base = (what & 0xF0) >> 4 - if base > 9: - raise dns.exception.SyntaxError("bad %s base" % desc) - return long(base) * pow(10, exponent) - - -class LOC(dns.rdata.Rdata): - - """LOC record - - @ivar latitude: latitude - @type latitude: (int, int, int, int, sign) tuple specifying the degrees, minutes, - seconds, milliseconds, and sign of the coordinate. - @ivar longitude: longitude - @type longitude: (int, int, int, int, sign) tuple specifying the degrees, - minutes, seconds, milliseconds, and sign of the coordinate. - @ivar altitude: altitude - @type altitude: float - @ivar size: size of the sphere - @type size: float - @ivar horizontal_precision: horizontal precision - @type horizontal_precision: float - @ivar vertical_precision: vertical precision - @type vertical_precision: float - @see: RFC 1876""" - - __slots__ = ['latitude', 'longitude', 'altitude', 'size', - 'horizontal_precision', 'vertical_precision'] - - def __init__(self, rdclass, rdtype, latitude, longitude, altitude, - size=_default_size, hprec=_default_hprec, - vprec=_default_vprec): - """Initialize a LOC record instance. - - The parameters I{latitude} and I{longitude} may be either a 4-tuple - of integers specifying (degrees, minutes, seconds, milliseconds), - or they may be floating point values specifying the number of - degrees. The other parameters are floats. Size, horizontal precision, - and vertical precision are specified in centimeters.""" - - super(LOC, self).__init__(rdclass, rdtype) - if isinstance(latitude, int) or isinstance(latitude, long): - latitude = float(latitude) - if isinstance(latitude, float): - latitude = _float_to_tuple(latitude) - self.latitude = latitude - if isinstance(longitude, int) or isinstance(longitude, long): - longitude = float(longitude) - if isinstance(longitude, float): - longitude = _float_to_tuple(longitude) - self.longitude = longitude - self.altitude = float(altitude) - self.size = float(size) - self.horizontal_precision = float(hprec) - self.vertical_precision = float(vprec) - - def to_text(self, origin=None, relativize=True, **kw): - if self.latitude[4] > 0: - lat_hemisphere = 'N' - else: - lat_hemisphere = 'S' - if self.longitude[4] > 0: - long_hemisphere = 'E' - else: - long_hemisphere = 'W' - text = "%d %d %d.%03d %s %d %d %d.%03d %s %0.2fm" % ( - self.latitude[0], self.latitude[1], - self.latitude[2], self.latitude[3], lat_hemisphere, - self.longitude[0], self.longitude[1], self.longitude[2], - self.longitude[3], long_hemisphere, - self.altitude / 100.0 - ) - - # do not print default values - if self.size != _default_size or \ - self.horizontal_precision != _default_hprec or \ - self.vertical_precision != _default_vprec: - text += " {:0.2f}m {:0.2f}m {:0.2f}m".format( - self.size / 100.0, self.horizontal_precision / 100.0, - self.vertical_precision / 100.0 - ) - return text - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - latitude = [0, 0, 0, 0, 1] - longitude = [0, 0, 0, 0, 1] - size = _default_size - hprec = _default_hprec - vprec = _default_vprec - - latitude[0] = tok.get_int() - t = tok.get_string() - if t.isdigit(): - latitude[1] = int(t) - t = tok.get_string() - if '.' in t: - (seconds, milliseconds) = t.split('.') - if not seconds.isdigit(): - raise dns.exception.SyntaxError( - 'bad latitude seconds value') - latitude[2] = int(seconds) - if latitude[2] >= 60: - raise dns.exception.SyntaxError('latitude seconds >= 60') - l = len(milliseconds) - if l == 0 or l > 3 or not milliseconds.isdigit(): - raise dns.exception.SyntaxError( - 'bad latitude milliseconds value') - if l == 1: - m = 100 - elif l == 2: - m = 10 - else: - m = 1 - latitude[3] = m * int(milliseconds) - t = tok.get_string() - elif t.isdigit(): - latitude[2] = int(t) - t = tok.get_string() - if t == 'S': - latitude[4] = -1 - elif t != 'N': - raise dns.exception.SyntaxError('bad latitude hemisphere value') - - longitude[0] = tok.get_int() - t = tok.get_string() - if t.isdigit(): - longitude[1] = int(t) - t = tok.get_string() - if '.' in t: - (seconds, milliseconds) = t.split('.') - if not seconds.isdigit(): - raise dns.exception.SyntaxError( - 'bad longitude seconds value') - longitude[2] = int(seconds) - if longitude[2] >= 60: - raise dns.exception.SyntaxError('longitude seconds >= 60') - l = len(milliseconds) - if l == 0 or l > 3 or not milliseconds.isdigit(): - raise dns.exception.SyntaxError( - 'bad longitude milliseconds value') - if l == 1: - m = 100 - elif l == 2: - m = 10 - else: - m = 1 - longitude[3] = m * int(milliseconds) - t = tok.get_string() - elif t.isdigit(): - longitude[2] = int(t) - t = tok.get_string() - if t == 'W': - longitude[4] = -1 - elif t != 'E': - raise dns.exception.SyntaxError('bad longitude hemisphere value') - - t = tok.get_string() - if t[-1] == 'm': - t = t[0: -1] - altitude = float(t) * 100.0 # m -> cm - - token = tok.get().unescape() - if not token.is_eol_or_eof(): - value = token.value - if value[-1] == 'm': - value = value[0: -1] - size = float(value) * 100.0 # m -> cm - token = tok.get().unescape() - if not token.is_eol_or_eof(): - value = token.value - if value[-1] == 'm': - value = value[0: -1] - hprec = float(value) * 100.0 # m -> cm - token = tok.get().unescape() - if not token.is_eol_or_eof(): - value = token.value - if value[-1] == 'm': - value = value[0: -1] - vprec = float(value) * 100.0 # m -> cm - tok.get_eol() - - return cls(rdclass, rdtype, latitude, longitude, altitude, - size, hprec, vprec) - - def to_wire(self, file, compress=None, origin=None): - milliseconds = (self.latitude[0] * 3600000 + - self.latitude[1] * 60000 + - self.latitude[2] * 1000 + - self.latitude[3]) * self.latitude[4] - latitude = long(0x80000000) + milliseconds - milliseconds = (self.longitude[0] * 3600000 + - self.longitude[1] * 60000 + - self.longitude[2] * 1000 + - self.longitude[3]) * self.longitude[4] - longitude = long(0x80000000) + milliseconds - altitude = long(self.altitude) + long(10000000) - size = _encode_size(self.size, "size") - hprec = _encode_size(self.horizontal_precision, "horizontal precision") - vprec = _encode_size(self.vertical_precision, "vertical precision") - wire = struct.pack("!BBBBIII", 0, size, hprec, vprec, latitude, - longitude, altitude) - file.write(wire) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (version, size, hprec, vprec, latitude, longitude, altitude) = \ - struct.unpack("!BBBBIII", wire[current: current + rdlen]) - if latitude > long(0x80000000): - latitude = float(latitude - long(0x80000000)) / 3600000 - else: - latitude = -1 * float(long(0x80000000) - latitude) / 3600000 - if latitude < -90.0 or latitude > 90.0: - raise dns.exception.FormError("bad latitude") - if longitude > long(0x80000000): - longitude = float(longitude - long(0x80000000)) / 3600000 - else: - longitude = -1 * float(long(0x80000000) - longitude) / 3600000 - if longitude < -180.0 or longitude > 180.0: - raise dns.exception.FormError("bad longitude") - altitude = float(altitude) - 10000000.0 - size = _decode_size(size, "size") - hprec = _decode_size(hprec, "horizontal precision") - vprec = _decode_size(vprec, "vertical precision") - return cls(rdclass, rdtype, latitude, longitude, altitude, - size, hprec, vprec) - - def _get_float_latitude(self): - return _tuple_to_float(self.latitude) - - def _set_float_latitude(self, value): - self.latitude = _float_to_tuple(value) - - float_latitude = property(_get_float_latitude, _set_float_latitude, - doc="latitude as a floating point value") - - def _get_float_longitude(self): - return _tuple_to_float(self.longitude) - - def _set_float_longitude(self, value): - self.longitude = _float_to_tuple(value) - - float_longitude = property(_get_float_longitude, _set_float_longitude, - doc="longitude as a floating point value") diff --git a/lib/dns/rdtypes/ANY/MX.py b/lib/dns/rdtypes/ANY/MX.py deleted file mode 100644 index 0a06494f..00000000 --- a/lib/dns/rdtypes/ANY/MX.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.mxbase - - -class MX(dns.rdtypes.mxbase.MXBase): - - """MX record""" diff --git a/lib/dns/rdtypes/ANY/NINFO.py b/lib/dns/rdtypes/ANY/NINFO.py deleted file mode 100644 index d754bc1a..00000000 --- a/lib/dns/rdtypes/ANY/NINFO.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.txtbase - - -class NINFO(dns.rdtypes.txtbase.TXTBase): - - """NINFO record - @see: draft-reid-dnsext-zs-01""" diff --git a/lib/dns/rdtypes/ANY/NS.py b/lib/dns/rdtypes/ANY/NS.py deleted file mode 100644 index f9fcf637..00000000 --- a/lib/dns/rdtypes/ANY/NS.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.nsbase - - -class NS(dns.rdtypes.nsbase.NSBase): - - """NS record""" diff --git a/lib/dns/rdtypes/ANY/NSEC.py b/lib/dns/rdtypes/ANY/NSEC.py deleted file mode 100644 index 4e3da729..00000000 --- a/lib/dns/rdtypes/ANY/NSEC.py +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.rdatatype -import dns.name -from dns._compat import xrange - - -class NSEC(dns.rdata.Rdata): - - """NSEC record - - @ivar next: the next name - @type next: dns.name.Name object - @ivar windows: the windowed bitmap list - @type windows: list of (window number, string) tuples""" - - __slots__ = ['next', 'windows'] - - def __init__(self, rdclass, rdtype, next, windows): - super(NSEC, self).__init__(rdclass, rdtype) - self.next = next - self.windows = windows - - def to_text(self, origin=None, relativize=True, **kw): - next = self.next.choose_relativity(origin, relativize) - text = '' - for (window, bitmap) in self.windows: - bits = [] - for i in xrange(0, len(bitmap)): - byte = bitmap[i] - for j in xrange(0, 8): - if byte & (0x80 >> j): - bits.append(dns.rdatatype.to_text(window * 256 + - i * 8 + j)) - text += (' ' + ' '.join(bits)) - return '{}{}'.format(next, text) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - next = tok.get_name() - next = next.choose_relativity(origin, relativize) - rdtypes = [] - while 1: - token = tok.get().unescape() - if token.is_eol_or_eof(): - break - nrdtype = dns.rdatatype.from_text(token.value) - if nrdtype == 0: - raise dns.exception.SyntaxError("NSEC with bit 0") - if nrdtype > 65535: - raise dns.exception.SyntaxError("NSEC with bit > 65535") - rdtypes.append(nrdtype) - rdtypes.sort() - window = 0 - octets = 0 - prior_rdtype = 0 - bitmap = bytearray(b'\0' * 32) - windows = [] - for nrdtype in rdtypes: - if nrdtype == prior_rdtype: - continue - prior_rdtype = nrdtype - new_window = nrdtype // 256 - if new_window != window: - windows.append((window, bitmap[0:octets])) - bitmap = bytearray(b'\0' * 32) - window = new_window - offset = nrdtype % 256 - byte = offset // 8 - bit = offset % 8 - octets = byte + 1 - bitmap[byte] = bitmap[byte] | (0x80 >> bit) - - windows.append((window, bitmap[0:octets])) - return cls(rdclass, rdtype, next, windows) - - def to_wire(self, file, compress=None, origin=None): - self.next.to_wire(file, None, origin) - for (window, bitmap) in self.windows: - file.write(struct.pack('!BB', window, len(bitmap))) - file.write(bitmap) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (next, cused) = dns.name.from_wire(wire[: current + rdlen], current) - current += cused - rdlen -= cused - windows = [] - while rdlen > 0: - if rdlen < 3: - raise dns.exception.FormError("NSEC too short") - window = wire[current] - octets = wire[current + 1] - if octets == 0 or octets > 32: - raise dns.exception.FormError("bad NSEC octets") - current += 2 - rdlen -= 2 - if rdlen < octets: - raise dns.exception.FormError("bad NSEC bitmap length") - bitmap = bytearray(wire[current: current + octets].unwrap()) - current += octets - rdlen -= octets - windows.append((window, bitmap)) - if origin is not None: - next = next.relativize(origin) - return cls(rdclass, rdtype, next, windows) - - def choose_relativity(self, origin=None, relativize=True): - self.next = self.next.choose_relativity(origin, relativize) diff --git a/lib/dns/rdtypes/ANY/NSEC3.py b/lib/dns/rdtypes/ANY/NSEC3.py deleted file mode 100644 index 1c281c4a..00000000 --- a/lib/dns/rdtypes/ANY/NSEC3.py +++ /dev/null @@ -1,196 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import base64 -import binascii -import string -import struct - -import dns.exception -import dns.rdata -import dns.rdatatype -from dns._compat import xrange, text_type, PY3 - -# pylint: disable=deprecated-string-function -if PY3: - b32_hex_to_normal = bytes.maketrans(b'0123456789ABCDEFGHIJKLMNOPQRSTUV', - b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567') - b32_normal_to_hex = bytes.maketrans(b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', - b'0123456789ABCDEFGHIJKLMNOPQRSTUV') -else: - b32_hex_to_normal = string.maketrans('0123456789ABCDEFGHIJKLMNOPQRSTUV', - 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567') - b32_normal_to_hex = string.maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', - '0123456789ABCDEFGHIJKLMNOPQRSTUV') -# pylint: enable=deprecated-string-function - - -# hash algorithm constants -SHA1 = 1 - -# flag constants -OPTOUT = 1 - - -class NSEC3(dns.rdata.Rdata): - - """NSEC3 record - - @ivar algorithm: the hash algorithm number - @type algorithm: int - @ivar flags: the flags - @type flags: int - @ivar iterations: the number of iterations - @type iterations: int - @ivar salt: the salt - @type salt: string - @ivar next: the next name hash - @type next: string - @ivar windows: the windowed bitmap list - @type windows: list of (window number, string) tuples""" - - __slots__ = ['algorithm', 'flags', 'iterations', 'salt', 'next', 'windows'] - - def __init__(self, rdclass, rdtype, algorithm, flags, iterations, salt, - next, windows): - super(NSEC3, self).__init__(rdclass, rdtype) - self.algorithm = algorithm - self.flags = flags - self.iterations = iterations - if isinstance(salt, text_type): - self.salt = salt.encode() - else: - self.salt = salt - self.next = next - self.windows = windows - - def to_text(self, origin=None, relativize=True, **kw): - next = base64.b32encode(self.next).translate( - b32_normal_to_hex).lower().decode() - if self.salt == b'': - salt = '-' - else: - salt = binascii.hexlify(self.salt).decode() - text = u'' - for (window, bitmap) in self.windows: - bits = [] - for i in xrange(0, len(bitmap)): - byte = bitmap[i] - for j in xrange(0, 8): - if byte & (0x80 >> j): - bits.append(dns.rdatatype.to_text(window * 256 + - i * 8 + j)) - text += (u' ' + u' '.join(bits)) - return u'%u %u %u %s %s%s' % (self.algorithm, self.flags, - self.iterations, salt, next, text) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - algorithm = tok.get_uint8() - flags = tok.get_uint8() - iterations = tok.get_uint16() - salt = tok.get_string() - if salt == u'-': - salt = b'' - else: - salt = binascii.unhexlify(salt.encode('ascii')) - next = tok.get_string().encode( - 'ascii').upper().translate(b32_hex_to_normal) - next = base64.b32decode(next) - rdtypes = [] - while 1: - token = tok.get().unescape() - if token.is_eol_or_eof(): - break - nrdtype = dns.rdatatype.from_text(token.value) - if nrdtype == 0: - raise dns.exception.SyntaxError("NSEC3 with bit 0") - if nrdtype > 65535: - raise dns.exception.SyntaxError("NSEC3 with bit > 65535") - rdtypes.append(nrdtype) - rdtypes.sort() - window = 0 - octets = 0 - prior_rdtype = 0 - bitmap = bytearray(b'\0' * 32) - windows = [] - for nrdtype in rdtypes: - if nrdtype == prior_rdtype: - continue - prior_rdtype = nrdtype - new_window = nrdtype // 256 - if new_window != window: - if octets != 0: - windows.append((window, bitmap[0:octets])) - bitmap = bytearray(b'\0' * 32) - window = new_window - offset = nrdtype % 256 - byte = offset // 8 - bit = offset % 8 - octets = byte + 1 - bitmap[byte] = bitmap[byte] | (0x80 >> bit) - if octets != 0: - windows.append((window, bitmap[0:octets])) - return cls(rdclass, rdtype, algorithm, flags, iterations, salt, next, - windows) - - def to_wire(self, file, compress=None, origin=None): - l = len(self.salt) - file.write(struct.pack("!BBHB", self.algorithm, self.flags, - self.iterations, l)) - file.write(self.salt) - l = len(self.next) - file.write(struct.pack("!B", l)) - file.write(self.next) - for (window, bitmap) in self.windows: - file.write(struct.pack("!BB", window, len(bitmap))) - file.write(bitmap) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (algorithm, flags, iterations, slen) = \ - struct.unpack('!BBHB', wire[current: current + 5]) - - current += 5 - rdlen -= 5 - salt = wire[current: current + slen].unwrap() - current += slen - rdlen -= slen - nlen = wire[current] - current += 1 - rdlen -= 1 - next = wire[current: current + nlen].unwrap() - current += nlen - rdlen -= nlen - windows = [] - while rdlen > 0: - if rdlen < 3: - raise dns.exception.FormError("NSEC3 too short") - window = wire[current] - octets = wire[current + 1] - if octets == 0 or octets > 32: - raise dns.exception.FormError("bad NSEC3 octets") - current += 2 - rdlen -= 2 - if rdlen < octets: - raise dns.exception.FormError("bad NSEC3 bitmap length") - bitmap = bytearray(wire[current: current + octets].unwrap()) - current += octets - rdlen -= octets - windows.append((window, bitmap)) - return cls(rdclass, rdtype, algorithm, flags, iterations, salt, next, - windows) diff --git a/lib/dns/rdtypes/ANY/NSEC3PARAM.py b/lib/dns/rdtypes/ANY/NSEC3PARAM.py deleted file mode 100644 index 87c36e56..00000000 --- a/lib/dns/rdtypes/ANY/NSEC3PARAM.py +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct -import binascii - -import dns.exception -import dns.rdata -from dns._compat import text_type - - -class NSEC3PARAM(dns.rdata.Rdata): - - """NSEC3PARAM record - - @ivar algorithm: the hash algorithm number - @type algorithm: int - @ivar flags: the flags - @type flags: int - @ivar iterations: the number of iterations - @type iterations: int - @ivar salt: the salt - @type salt: string""" - - __slots__ = ['algorithm', 'flags', 'iterations', 'salt'] - - def __init__(self, rdclass, rdtype, algorithm, flags, iterations, salt): - super(NSEC3PARAM, self).__init__(rdclass, rdtype) - self.algorithm = algorithm - self.flags = flags - self.iterations = iterations - if isinstance(salt, text_type): - self.salt = salt.encode() - else: - self.salt = salt - - def to_text(self, origin=None, relativize=True, **kw): - if self.salt == b'': - salt = '-' - else: - salt = binascii.hexlify(self.salt).decode() - return '%u %u %u %s' % (self.algorithm, self.flags, self.iterations, - salt) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - algorithm = tok.get_uint8() - flags = tok.get_uint8() - iterations = tok.get_uint16() - salt = tok.get_string() - if salt == '-': - salt = '' - else: - salt = binascii.unhexlify(salt.encode()) - tok.get_eol() - return cls(rdclass, rdtype, algorithm, flags, iterations, salt) - - def to_wire(self, file, compress=None, origin=None): - l = len(self.salt) - file.write(struct.pack("!BBHB", self.algorithm, self.flags, - self.iterations, l)) - file.write(self.salt) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (algorithm, flags, iterations, slen) = \ - struct.unpack('!BBHB', - wire[current: current + 5]) - current += 5 - rdlen -= 5 - salt = wire[current: current + slen].unwrap() - current += slen - rdlen -= slen - if rdlen != 0: - raise dns.exception.FormError - return cls(rdclass, rdtype, algorithm, flags, iterations, salt) diff --git a/lib/dns/rdtypes/ANY/OPENPGPKEY.py b/lib/dns/rdtypes/ANY/OPENPGPKEY.py deleted file mode 100644 index a066cf98..00000000 --- a/lib/dns/rdtypes/ANY/OPENPGPKEY.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2016 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import base64 - -import dns.exception -import dns.rdata -import dns.tokenizer - -class OPENPGPKEY(dns.rdata.Rdata): - - """OPENPGPKEY record - - @ivar key: the key - @type key: bytes - @see: RFC 7929 - """ - - def __init__(self, rdclass, rdtype, key): - super(OPENPGPKEY, self).__init__(rdclass, rdtype) - self.key = key - - def to_text(self, origin=None, relativize=True, **kw): - return dns.rdata._base64ify(self.key) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - b64 = b''.join(chunks) - key = base64.b64decode(b64) - return cls(rdclass, rdtype, key) - - def to_wire(self, file, compress=None, origin=None): - file.write(self.key) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - key = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, key) diff --git a/lib/dns/rdtypes/ANY/PTR.py b/lib/dns/rdtypes/ANY/PTR.py deleted file mode 100644 index 20cd5076..00000000 --- a/lib/dns/rdtypes/ANY/PTR.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.nsbase - - -class PTR(dns.rdtypes.nsbase.NSBase): - - """PTR record""" diff --git a/lib/dns/rdtypes/ANY/RP.py b/lib/dns/rdtypes/ANY/RP.py deleted file mode 100644 index 8f07be90..00000000 --- a/lib/dns/rdtypes/ANY/RP.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.exception -import dns.rdata -import dns.name - - -class RP(dns.rdata.Rdata): - - """RP record - - @ivar mbox: The responsible person's mailbox - @type mbox: dns.name.Name object - @ivar txt: The owner name of a node with TXT records, or the root name - if no TXT records are associated with this RP. - @type txt: dns.name.Name object - @see: RFC 1183""" - - __slots__ = ['mbox', 'txt'] - - def __init__(self, rdclass, rdtype, mbox, txt): - super(RP, self).__init__(rdclass, rdtype) - self.mbox = mbox - self.txt = txt - - def to_text(self, origin=None, relativize=True, **kw): - mbox = self.mbox.choose_relativity(origin, relativize) - txt = self.txt.choose_relativity(origin, relativize) - return "{} {}".format(str(mbox), str(txt)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - mbox = tok.get_name() - txt = tok.get_name() - mbox = mbox.choose_relativity(origin, relativize) - txt = txt.choose_relativity(origin, relativize) - tok.get_eol() - return cls(rdclass, rdtype, mbox, txt) - - def to_wire(self, file, compress=None, origin=None): - self.mbox.to_wire(file, None, origin) - self.txt.to_wire(file, None, origin) - - def to_digestable(self, origin=None): - return self.mbox.to_digestable(origin) + \ - self.txt.to_digestable(origin) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (mbox, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - current += cused - rdlen -= cused - if rdlen <= 0: - raise dns.exception.FormError - (txt, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - if cused != rdlen: - raise dns.exception.FormError - if origin is not None: - mbox = mbox.relativize(origin) - txt = txt.relativize(origin) - return cls(rdclass, rdtype, mbox, txt) - - def choose_relativity(self, origin=None, relativize=True): - self.mbox = self.mbox.choose_relativity(origin, relativize) - self.txt = self.txt.choose_relativity(origin, relativize) diff --git a/lib/dns/rdtypes/ANY/RRSIG.py b/lib/dns/rdtypes/ANY/RRSIG.py deleted file mode 100644 index d3756ece..00000000 --- a/lib/dns/rdtypes/ANY/RRSIG.py +++ /dev/null @@ -1,158 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import base64 -import calendar -import struct -import time - -import dns.dnssec -import dns.exception -import dns.rdata -import dns.rdatatype - - -class BadSigTime(dns.exception.DNSException): - - """Time in DNS SIG or RRSIG resource record cannot be parsed.""" - - -def sigtime_to_posixtime(what): - if len(what) != 14: - raise BadSigTime - year = int(what[0:4]) - month = int(what[4:6]) - day = int(what[6:8]) - hour = int(what[8:10]) - minute = int(what[10:12]) - second = int(what[12:14]) - return calendar.timegm((year, month, day, hour, minute, second, - 0, 0, 0)) - - -def posixtime_to_sigtime(what): - return time.strftime('%Y%m%d%H%M%S', time.gmtime(what)) - - -class RRSIG(dns.rdata.Rdata): - - """RRSIG record - - @ivar type_covered: the rdata type this signature covers - @type type_covered: int - @ivar algorithm: the algorithm used for the sig - @type algorithm: int - @ivar labels: number of labels - @type labels: int - @ivar original_ttl: the original TTL - @type original_ttl: long - @ivar expiration: signature expiration time - @type expiration: long - @ivar inception: signature inception time - @type inception: long - @ivar key_tag: the key tag - @type key_tag: int - @ivar signer: the signer - @type signer: dns.name.Name object - @ivar signature: the signature - @type signature: string""" - - __slots__ = ['type_covered', 'algorithm', 'labels', 'original_ttl', - 'expiration', 'inception', 'key_tag', 'signer', - 'signature'] - - def __init__(self, rdclass, rdtype, type_covered, algorithm, labels, - original_ttl, expiration, inception, key_tag, signer, - signature): - super(RRSIG, self).__init__(rdclass, rdtype) - self.type_covered = type_covered - self.algorithm = algorithm - self.labels = labels - self.original_ttl = original_ttl - self.expiration = expiration - self.inception = inception - self.key_tag = key_tag - self.signer = signer - self.signature = signature - - def covers(self): - return self.type_covered - - def to_text(self, origin=None, relativize=True, **kw): - return '%s %d %d %d %s %s %d %s %s' % ( - dns.rdatatype.to_text(self.type_covered), - self.algorithm, - self.labels, - self.original_ttl, - posixtime_to_sigtime(self.expiration), - posixtime_to_sigtime(self.inception), - self.key_tag, - self.signer.choose_relativity(origin, relativize), - dns.rdata._base64ify(self.signature) - ) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - type_covered = dns.rdatatype.from_text(tok.get_string()) - algorithm = dns.dnssec.algorithm_from_text(tok.get_string()) - labels = tok.get_int() - original_ttl = tok.get_ttl() - expiration = sigtime_to_posixtime(tok.get_string()) - inception = sigtime_to_posixtime(tok.get_string()) - key_tag = tok.get_int() - signer = tok.get_name() - signer = signer.choose_relativity(origin, relativize) - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - b64 = b''.join(chunks) - signature = base64.b64decode(b64) - return cls(rdclass, rdtype, type_covered, algorithm, labels, - original_ttl, expiration, inception, key_tag, signer, - signature) - - def to_wire(self, file, compress=None, origin=None): - header = struct.pack('!HBBIIIH', self.type_covered, - self.algorithm, self.labels, - self.original_ttl, self.expiration, - self.inception, self.key_tag) - file.write(header) - self.signer.to_wire(file, None, origin) - file.write(self.signature) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - header = struct.unpack('!HBBIIIH', wire[current: current + 18]) - current += 18 - rdlen -= 18 - (signer, cused) = dns.name.from_wire(wire[: current + rdlen], current) - current += cused - rdlen -= cused - if origin is not None: - signer = signer.relativize(origin) - signature = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, header[0], header[1], header[2], - header[3], header[4], header[5], header[6], signer, - signature) - - def choose_relativity(self, origin=None, relativize=True): - self.signer = self.signer.choose_relativity(origin, relativize) diff --git a/lib/dns/rdtypes/ANY/RT.py b/lib/dns/rdtypes/ANY/RT.py deleted file mode 100644 index d0feb79e..00000000 --- a/lib/dns/rdtypes/ANY/RT.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.mxbase - - -class RT(dns.rdtypes.mxbase.UncompressedDowncasingMX): - - """RT record""" diff --git a/lib/dns/rdtypes/ANY/SOA.py b/lib/dns/rdtypes/ANY/SOA.py deleted file mode 100644 index aec81cad..00000000 --- a/lib/dns/rdtypes/ANY/SOA.py +++ /dev/null @@ -1,116 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.name - - -class SOA(dns.rdata.Rdata): - - """SOA record - - @ivar mname: the SOA MNAME (master name) field - @type mname: dns.name.Name object - @ivar rname: the SOA RNAME (responsible name) field - @type rname: dns.name.Name object - @ivar serial: The zone's serial number - @type serial: int - @ivar refresh: The zone's refresh value (in seconds) - @type refresh: int - @ivar retry: The zone's retry value (in seconds) - @type retry: int - @ivar expire: The zone's expiration value (in seconds) - @type expire: int - @ivar minimum: The zone's negative caching time (in seconds, called - "minimum" for historical reasons) - @type minimum: int - @see: RFC 1035""" - - __slots__ = ['mname', 'rname', 'serial', 'refresh', 'retry', 'expire', - 'minimum'] - - def __init__(self, rdclass, rdtype, mname, rname, serial, refresh, retry, - expire, minimum): - super(SOA, self).__init__(rdclass, rdtype) - self.mname = mname - self.rname = rname - self.serial = serial - self.refresh = refresh - self.retry = retry - self.expire = expire - self.minimum = minimum - - def to_text(self, origin=None, relativize=True, **kw): - mname = self.mname.choose_relativity(origin, relativize) - rname = self.rname.choose_relativity(origin, relativize) - return '%s %s %d %d %d %d %d' % ( - mname, rname, self.serial, self.refresh, self.retry, - self.expire, self.minimum) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - mname = tok.get_name() - rname = tok.get_name() - mname = mname.choose_relativity(origin, relativize) - rname = rname.choose_relativity(origin, relativize) - serial = tok.get_uint32() - refresh = tok.get_ttl() - retry = tok.get_ttl() - expire = tok.get_ttl() - minimum = tok.get_ttl() - tok.get_eol() - return cls(rdclass, rdtype, mname, rname, serial, refresh, retry, - expire, minimum) - - def to_wire(self, file, compress=None, origin=None): - self.mname.to_wire(file, compress, origin) - self.rname.to_wire(file, compress, origin) - five_ints = struct.pack('!IIIII', self.serial, self.refresh, - self.retry, self.expire, self.minimum) - file.write(five_ints) - - def to_digestable(self, origin=None): - return self.mname.to_digestable(origin) + \ - self.rname.to_digestable(origin) + \ - struct.pack('!IIIII', self.serial, self.refresh, - self.retry, self.expire, self.minimum) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (mname, cused) = dns.name.from_wire(wire[: current + rdlen], current) - current += cused - rdlen -= cused - (rname, cused) = dns.name.from_wire(wire[: current + rdlen], current) - current += cused - rdlen -= cused - if rdlen != 20: - raise dns.exception.FormError - five_ints = struct.unpack('!IIIII', - wire[current: current + rdlen]) - if origin is not None: - mname = mname.relativize(origin) - rname = rname.relativize(origin) - return cls(rdclass, rdtype, mname, rname, - five_ints[0], five_ints[1], five_ints[2], five_ints[3], - five_ints[4]) - - def choose_relativity(self, origin=None, relativize=True): - self.mname = self.mname.choose_relativity(origin, relativize) - self.rname = self.rname.choose_relativity(origin, relativize) diff --git a/lib/dns/rdtypes/ANY/SPF.py b/lib/dns/rdtypes/ANY/SPF.py deleted file mode 100644 index 41dee623..00000000 --- a/lib/dns/rdtypes/ANY/SPF.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.txtbase - - -class SPF(dns.rdtypes.txtbase.TXTBase): - - """SPF record - - @see: RFC 4408""" diff --git a/lib/dns/rdtypes/ANY/SSHFP.py b/lib/dns/rdtypes/ANY/SSHFP.py deleted file mode 100644 index c18311e9..00000000 --- a/lib/dns/rdtypes/ANY/SSHFP.py +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2005-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct -import binascii - -import dns.rdata -import dns.rdatatype - - -class SSHFP(dns.rdata.Rdata): - - """SSHFP record - - @ivar algorithm: the algorithm - @type algorithm: int - @ivar fp_type: the digest type - @type fp_type: int - @ivar fingerprint: the fingerprint - @type fingerprint: string - @see: draft-ietf-secsh-dns-05.txt""" - - __slots__ = ['algorithm', 'fp_type', 'fingerprint'] - - def __init__(self, rdclass, rdtype, algorithm, fp_type, - fingerprint): - super(SSHFP, self).__init__(rdclass, rdtype) - self.algorithm = algorithm - self.fp_type = fp_type - self.fingerprint = fingerprint - - def to_text(self, origin=None, relativize=True, **kw): - return '%d %d %s' % (self.algorithm, - self.fp_type, - dns.rdata._hexify(self.fingerprint, - chunksize=128)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - algorithm = tok.get_uint8() - fp_type = tok.get_uint8() - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - fingerprint = b''.join(chunks) - fingerprint = binascii.unhexlify(fingerprint) - return cls(rdclass, rdtype, algorithm, fp_type, fingerprint) - - def to_wire(self, file, compress=None, origin=None): - header = struct.pack("!BB", self.algorithm, self.fp_type) - file.write(header) - file.write(self.fingerprint) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - header = struct.unpack("!BB", wire[current: current + 2]) - current += 2 - rdlen -= 2 - fingerprint = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, header[0], header[1], fingerprint) diff --git a/lib/dns/rdtypes/ANY/TLSA.py b/lib/dns/rdtypes/ANY/TLSA.py deleted file mode 100644 index a135c2b3..00000000 --- a/lib/dns/rdtypes/ANY/TLSA.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2005-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct -import binascii - -import dns.rdata -import dns.rdatatype - - -class TLSA(dns.rdata.Rdata): - - """TLSA record - - @ivar usage: The certificate usage - @type usage: int - @ivar selector: The selector field - @type selector: int - @ivar mtype: The 'matching type' field - @type mtype: int - @ivar cert: The 'Certificate Association Data' field - @type cert: string - @see: RFC 6698""" - - __slots__ = ['usage', 'selector', 'mtype', 'cert'] - - def __init__(self, rdclass, rdtype, usage, selector, - mtype, cert): - super(TLSA, self).__init__(rdclass, rdtype) - self.usage = usage - self.selector = selector - self.mtype = mtype - self.cert = cert - - def to_text(self, origin=None, relativize=True, **kw): - return '%d %d %d %s' % (self.usage, - self.selector, - self.mtype, - dns.rdata._hexify(self.cert, - chunksize=128)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - usage = tok.get_uint8() - selector = tok.get_uint8() - mtype = tok.get_uint8() - cert_chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - cert_chunks.append(t.value.encode()) - cert = b''.join(cert_chunks) - cert = binascii.unhexlify(cert) - return cls(rdclass, rdtype, usage, selector, mtype, cert) - - def to_wire(self, file, compress=None, origin=None): - header = struct.pack("!BBB", self.usage, self.selector, self.mtype) - file.write(header) - file.write(self.cert) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - header = struct.unpack("!BBB", wire[current: current + 3]) - current += 3 - rdlen -= 3 - cert = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, header[0], header[1], header[2], cert) diff --git a/lib/dns/rdtypes/ANY/TXT.py b/lib/dns/rdtypes/ANY/TXT.py deleted file mode 100644 index c5ae919c..00000000 --- a/lib/dns/rdtypes/ANY/TXT.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.txtbase - - -class TXT(dns.rdtypes.txtbase.TXTBase): - - """TXT record""" diff --git a/lib/dns/rdtypes/ANY/URI.py b/lib/dns/rdtypes/ANY/URI.py deleted file mode 100644 index f5b65ed6..00000000 --- a/lib/dns/rdtypes/ANY/URI.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# Copyright (C) 2015 Red Hat, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.name -from dns._compat import text_type - - -class URI(dns.rdata.Rdata): - - """URI record - - @ivar priority: the priority - @type priority: int - @ivar weight: the weight - @type weight: int - @ivar target: the target host - @type target: dns.name.Name object - @see: draft-faltstrom-uri-13""" - - __slots__ = ['priority', 'weight', 'target'] - - def __init__(self, rdclass, rdtype, priority, weight, target): - super(URI, self).__init__(rdclass, rdtype) - self.priority = priority - self.weight = weight - if len(target) < 1: - raise dns.exception.SyntaxError("URI target cannot be empty") - if isinstance(target, text_type): - self.target = target.encode() - else: - self.target = target - - def to_text(self, origin=None, relativize=True, **kw): - return '%d %d "%s"' % (self.priority, self.weight, - self.target.decode()) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - priority = tok.get_uint16() - weight = tok.get_uint16() - target = tok.get().unescape() - if not (target.is_quoted_string() or target.is_identifier()): - raise dns.exception.SyntaxError("URI target must be a string") - tok.get_eol() - return cls(rdclass, rdtype, priority, weight, target.value) - - def to_wire(self, file, compress=None, origin=None): - two_ints = struct.pack("!HH", self.priority, self.weight) - file.write(two_ints) - file.write(self.target) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - if rdlen < 5: - raise dns.exception.FormError('URI RR is shorter than 5 octets') - - (priority, weight) = struct.unpack('!HH', wire[current: current + 4]) - current += 4 - rdlen -= 4 - target = wire[current: current + rdlen] - current += rdlen - - return cls(rdclass, rdtype, priority, weight, target) diff --git a/lib/dns/rdtypes/ANY/X25.py b/lib/dns/rdtypes/ANY/X25.py deleted file mode 100644 index e530a2c2..00000000 --- a/lib/dns/rdtypes/ANY/X25.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.tokenizer -from dns._compat import text_type - - -class X25(dns.rdata.Rdata): - - """X25 record - - @ivar address: the PSDN address - @type address: string - @see: RFC 1183""" - - __slots__ = ['address'] - - def __init__(self, rdclass, rdtype, address): - super(X25, self).__init__(rdclass, rdtype) - if isinstance(address, text_type): - self.address = address.encode() - else: - self.address = address - - def to_text(self, origin=None, relativize=True, **kw): - return '"%s"' % dns.rdata._escapify(self.address) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - address = tok.get_string() - tok.get_eol() - return cls(rdclass, rdtype, address) - - def to_wire(self, file, compress=None, origin=None): - l = len(self.address) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.address) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - l = wire[current] - current += 1 - rdlen -= 1 - if l != rdlen: - raise dns.exception.FormError - address = wire[current: current + l].unwrap() - return cls(rdclass, rdtype, address) diff --git a/lib/dns/rdtypes/ANY/__init__.py b/lib/dns/rdtypes/ANY/__init__.py deleted file mode 100644 index ca41ef80..00000000 --- a/lib/dns/rdtypes/ANY/__init__.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Class ANY (generic) rdata type classes.""" - -__all__ = [ - 'AFSDB', - 'AVC', - 'CAA', - 'CDNSKEY', - 'CDS', - 'CERT', - 'CNAME', - 'CSYNC', - 'DLV', - 'DNAME', - 'DNSKEY', - 'DS', - 'EUI48', - 'EUI64', - 'GPOS', - 'HINFO', - 'HIP', - 'ISDN', - 'LOC', - 'MX', - 'NS', - 'NSEC', - 'NSEC3', - 'NSEC3PARAM', - 'OPENPGPKEY', - 'PTR', - 'RP', - 'RRSIG', - 'RT', - 'SOA', - 'SPF', - 'SSHFP', - 'TLSA', - 'TXT', - 'URI', - 'X25', -] diff --git a/lib/dns/rdtypes/CH/A.py b/lib/dns/rdtypes/CH/A.py deleted file mode 100644 index e65d192d..00000000 --- a/lib/dns/rdtypes/CH/A.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.mxbase -import struct - -class A(dns.rdtypes.mxbase.MXBase): - - """A record for Chaosnet - @ivar domain: the domain of the address - @type domain: dns.name.Name object - @ivar address: the 16-bit address - @type address: int""" - - __slots__ = ['domain', 'address'] - - def __init__(self, rdclass, rdtype, address, domain): - super(A, self).__init__(rdclass, rdtype, address, domain) - self.domain = domain - self.address = address - - def to_text(self, origin=None, relativize=True, **kw): - domain = self.domain.choose_relativity(origin, relativize) - return '%s %o' % (domain, self.address) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - domain = tok.get_name() - address = tok.get_uint16(base=8) - domain = domain.choose_relativity(origin, relativize) - tok.get_eol() - return cls(rdclass, rdtype, address, domain) - - def to_wire(self, file, compress=None, origin=None): - self.domain.to_wire(file, compress, origin) - pref = struct.pack("!H", self.address) - file.write(pref) - - def to_digestable(self, origin=None): - return self.domain.to_digestable(origin) + \ - struct.pack("!H", self.address) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (domain, cused) = dns.name.from_wire(wire[: current + rdlen-2], - current) - current += cused - (address,) = struct.unpack('!H', wire[current: current + 2]) - if cused+2 != rdlen: - raise dns.exception.FormError - if origin is not None: - domain = domain.relativize(origin) - return cls(rdclass, rdtype, address, domain) - - def choose_relativity(self, origin=None, relativize=True): - self.domain = self.domain.choose_relativity(origin, relativize) diff --git a/lib/dns/rdtypes/CH/__init__.py b/lib/dns/rdtypes/CH/__init__.py deleted file mode 100644 index 7184a733..00000000 --- a/lib/dns/rdtypes/CH/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Class CH rdata type classes.""" - -__all__ = [ - 'A', -] diff --git a/lib/dns/rdtypes/IN/A.py b/lib/dns/rdtypes/IN/A.py deleted file mode 100644 index 89989824..00000000 --- a/lib/dns/rdtypes/IN/A.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.exception -import dns.ipv4 -import dns.rdata -import dns.tokenizer - - -class A(dns.rdata.Rdata): - - """A record. - - @ivar address: an IPv4 address - @type address: string (in the standard "dotted quad" format)""" - - __slots__ = ['address'] - - def __init__(self, rdclass, rdtype, address): - super(A, self).__init__(rdclass, rdtype) - # check that it's OK - dns.ipv4.inet_aton(address) - self.address = address - - def to_text(self, origin=None, relativize=True, **kw): - return self.address - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - address = tok.get_identifier() - tok.get_eol() - return cls(rdclass, rdtype, address) - - def to_wire(self, file, compress=None, origin=None): - file.write(dns.ipv4.inet_aton(self.address)) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - address = dns.ipv4.inet_ntoa(wire[current: current + rdlen]) - return cls(rdclass, rdtype, address) diff --git a/lib/dns/rdtypes/IN/AAAA.py b/lib/dns/rdtypes/IN/AAAA.py deleted file mode 100644 index a77c5bf2..00000000 --- a/lib/dns/rdtypes/IN/AAAA.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.exception -import dns.inet -import dns.rdata -import dns.tokenizer - - -class AAAA(dns.rdata.Rdata): - - """AAAA record. - - @ivar address: an IPv6 address - @type address: string (in the standard IPv6 format)""" - - __slots__ = ['address'] - - def __init__(self, rdclass, rdtype, address): - super(AAAA, self).__init__(rdclass, rdtype) - # check that it's OK - dns.inet.inet_pton(dns.inet.AF_INET6, address) - self.address = address - - def to_text(self, origin=None, relativize=True, **kw): - return self.address - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - address = tok.get_identifier() - tok.get_eol() - return cls(rdclass, rdtype, address) - - def to_wire(self, file, compress=None, origin=None): - file.write(dns.inet.inet_pton(dns.inet.AF_INET6, self.address)) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - address = dns.inet.inet_ntop(dns.inet.AF_INET6, - wire[current: current + rdlen]) - return cls(rdclass, rdtype, address) diff --git a/lib/dns/rdtypes/IN/APL.py b/lib/dns/rdtypes/IN/APL.py deleted file mode 100644 index 48faf88a..00000000 --- a/lib/dns/rdtypes/IN/APL.py +++ /dev/null @@ -1,165 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import binascii -import codecs -import struct - -import dns.exception -import dns.inet -import dns.rdata -import dns.tokenizer -from dns._compat import xrange, maybe_chr - - -class APLItem(object): - - """An APL list item. - - @ivar family: the address family (IANA address family registry) - @type family: int - @ivar negation: is this item negated? - @type negation: bool - @ivar address: the address - @type address: string - @ivar prefix: the prefix length - @type prefix: int - """ - - __slots__ = ['family', 'negation', 'address', 'prefix'] - - def __init__(self, family, negation, address, prefix): - self.family = family - self.negation = negation - self.address = address - self.prefix = prefix - - def __str__(self): - if self.negation: - return "!%d:%s/%s" % (self.family, self.address, self.prefix) - else: - return "%d:%s/%s" % (self.family, self.address, self.prefix) - - def to_wire(self, file): - if self.family == 1: - address = dns.inet.inet_pton(dns.inet.AF_INET, self.address) - elif self.family == 2: - address = dns.inet.inet_pton(dns.inet.AF_INET6, self.address) - else: - address = binascii.unhexlify(self.address) - # - # Truncate least significant zero bytes. - # - last = 0 - for i in xrange(len(address) - 1, -1, -1): - if address[i] != maybe_chr(0): - last = i + 1 - break - address = address[0: last] - l = len(address) - assert l < 128 - if self.negation: - l |= 0x80 - header = struct.pack('!HBB', self.family, self.prefix, l) - file.write(header) - file.write(address) - - -class APL(dns.rdata.Rdata): - - """APL record. - - @ivar items: a list of APL items - @type items: list of APL_Item - @see: RFC 3123""" - - __slots__ = ['items'] - - def __init__(self, rdclass, rdtype, items): - super(APL, self).__init__(rdclass, rdtype) - self.items = items - - def to_text(self, origin=None, relativize=True, **kw): - return ' '.join(map(str, self.items)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - items = [] - while 1: - token = tok.get().unescape() - if token.is_eol_or_eof(): - break - item = token.value - if item[0] == '!': - negation = True - item = item[1:] - else: - negation = False - (family, rest) = item.split(':', 1) - family = int(family) - (address, prefix) = rest.split('/', 1) - prefix = int(prefix) - item = APLItem(family, negation, address, prefix) - items.append(item) - - return cls(rdclass, rdtype, items) - - def to_wire(self, file, compress=None, origin=None): - for item in self.items: - item.to_wire(file) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - - items = [] - while 1: - if rdlen == 0: - break - if rdlen < 4: - raise dns.exception.FormError - header = struct.unpack('!HBB', wire[current: current + 4]) - afdlen = header[2] - if afdlen > 127: - negation = True - afdlen -= 128 - else: - negation = False - current += 4 - rdlen -= 4 - if rdlen < afdlen: - raise dns.exception.FormError - address = wire[current: current + afdlen].unwrap() - l = len(address) - if header[0] == 1: - if l < 4: - address += b'\x00' * (4 - l) - address = dns.inet.inet_ntop(dns.inet.AF_INET, address) - elif header[0] == 2: - if l < 16: - address += b'\x00' * (16 - l) - address = dns.inet.inet_ntop(dns.inet.AF_INET6, address) - else: - # - # This isn't really right according to the RFC, but it - # seems better than throwing an exception - # - address = codecs.encode(address, 'hex_codec') - current += afdlen - rdlen -= afdlen - item = APLItem(header[0], negation, address, header[1]) - items.append(item) - return cls(rdclass, rdtype, items) diff --git a/lib/dns/rdtypes/IN/DHCID.py b/lib/dns/rdtypes/IN/DHCID.py deleted file mode 100644 index cec64590..00000000 --- a/lib/dns/rdtypes/IN/DHCID.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import base64 - -import dns.exception - - -class DHCID(dns.rdata.Rdata): - - """DHCID record - - @ivar data: the data (the content of the RR is opaque as far as the - DNS is concerned) - @type data: string - @see: RFC 4701""" - - __slots__ = ['data'] - - def __init__(self, rdclass, rdtype, data): - super(DHCID, self).__init__(rdclass, rdtype) - self.data = data - - def to_text(self, origin=None, relativize=True, **kw): - return dns.rdata._base64ify(self.data) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - b64 = b''.join(chunks) - data = base64.b64decode(b64) - return cls(rdclass, rdtype, data) - - def to_wire(self, file, compress=None, origin=None): - file.write(self.data) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - data = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, data) diff --git a/lib/dns/rdtypes/IN/IPSECKEY.py b/lib/dns/rdtypes/IN/IPSECKEY.py deleted file mode 100644 index 8f49ba13..00000000 --- a/lib/dns/rdtypes/IN/IPSECKEY.py +++ /dev/null @@ -1,150 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct -import base64 - -import dns.exception -import dns.inet -import dns.name - - -class IPSECKEY(dns.rdata.Rdata): - - """IPSECKEY record - - @ivar precedence: the precedence for this key data - @type precedence: int - @ivar gateway_type: the gateway type - @type gateway_type: int - @ivar algorithm: the algorithm to use - @type algorithm: int - @ivar gateway: the public key - @type gateway: None, IPv4 address, IPV6 address, or domain name - @ivar key: the public key - @type key: string - @see: RFC 4025""" - - __slots__ = ['precedence', 'gateway_type', 'algorithm', 'gateway', 'key'] - - def __init__(self, rdclass, rdtype, precedence, gateway_type, algorithm, - gateway, key): - super(IPSECKEY, self).__init__(rdclass, rdtype) - if gateway_type == 0: - if gateway != '.' and gateway is not None: - raise SyntaxError('invalid gateway for gateway type 0') - gateway = None - elif gateway_type == 1: - # check that it's OK - dns.inet.inet_pton(dns.inet.AF_INET, gateway) - elif gateway_type == 2: - # check that it's OK - dns.inet.inet_pton(dns.inet.AF_INET6, gateway) - elif gateway_type == 3: - pass - else: - raise SyntaxError( - 'invalid IPSECKEY gateway type: %d' % gateway_type) - self.precedence = precedence - self.gateway_type = gateway_type - self.algorithm = algorithm - self.gateway = gateway - self.key = key - - def to_text(self, origin=None, relativize=True, **kw): - if self.gateway_type == 0: - gateway = '.' - elif self.gateway_type == 1: - gateway = self.gateway - elif self.gateway_type == 2: - gateway = self.gateway - elif self.gateway_type == 3: - gateway = str(self.gateway.choose_relativity(origin, relativize)) - else: - raise ValueError('invalid gateway type') - return '%d %d %d %s %s' % (self.precedence, self.gateway_type, - self.algorithm, gateway, - dns.rdata._base64ify(self.key)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - precedence = tok.get_uint8() - gateway_type = tok.get_uint8() - algorithm = tok.get_uint8() - if gateway_type == 3: - gateway = tok.get_name().choose_relativity(origin, relativize) - else: - gateway = tok.get_string() - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - b64 = b''.join(chunks) - key = base64.b64decode(b64) - return cls(rdclass, rdtype, precedence, gateway_type, algorithm, - gateway, key) - - def to_wire(self, file, compress=None, origin=None): - header = struct.pack("!BBB", self.precedence, self.gateway_type, - self.algorithm) - file.write(header) - if self.gateway_type == 0: - pass - elif self.gateway_type == 1: - file.write(dns.inet.inet_pton(dns.inet.AF_INET, self.gateway)) - elif self.gateway_type == 2: - file.write(dns.inet.inet_pton(dns.inet.AF_INET6, self.gateway)) - elif self.gateway_type == 3: - self.gateway.to_wire(file, None, origin) - else: - raise ValueError('invalid gateway type') - file.write(self.key) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - if rdlen < 3: - raise dns.exception.FormError - header = struct.unpack('!BBB', wire[current: current + 3]) - gateway_type = header[1] - current += 3 - rdlen -= 3 - if gateway_type == 0: - gateway = None - elif gateway_type == 1: - gateway = dns.inet.inet_ntop(dns.inet.AF_INET, - wire[current: current + 4]) - current += 4 - rdlen -= 4 - elif gateway_type == 2: - gateway = dns.inet.inet_ntop(dns.inet.AF_INET6, - wire[current: current + 16]) - current += 16 - rdlen -= 16 - elif gateway_type == 3: - (gateway, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - current += cused - rdlen -= cused - else: - raise dns.exception.FormError('invalid IPSECKEY gateway type') - key = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, header[0], gateway_type, header[2], - gateway, key) diff --git a/lib/dns/rdtypes/IN/KX.py b/lib/dns/rdtypes/IN/KX.py deleted file mode 100644 index 1318a582..00000000 --- a/lib/dns/rdtypes/IN/KX.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.mxbase - - -class KX(dns.rdtypes.mxbase.UncompressedMX): - - """KX record""" diff --git a/lib/dns/rdtypes/IN/NAPTR.py b/lib/dns/rdtypes/IN/NAPTR.py deleted file mode 100644 index 32fa4745..00000000 --- a/lib/dns/rdtypes/IN/NAPTR.py +++ /dev/null @@ -1,127 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.name -import dns.rdata -from dns._compat import xrange, text_type - - -def _write_string(file, s): - l = len(s) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(s) - - -def _sanitize(value): - if isinstance(value, text_type): - return value.encode() - return value - - -class NAPTR(dns.rdata.Rdata): - - """NAPTR record - - @ivar order: order - @type order: int - @ivar preference: preference - @type preference: int - @ivar flags: flags - @type flags: string - @ivar service: service - @type service: string - @ivar regexp: regular expression - @type regexp: string - @ivar replacement: replacement name - @type replacement: dns.name.Name object - @see: RFC 3403""" - - __slots__ = ['order', 'preference', 'flags', 'service', 'regexp', - 'replacement'] - - def __init__(self, rdclass, rdtype, order, preference, flags, service, - regexp, replacement): - super(NAPTR, self).__init__(rdclass, rdtype) - self.flags = _sanitize(flags) - self.service = _sanitize(service) - self.regexp = _sanitize(regexp) - self.order = order - self.preference = preference - self.replacement = replacement - - def to_text(self, origin=None, relativize=True, **kw): - replacement = self.replacement.choose_relativity(origin, relativize) - return '%d %d "%s" "%s" "%s" %s' % \ - (self.order, self.preference, - dns.rdata._escapify(self.flags), - dns.rdata._escapify(self.service), - dns.rdata._escapify(self.regexp), - replacement) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - order = tok.get_uint16() - preference = tok.get_uint16() - flags = tok.get_string() - service = tok.get_string() - regexp = tok.get_string() - replacement = tok.get_name() - replacement = replacement.choose_relativity(origin, relativize) - tok.get_eol() - return cls(rdclass, rdtype, order, preference, flags, service, - regexp, replacement) - - def to_wire(self, file, compress=None, origin=None): - two_ints = struct.pack("!HH", self.order, self.preference) - file.write(two_ints) - _write_string(file, self.flags) - _write_string(file, self.service) - _write_string(file, self.regexp) - self.replacement.to_wire(file, compress, origin) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (order, preference) = struct.unpack('!HH', wire[current: current + 4]) - current += 4 - rdlen -= 4 - strings = [] - for i in xrange(3): - l = wire[current] - current += 1 - rdlen -= 1 - if l > rdlen or rdlen < 0: - raise dns.exception.FormError - s = wire[current: current + l].unwrap() - current += l - rdlen -= l - strings.append(s) - (replacement, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - if cused != rdlen: - raise dns.exception.FormError - if origin is not None: - replacement = replacement.relativize(origin) - return cls(rdclass, rdtype, order, preference, strings[0], strings[1], - strings[2], replacement) - - def choose_relativity(self, origin=None, relativize=True): - self.replacement = self.replacement.choose_relativity(origin, - relativize) diff --git a/lib/dns/rdtypes/IN/NSAP.py b/lib/dns/rdtypes/IN/NSAP.py deleted file mode 100644 index 336befc7..00000000 --- a/lib/dns/rdtypes/IN/NSAP.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import binascii - -import dns.exception -import dns.rdata -import dns.tokenizer - - -class NSAP(dns.rdata.Rdata): - - """NSAP record. - - @ivar address: a NASP - @type address: string - @see: RFC 1706""" - - __slots__ = ['address'] - - def __init__(self, rdclass, rdtype, address): - super(NSAP, self).__init__(rdclass, rdtype) - self.address = address - - def to_text(self, origin=None, relativize=True, **kw): - return "0x%s" % binascii.hexlify(self.address).decode() - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - address = tok.get_string() - tok.get_eol() - if address[0:2] != '0x': - raise dns.exception.SyntaxError('string does not start with 0x') - address = address[2:].replace('.', '') - if len(address) % 2 != 0: - raise dns.exception.SyntaxError('hexstring has odd length') - address = binascii.unhexlify(address.encode()) - return cls(rdclass, rdtype, address) - - def to_wire(self, file, compress=None, origin=None): - file.write(self.address) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - address = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, address) diff --git a/lib/dns/rdtypes/IN/NSAP_PTR.py b/lib/dns/rdtypes/IN/NSAP_PTR.py deleted file mode 100644 index a5b66c80..00000000 --- a/lib/dns/rdtypes/IN/NSAP_PTR.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.nsbase - - -class NSAP_PTR(dns.rdtypes.nsbase.UncompressedNS): - - """NSAP-PTR record""" diff --git a/lib/dns/rdtypes/IN/PX.py b/lib/dns/rdtypes/IN/PX.py deleted file mode 100644 index 2dbaee6c..00000000 --- a/lib/dns/rdtypes/IN/PX.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.name - - -class PX(dns.rdata.Rdata): - - """PX record. - - @ivar preference: the preference value - @type preference: int - @ivar map822: the map822 name - @type map822: dns.name.Name object - @ivar mapx400: the mapx400 name - @type mapx400: dns.name.Name object - @see: RFC 2163""" - - __slots__ = ['preference', 'map822', 'mapx400'] - - def __init__(self, rdclass, rdtype, preference, map822, mapx400): - super(PX, self).__init__(rdclass, rdtype) - self.preference = preference - self.map822 = map822 - self.mapx400 = mapx400 - - def to_text(self, origin=None, relativize=True, **kw): - map822 = self.map822.choose_relativity(origin, relativize) - mapx400 = self.mapx400.choose_relativity(origin, relativize) - return '%d %s %s' % (self.preference, map822, mapx400) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - preference = tok.get_uint16() - map822 = tok.get_name() - map822 = map822.choose_relativity(origin, relativize) - mapx400 = tok.get_name(None) - mapx400 = mapx400.choose_relativity(origin, relativize) - tok.get_eol() - return cls(rdclass, rdtype, preference, map822, mapx400) - - def to_wire(self, file, compress=None, origin=None): - pref = struct.pack("!H", self.preference) - file.write(pref) - self.map822.to_wire(file, None, origin) - self.mapx400.to_wire(file, None, origin) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (preference, ) = struct.unpack('!H', wire[current: current + 2]) - current += 2 - rdlen -= 2 - (map822, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - if cused > rdlen: - raise dns.exception.FormError - current += cused - rdlen -= cused - if origin is not None: - map822 = map822.relativize(origin) - (mapx400, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - if cused != rdlen: - raise dns.exception.FormError - if origin is not None: - mapx400 = mapx400.relativize(origin) - return cls(rdclass, rdtype, preference, map822, mapx400) - - def choose_relativity(self, origin=None, relativize=True): - self.map822 = self.map822.choose_relativity(origin, relativize) - self.mapx400 = self.mapx400.choose_relativity(origin, relativize) diff --git a/lib/dns/rdtypes/IN/SRV.py b/lib/dns/rdtypes/IN/SRV.py deleted file mode 100644 index b2c1bc9f..00000000 --- a/lib/dns/rdtypes/IN/SRV.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.name - - -class SRV(dns.rdata.Rdata): - - """SRV record - - @ivar priority: the priority - @type priority: int - @ivar weight: the weight - @type weight: int - @ivar port: the port of the service - @type port: int - @ivar target: the target host - @type target: dns.name.Name object - @see: RFC 2782""" - - __slots__ = ['priority', 'weight', 'port', 'target'] - - def __init__(self, rdclass, rdtype, priority, weight, port, target): - super(SRV, self).__init__(rdclass, rdtype) - self.priority = priority - self.weight = weight - self.port = port - self.target = target - - def to_text(self, origin=None, relativize=True, **kw): - target = self.target.choose_relativity(origin, relativize) - return '%d %d %d %s' % (self.priority, self.weight, self.port, - target) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - priority = tok.get_uint16() - weight = tok.get_uint16() - port = tok.get_uint16() - target = tok.get_name(None) - target = target.choose_relativity(origin, relativize) - tok.get_eol() - return cls(rdclass, rdtype, priority, weight, port, target) - - def to_wire(self, file, compress=None, origin=None): - three_ints = struct.pack("!HHH", self.priority, self.weight, self.port) - file.write(three_ints) - self.target.to_wire(file, compress, origin) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (priority, weight, port) = struct.unpack('!HHH', - wire[current: current + 6]) - current += 6 - rdlen -= 6 - (target, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - if cused != rdlen: - raise dns.exception.FormError - if origin is not None: - target = target.relativize(origin) - return cls(rdclass, rdtype, priority, weight, port, target) - - def choose_relativity(self, origin=None, relativize=True): - self.target = self.target.choose_relativity(origin, relativize) diff --git a/lib/dns/rdtypes/IN/WKS.py b/lib/dns/rdtypes/IN/WKS.py deleted file mode 100644 index 96f98ada..00000000 --- a/lib/dns/rdtypes/IN/WKS.py +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import socket -import struct - -import dns.ipv4 -import dns.rdata -from dns._compat import xrange - -_proto_tcp = socket.getprotobyname('tcp') -_proto_udp = socket.getprotobyname('udp') - - -class WKS(dns.rdata.Rdata): - - """WKS record - - @ivar address: the address - @type address: string - @ivar protocol: the protocol - @type protocol: int - @ivar bitmap: the bitmap - @type bitmap: string - @see: RFC 1035""" - - __slots__ = ['address', 'protocol', 'bitmap'] - - def __init__(self, rdclass, rdtype, address, protocol, bitmap): - super(WKS, self).__init__(rdclass, rdtype) - self.address = address - self.protocol = protocol - if not isinstance(bitmap, bytearray): - self.bitmap = bytearray(bitmap) - else: - self.bitmap = bitmap - - def to_text(self, origin=None, relativize=True, **kw): - bits = [] - for i in xrange(0, len(self.bitmap)): - byte = self.bitmap[i] - for j in xrange(0, 8): - if byte & (0x80 >> j): - bits.append(str(i * 8 + j)) - text = ' '.join(bits) - return '%s %d %s' % (self.address, self.protocol, text) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - address = tok.get_string() - protocol = tok.get_string() - if protocol.isdigit(): - protocol = int(protocol) - else: - protocol = socket.getprotobyname(protocol) - bitmap = bytearray() - while 1: - token = tok.get().unescape() - if token.is_eol_or_eof(): - break - if token.value.isdigit(): - serv = int(token.value) - else: - if protocol != _proto_udp and protocol != _proto_tcp: - raise NotImplementedError("protocol must be TCP or UDP") - if protocol == _proto_udp: - protocol_text = "udp" - else: - protocol_text = "tcp" - serv = socket.getservbyname(token.value, protocol_text) - i = serv // 8 - l = len(bitmap) - if l < i + 1: - for j in xrange(l, i + 1): - bitmap.append(0) - bitmap[i] = bitmap[i] | (0x80 >> (serv % 8)) - bitmap = dns.rdata._truncate_bitmap(bitmap) - return cls(rdclass, rdtype, address, protocol, bitmap) - - def to_wire(self, file, compress=None, origin=None): - file.write(dns.ipv4.inet_aton(self.address)) - protocol = struct.pack('!B', self.protocol) - file.write(protocol) - file.write(self.bitmap) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - address = dns.ipv4.inet_ntoa(wire[current: current + 4]) - protocol, = struct.unpack('!B', wire[current + 4: current + 5]) - current += 5 - rdlen -= 5 - bitmap = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, address, protocol, bitmap) diff --git a/lib/dns/rdtypes/IN/__init__.py b/lib/dns/rdtypes/IN/__init__.py deleted file mode 100644 index d7e69c9f..00000000 --- a/lib/dns/rdtypes/IN/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Class IN rdata type classes.""" - -__all__ = [ - 'A', - 'AAAA', - 'APL', - 'DHCID', - 'IPSECKEY', - 'KX', - 'NAPTR', - 'NSAP', - 'NSAP_PTR', - 'PX', - 'SRV', - 'WKS', -] diff --git a/lib/dns/rdtypes/__init__.py b/lib/dns/rdtypes/__init__.py deleted file mode 100644 index 1ac137f1..00000000 --- a/lib/dns/rdtypes/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS rdata type classes""" - -__all__ = [ - 'ANY', - 'IN', - 'CH', - 'euibase', - 'mxbase', - 'nsbase', -] diff --git a/lib/dns/rdtypes/dnskeybase.py b/lib/dns/rdtypes/dnskeybase.py deleted file mode 100644 index 3e7e87ef..00000000 --- a/lib/dns/rdtypes/dnskeybase.py +++ /dev/null @@ -1,138 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import base64 -import struct - -import dns.exception -import dns.dnssec -import dns.rdata - -# wildcard import -__all__ = ["SEP", "REVOKE", "ZONE", - "flags_to_text_set", "flags_from_text_set"] - -# flag constants -SEP = 0x0001 -REVOKE = 0x0080 -ZONE = 0x0100 - -_flag_by_text = { - 'SEP': SEP, - 'REVOKE': REVOKE, - 'ZONE': ZONE -} - -# We construct the inverse mapping programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mapping not to be true inverse. -_flag_by_value = {y: x for x, y in _flag_by_text.items()} - - -def flags_to_text_set(flags): - """Convert a DNSKEY flags value to set texts - @rtype: set([string])""" - - flags_set = set() - mask = 0x1 - while mask <= 0x8000: - if flags & mask: - text = _flag_by_value.get(mask) - if not text: - text = hex(mask) - flags_set.add(text) - mask <<= 1 - return flags_set - - -def flags_from_text_set(texts_set): - """Convert set of DNSKEY flag mnemonic texts to DNSKEY flag value - @rtype: int""" - - flags = 0 - for text in texts_set: - try: - flags += _flag_by_text[text] - except KeyError: - raise NotImplementedError( - "DNSKEY flag '%s' is not supported" % text) - return flags - - -class DNSKEYBase(dns.rdata.Rdata): - - """Base class for rdata that is like a DNSKEY record - - @ivar flags: the key flags - @type flags: int - @ivar protocol: the protocol for which this key may be used - @type protocol: int - @ivar algorithm: the algorithm used for the key - @type algorithm: int - @ivar key: the public key - @type key: string""" - - __slots__ = ['flags', 'protocol', 'algorithm', 'key'] - - def __init__(self, rdclass, rdtype, flags, protocol, algorithm, key): - super(DNSKEYBase, self).__init__(rdclass, rdtype) - self.flags = flags - self.protocol = protocol - self.algorithm = algorithm - self.key = key - - def to_text(self, origin=None, relativize=True, **kw): - return '%d %d %d %s' % (self.flags, self.protocol, self.algorithm, - dns.rdata._base64ify(self.key)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - flags = tok.get_uint16() - protocol = tok.get_uint8() - algorithm = dns.dnssec.algorithm_from_text(tok.get_string()) - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - b64 = b''.join(chunks) - key = base64.b64decode(b64) - return cls(rdclass, rdtype, flags, protocol, algorithm, key) - - def to_wire(self, file, compress=None, origin=None): - header = struct.pack("!HBB", self.flags, self.protocol, self.algorithm) - file.write(header) - file.write(self.key) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - if rdlen < 4: - raise dns.exception.FormError - header = struct.unpack('!HBB', wire[current: current + 4]) - current += 4 - rdlen -= 4 - key = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, header[0], header[1], header[2], - key) - - def flags_to_text_set(self): - """Convert a DNSKEY flags value to set texts - @rtype: set([string])""" - return flags_to_text_set(self.flags) diff --git a/lib/dns/rdtypes/dnskeybase.pyi b/lib/dns/rdtypes/dnskeybase.pyi deleted file mode 100644 index e102a698..00000000 --- a/lib/dns/rdtypes/dnskeybase.pyi +++ /dev/null @@ -1,37 +0,0 @@ -from typing import Set, Any - -SEP : int -REVOKE : int -ZONE : int - -def flags_to_text_set(flags : int) -> Set[str]: - ... - -def flags_from_text_set(texts_set) -> int: - ... - -from .. import rdata - -class DNSKEYBase(rdata.Rdata): - def __init__(self, rdclass, rdtype, flags, protocol, algorithm, key): - self.flags : int - self.protocol : int - self.key : str - self.algorithm : int - - def to_text(self, origin : Any = None, relativize=True, **kw : Any): - ... - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - ... - - def to_wire(self, file, compress=None, origin=None): - ... - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - ... - - def flags_to_text_set(self) -> Set[str]: - ... diff --git a/lib/dns/rdtypes/dsbase.py b/lib/dns/rdtypes/dsbase.py deleted file mode 100644 index 26ae9d5c..00000000 --- a/lib/dns/rdtypes/dsbase.py +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2010, 2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct -import binascii - -import dns.rdata -import dns.rdatatype - - -class DSBase(dns.rdata.Rdata): - - """Base class for rdata that is like a DS record - - @ivar key_tag: the key tag - @type key_tag: int - @ivar algorithm: the algorithm - @type algorithm: int - @ivar digest_type: the digest type - @type digest_type: int - @ivar digest: the digest - @type digest: int - @see: draft-ietf-dnsext-delegation-signer-14.txt""" - - __slots__ = ['key_tag', 'algorithm', 'digest_type', 'digest'] - - def __init__(self, rdclass, rdtype, key_tag, algorithm, digest_type, - digest): - super(DSBase, self).__init__(rdclass, rdtype) - self.key_tag = key_tag - self.algorithm = algorithm - self.digest_type = digest_type - self.digest = digest - - def to_text(self, origin=None, relativize=True, **kw): - return '%d %d %d %s' % (self.key_tag, self.algorithm, - self.digest_type, - dns.rdata._hexify(self.digest, - chunksize=128)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - key_tag = tok.get_uint16() - algorithm = tok.get_uint8() - digest_type = tok.get_uint8() - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - digest = b''.join(chunks) - digest = binascii.unhexlify(digest) - return cls(rdclass, rdtype, key_tag, algorithm, digest_type, - digest) - - def to_wire(self, file, compress=None, origin=None): - header = struct.pack("!HBB", self.key_tag, self.algorithm, - self.digest_type) - file.write(header) - file.write(self.digest) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - header = struct.unpack("!HBB", wire[current: current + 4]) - current += 4 - rdlen -= 4 - digest = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, header[0], header[1], header[2], digest) diff --git a/lib/dns/rdtypes/euibase.py b/lib/dns/rdtypes/euibase.py deleted file mode 100644 index cc5fdaa6..00000000 --- a/lib/dns/rdtypes/euibase.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright (C) 2015 Red Hat, Inc. -# Author: Petr Spacek <pspacek@redhat.com> -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import binascii - -import dns.rdata -from dns._compat import xrange - - -class EUIBase(dns.rdata.Rdata): - - """EUIxx record - - @ivar fingerprint: xx-bit Extended Unique Identifier (EUI-xx) - @type fingerprint: string - @see: rfc7043.txt""" - - __slots__ = ['eui'] - # define these in subclasses - # byte_len = 6 # 0123456789ab (in hex) - # text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab - - def __init__(self, rdclass, rdtype, eui): - super(EUIBase, self).__init__(rdclass, rdtype) - if len(eui) != self.byte_len: - raise dns.exception.FormError('EUI%s rdata has to have %s bytes' - % (self.byte_len * 8, self.byte_len)) - self.eui = eui - - def to_text(self, origin=None, relativize=True, **kw): - return dns.rdata._hexify(self.eui, chunksize=2).replace(' ', '-') - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - text = tok.get_string() - tok.get_eol() - if len(text) != cls.text_len: - raise dns.exception.SyntaxError( - 'Input text must have %s characters' % cls.text_len) - expected_dash_idxs = xrange(2, cls.byte_len * 3 - 1, 3) - for i in expected_dash_idxs: - if text[i] != '-': - raise dns.exception.SyntaxError('Dash expected at position %s' - % i) - text = text.replace('-', '') - try: - data = binascii.unhexlify(text.encode()) - except (ValueError, TypeError) as ex: - raise dns.exception.SyntaxError('Hex decoding error: %s' % str(ex)) - return cls(rdclass, rdtype, data) - - def to_wire(self, file, compress=None, origin=None): - file.write(self.eui) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - eui = wire[current:current + rdlen].unwrap() - return cls(rdclass, rdtype, eui) diff --git a/lib/dns/rdtypes/mxbase.py b/lib/dns/rdtypes/mxbase.py deleted file mode 100644 index 9a3fa623..00000000 --- a/lib/dns/rdtypes/mxbase.py +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""MX-like base classes.""" - -from io import BytesIO -import struct - -import dns.exception -import dns.rdata -import dns.name - - -class MXBase(dns.rdata.Rdata): - - """Base class for rdata that is like an MX record. - - @ivar preference: the preference value - @type preference: int - @ivar exchange: the exchange name - @type exchange: dns.name.Name object""" - - __slots__ = ['preference', 'exchange'] - - def __init__(self, rdclass, rdtype, preference, exchange): - super(MXBase, self).__init__(rdclass, rdtype) - self.preference = preference - self.exchange = exchange - - def to_text(self, origin=None, relativize=True, **kw): - exchange = self.exchange.choose_relativity(origin, relativize) - return '%d %s' % (self.preference, exchange) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - preference = tok.get_uint16() - exchange = tok.get_name() - exchange = exchange.choose_relativity(origin, relativize) - tok.get_eol() - return cls(rdclass, rdtype, preference, exchange) - - def to_wire(self, file, compress=None, origin=None): - pref = struct.pack("!H", self.preference) - file.write(pref) - self.exchange.to_wire(file, compress, origin) - - def to_digestable(self, origin=None): - return struct.pack("!H", self.preference) + \ - self.exchange.to_digestable(origin) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (preference, ) = struct.unpack('!H', wire[current: current + 2]) - current += 2 - rdlen -= 2 - (exchange, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - if cused != rdlen: - raise dns.exception.FormError - if origin is not None: - exchange = exchange.relativize(origin) - return cls(rdclass, rdtype, preference, exchange) - - def choose_relativity(self, origin=None, relativize=True): - self.exchange = self.exchange.choose_relativity(origin, relativize) - - -class UncompressedMX(MXBase): - - """Base class for rdata that is like an MX record, but whose name - is not compressed when converted to DNS wire format, and whose - digestable form is not downcased.""" - - def to_wire(self, file, compress=None, origin=None): - super(UncompressedMX, self).to_wire(file, None, origin) - - def to_digestable(self, origin=None): - f = BytesIO() - self.to_wire(f, None, origin) - return f.getvalue() - - -class UncompressedDowncasingMX(MXBase): - - """Base class for rdata that is like an MX record, but whose name - is not compressed when convert to DNS wire format.""" - - def to_wire(self, file, compress=None, origin=None): - super(UncompressedDowncasingMX, self).to_wire(file, None, origin) diff --git a/lib/dns/rdtypes/nsbase.py b/lib/dns/rdtypes/nsbase.py deleted file mode 100644 index 97a22326..00000000 --- a/lib/dns/rdtypes/nsbase.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""NS-like base classes.""" - -from io import BytesIO - -import dns.exception -import dns.rdata -import dns.name - - -class NSBase(dns.rdata.Rdata): - - """Base class for rdata that is like an NS record. - - @ivar target: the target name of the rdata - @type target: dns.name.Name object""" - - __slots__ = ['target'] - - def __init__(self, rdclass, rdtype, target): - super(NSBase, self).__init__(rdclass, rdtype) - self.target = target - - def to_text(self, origin=None, relativize=True, **kw): - target = self.target.choose_relativity(origin, relativize) - return str(target) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - target = tok.get_name() - target = target.choose_relativity(origin, relativize) - tok.get_eol() - return cls(rdclass, rdtype, target) - - def to_wire(self, file, compress=None, origin=None): - self.target.to_wire(file, compress, origin) - - def to_digestable(self, origin=None): - return self.target.to_digestable(origin) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (target, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - if cused != rdlen: - raise dns.exception.FormError - if origin is not None: - target = target.relativize(origin) - return cls(rdclass, rdtype, target) - - def choose_relativity(self, origin=None, relativize=True): - self.target = self.target.choose_relativity(origin, relativize) - - -class UncompressedNS(NSBase): - - """Base class for rdata that is like an NS record, but whose name - is not compressed when convert to DNS wire format, and whose - digestable form is not downcased.""" - - def to_wire(self, file, compress=None, origin=None): - super(UncompressedNS, self).to_wire(file, None, origin) - - def to_digestable(self, origin=None): - f = BytesIO() - self.to_wire(f, None, origin) - return f.getvalue() diff --git a/lib/dns/rdtypes/txtbase.py b/lib/dns/rdtypes/txtbase.py deleted file mode 100644 index 645a57ec..00000000 --- a/lib/dns/rdtypes/txtbase.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2006-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""TXT-like base class.""" - -import struct - -import dns.exception -import dns.rdata -import dns.tokenizer -from dns._compat import binary_type, string_types - - -class TXTBase(dns.rdata.Rdata): - - """Base class for rdata that is like a TXT record - - @ivar strings: the strings - @type strings: list of binary - @see: RFC 1035""" - - __slots__ = ['strings'] - - def __init__(self, rdclass, rdtype, strings): - super(TXTBase, self).__init__(rdclass, rdtype) - if isinstance(strings, binary_type) or \ - isinstance(strings, string_types): - strings = [strings] - self.strings = [] - for string in strings: - if isinstance(string, string_types): - string = string.encode() - self.strings.append(string) - - def to_text(self, origin=None, relativize=True, **kw): - txt = '' - prefix = '' - for s in self.strings: - txt += '{}"{}"'.format(prefix, dns.rdata._escapify(s)) - prefix = ' ' - return txt - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - strings = [] - while 1: - token = tok.get().unescape() - if token.is_eol_or_eof(): - break - if not (token.is_quoted_string() or token.is_identifier()): - raise dns.exception.SyntaxError("expected a string") - if len(token.value) > 255: - raise dns.exception.SyntaxError("string too long") - value = token.value - if isinstance(value, binary_type): - strings.append(value) - else: - strings.append(value.encode()) - if len(strings) == 0: - raise dns.exception.UnexpectedEnd - return cls(rdclass, rdtype, strings) - - def to_wire(self, file, compress=None, origin=None): - for s in self.strings: - l = len(s) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(s) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - strings = [] - while rdlen > 0: - l = wire[current] - current += 1 - rdlen -= 1 - if l > rdlen: - raise dns.exception.FormError - s = wire[current: current + l].unwrap() - current += l - rdlen -= l - strings.append(s) - return cls(rdclass, rdtype, strings) diff --git a/lib/dns/rdtypes/txtbase.pyi b/lib/dns/rdtypes/txtbase.pyi deleted file mode 100644 index af447d50..00000000 --- a/lib/dns/rdtypes/txtbase.pyi +++ /dev/null @@ -1,6 +0,0 @@ -from .. import rdata - -class TXTBase(rdata.Rdata): - ... -class TXT(TXTBase): - ... diff --git a/lib/dns/renderer.py b/lib/dns/renderer.py deleted file mode 100644 index d7ef8c7f..00000000 --- a/lib/dns/renderer.py +++ /dev/null @@ -1,291 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Help for building DNS wire format messages""" - -from io import BytesIO -import struct -import random -import time - -import dns.exception -import dns.tsig -from ._compat import long - - -QUESTION = 0 -ANSWER = 1 -AUTHORITY = 2 -ADDITIONAL = 3 - - -class Renderer(object): - """Helper class for building DNS wire-format messages. - - Most applications can use the higher-level L{dns.message.Message} - class and its to_wire() method to generate wire-format messages. - This class is for those applications which need finer control - over the generation of messages. - - Typical use:: - - r = dns.renderer.Renderer(id=1, flags=0x80, max_size=512) - r.add_question(qname, qtype, qclass) - r.add_rrset(dns.renderer.ANSWER, rrset_1) - r.add_rrset(dns.renderer.ANSWER, rrset_2) - r.add_rrset(dns.renderer.AUTHORITY, ns_rrset) - r.add_edns(0, 0, 4096) - r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_1) - r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_2) - r.write_header() - r.add_tsig(keyname, secret, 300, 1, 0, '', request_mac) - wire = r.get_wire() - - output, a BytesIO, where rendering is written - - id: the message id - - flags: the message flags - - max_size: the maximum size of the message - - origin: the origin to use when rendering relative names - - compress: the compression table - - section: an int, the section currently being rendered - - counts: list of the number of RRs in each section - - mac: the MAC of the rendered message (if TSIG was used) - """ - - def __init__(self, id=None, flags=0, max_size=65535, origin=None): - """Initialize a new renderer.""" - - self.output = BytesIO() - if id is None: - self.id = random.randint(0, 65535) - else: - self.id = id - self.flags = flags - self.max_size = max_size - self.origin = origin - self.compress = {} - self.section = QUESTION - self.counts = [0, 0, 0, 0] - self.output.write(b'\x00' * 12) - self.mac = '' - - def _rollback(self, where): - """Truncate the output buffer at offset *where*, and remove any - compression table entries that pointed beyond the truncation - point. - """ - - self.output.seek(where) - self.output.truncate() - keys_to_delete = [] - for k, v in self.compress.items(): - if v >= where: - keys_to_delete.append(k) - for k in keys_to_delete: - del self.compress[k] - - def _set_section(self, section): - """Set the renderer's current section. - - Sections must be rendered order: QUESTION, ANSWER, AUTHORITY, - ADDITIONAL. Sections may be empty. - - Raises dns.exception.FormError if an attempt was made to set - a section value less than the current section. - """ - - if self.section != section: - if self.section > section: - raise dns.exception.FormError - self.section = section - - def add_question(self, qname, rdtype, rdclass=dns.rdataclass.IN): - """Add a question to the message.""" - - self._set_section(QUESTION) - before = self.output.tell() - qname.to_wire(self.output, self.compress, self.origin) - self.output.write(struct.pack("!HH", rdtype, rdclass)) - after = self.output.tell() - if after >= self.max_size: - self._rollback(before) - raise dns.exception.TooBig - self.counts[QUESTION] += 1 - - def add_rrset(self, section, rrset, **kw): - """Add the rrset to the specified section. - - Any keyword arguments are passed on to the rdataset's to_wire() - routine. - """ - - self._set_section(section) - before = self.output.tell() - n = rrset.to_wire(self.output, self.compress, self.origin, **kw) - after = self.output.tell() - if after >= self.max_size: - self._rollback(before) - raise dns.exception.TooBig - self.counts[section] += n - - def add_rdataset(self, section, name, rdataset, **kw): - """Add the rdataset to the specified section, using the specified - name as the owner name. - - Any keyword arguments are passed on to the rdataset's to_wire() - routine. - """ - - self._set_section(section) - before = self.output.tell() - n = rdataset.to_wire(name, self.output, self.compress, self.origin, - **kw) - after = self.output.tell() - if after >= self.max_size: - self._rollback(before) - raise dns.exception.TooBig - self.counts[section] += n - - def add_edns(self, edns, ednsflags, payload, options=None): - """Add an EDNS OPT record to the message.""" - - # make sure the EDNS version in ednsflags agrees with edns - ednsflags &= long(0xFF00FFFF) - ednsflags |= (edns << 16) - self._set_section(ADDITIONAL) - before = self.output.tell() - self.output.write(struct.pack('!BHHIH', 0, dns.rdatatype.OPT, payload, - ednsflags, 0)) - if options is not None: - lstart = self.output.tell() - for opt in options: - stuff = struct.pack("!HH", opt.otype, 0) - self.output.write(stuff) - start = self.output.tell() - opt.to_wire(self.output) - end = self.output.tell() - assert end - start < 65536 - self.output.seek(start - 2) - stuff = struct.pack("!H", end - start) - self.output.write(stuff) - self.output.seek(0, 2) - lend = self.output.tell() - assert lend - lstart < 65536 - self.output.seek(lstart - 2) - stuff = struct.pack("!H", lend - lstart) - self.output.write(stuff) - self.output.seek(0, 2) - after = self.output.tell() - if after >= self.max_size: - self._rollback(before) - raise dns.exception.TooBig - self.counts[ADDITIONAL] += 1 - - def add_tsig(self, keyname, secret, fudge, id, tsig_error, other_data, - request_mac, algorithm=dns.tsig.default_algorithm): - """Add a TSIG signature to the message.""" - - s = self.output.getvalue() - (tsig_rdata, self.mac, ctx) = dns.tsig.sign(s, - keyname, - secret, - int(time.time()), - fudge, - id, - tsig_error, - other_data, - request_mac, - algorithm=algorithm) - self._write_tsig(tsig_rdata, keyname) - - def add_multi_tsig(self, ctx, keyname, secret, fudge, id, tsig_error, - other_data, request_mac, - algorithm=dns.tsig.default_algorithm): - """Add a TSIG signature to the message. Unlike add_tsig(), this can be - used for a series of consecutive DNS envelopes, e.g. for a zone - transfer over TCP [RFC2845, 4.4]. - - For the first message in the sequence, give ctx=None. For each - subsequent message, give the ctx that was returned from the - add_multi_tsig() call for the previous message.""" - - s = self.output.getvalue() - (tsig_rdata, self.mac, ctx) = dns.tsig.sign(s, - keyname, - secret, - int(time.time()), - fudge, - id, - tsig_error, - other_data, - request_mac, - ctx=ctx, - first=ctx is None, - multi=True, - algorithm=algorithm) - self._write_tsig(tsig_rdata, keyname) - return ctx - - def _write_tsig(self, tsig_rdata, keyname): - self._set_section(ADDITIONAL) - before = self.output.tell() - - keyname.to_wire(self.output, self.compress, self.origin) - self.output.write(struct.pack('!HHIH', dns.rdatatype.TSIG, - dns.rdataclass.ANY, 0, 0)) - rdata_start = self.output.tell() - self.output.write(tsig_rdata) - - after = self.output.tell() - assert after - rdata_start < 65536 - if after >= self.max_size: - self._rollback(before) - raise dns.exception.TooBig - - self.output.seek(rdata_start - 2) - self.output.write(struct.pack('!H', after - rdata_start)) - self.counts[ADDITIONAL] += 1 - self.output.seek(10) - self.output.write(struct.pack('!H', self.counts[ADDITIONAL])) - self.output.seek(0, 2) - - def write_header(self): - """Write the DNS message header. - - Writing the DNS message header is done after all sections - have been rendered, but before the optional TSIG signature - is added. - """ - - self.output.seek(0) - self.output.write(struct.pack('!HHHHHH', self.id, self.flags, - self.counts[0], self.counts[1], - self.counts[2], self.counts[3])) - self.output.seek(0, 2) - - def get_wire(self): - """Return the wire format message.""" - - return self.output.getvalue() diff --git a/lib/dns/resolver.py b/lib/dns/resolver.py deleted file mode 100644 index 806e5b2b..00000000 --- a/lib/dns/resolver.py +++ /dev/null @@ -1,1383 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS stub resolver.""" - -import socket -import sys -import time -import random - -try: - import threading as _threading -except ImportError: - import dummy_threading as _threading - -import dns.exception -import dns.flags -import dns.ipv4 -import dns.ipv6 -import dns.message -import dns.name -import dns.query -import dns.rcode -import dns.rdataclass -import dns.rdatatype -import dns.reversename -import dns.tsig -from ._compat import xrange, string_types - -if sys.platform == 'win32': - try: - import winreg as _winreg - except ImportError: - import _winreg # pylint: disable=import-error - -class NXDOMAIN(dns.exception.DNSException): - """The DNS query name does not exist.""" - supp_kwargs = {'qnames', 'responses'} - fmt = None # we have our own __str__ implementation - - def _check_kwargs(self, qnames, responses=None): - if not isinstance(qnames, (list, tuple, set)): - raise AttributeError("qnames must be a list, tuple or set") - if len(qnames) == 0: - raise AttributeError("qnames must contain at least one element") - if responses is None: - responses = {} - elif not isinstance(responses, dict): - raise AttributeError("responses must be a dict(qname=response)") - kwargs = dict(qnames=qnames, responses=responses) - return kwargs - - def __str__(self): - if 'qnames' not in self.kwargs: - return super(NXDOMAIN, self).__str__() - qnames = self.kwargs['qnames'] - if len(qnames) > 1: - msg = 'None of DNS query names exist' - else: - msg = 'The DNS query name does not exist' - qnames = ', '.join(map(str, qnames)) - return "{}: {}".format(msg, qnames) - - def canonical_name(self): - if not 'qnames' in self.kwargs: - raise TypeError("parametrized exception required") - IN = dns.rdataclass.IN - CNAME = dns.rdatatype.CNAME - cname = None - for qname in self.kwargs['qnames']: - response = self.kwargs['responses'][qname] - for answer in response.answer: - if answer.rdtype != CNAME or answer.rdclass != IN: - continue - cname = answer.items[0].target.to_text() - if cname is not None: - return dns.name.from_text(cname) - return self.kwargs['qnames'][0] - canonical_name = property(canonical_name, doc=( - "Return the unresolved canonical name.")) - - def __add__(self, e_nx): - """Augment by results from another NXDOMAIN exception.""" - qnames0 = list(self.kwargs.get('qnames', [])) - responses0 = dict(self.kwargs.get('responses', {})) - responses1 = e_nx.kwargs.get('responses', {}) - for qname1 in e_nx.kwargs.get('qnames', []): - if qname1 not in qnames0: - qnames0.append(qname1) - if qname1 in responses1: - responses0[qname1] = responses1[qname1] - return NXDOMAIN(qnames=qnames0, responses=responses0) - - def qnames(self): - """All of the names that were tried. - - Returns a list of ``dns.name.Name``. - """ - return self.kwargs['qnames'] - - def responses(self): - """A map from queried names to their NXDOMAIN responses. - - Returns a dict mapping a ``dns.name.Name`` to a - ``dns.message.Message``. - """ - return self.kwargs['responses'] - - def response(self, qname): - """The response for query *qname*. - - Returns a ``dns.message.Message``. - """ - return self.kwargs['responses'][qname] - - -class YXDOMAIN(dns.exception.DNSException): - """The DNS query name is too long after DNAME substitution.""" - -# The definition of the Timeout exception has moved from here to the -# dns.exception module. We keep dns.resolver.Timeout defined for -# backwards compatibility. - -Timeout = dns.exception.Timeout - - -class NoAnswer(dns.exception.DNSException): - """The DNS response does not contain an answer to the question.""" - fmt = 'The DNS response does not contain an answer ' + \ - 'to the question: {query}' - supp_kwargs = {'response'} - - def _fmt_kwargs(self, **kwargs): - return super(NoAnswer, self)._fmt_kwargs( - query=kwargs['response'].question) - - -class NoNameservers(dns.exception.DNSException): - """All nameservers failed to answer the query. - - errors: list of servers and respective errors - The type of errors is - [(server IP address, any object convertible to string)]. - Non-empty errors list will add explanatory message () - """ - - msg = "All nameservers failed to answer the query." - fmt = "%s {query}: {errors}" % msg[:-1] - supp_kwargs = {'request', 'errors'} - - def _fmt_kwargs(self, **kwargs): - srv_msgs = [] - for err in kwargs['errors']: - srv_msgs.append('Server {} {} port {} answered {}'.format(err[0], - 'TCP' if err[1] else 'UDP', err[2], err[3])) - return super(NoNameservers, self)._fmt_kwargs( - query=kwargs['request'].question, errors='; '.join(srv_msgs)) - - -class NotAbsolute(dns.exception.DNSException): - """An absolute domain name is required but a relative name was provided.""" - - -class NoRootSOA(dns.exception.DNSException): - """There is no SOA RR at the DNS root name. This should never happen!""" - - -class NoMetaqueries(dns.exception.DNSException): - """DNS metaqueries are not allowed.""" - - -class Answer(object): - """DNS stub resolver answer. - - Instances of this class bundle up the result of a successful DNS - resolution. - - For convenience, the answer object implements much of the sequence - protocol, forwarding to its ``rrset`` attribute. E.g. - ``for a in answer`` is equivalent to ``for a in answer.rrset``. - ``answer[i]`` is equivalent to ``answer.rrset[i]``, and - ``answer[i:j]`` is equivalent to ``answer.rrset[i:j]``. - - Note that CNAMEs or DNAMEs in the response may mean that answer - RRset's name might not be the query name. - """ - - def __init__(self, qname, rdtype, rdclass, response, - raise_on_no_answer=True): - self.qname = qname - self.rdtype = rdtype - self.rdclass = rdclass - self.response = response - min_ttl = -1 - rrset = None - for count in xrange(0, 15): - try: - rrset = response.find_rrset(response.answer, qname, - rdclass, rdtype) - if min_ttl == -1 or rrset.ttl < min_ttl: - min_ttl = rrset.ttl - break - except KeyError: - if rdtype != dns.rdatatype.CNAME: - try: - crrset = response.find_rrset(response.answer, - qname, - rdclass, - dns.rdatatype.CNAME) - if min_ttl == -1 or crrset.ttl < min_ttl: - min_ttl = crrset.ttl - for rd in crrset: - qname = rd.target - break - continue - except KeyError: - if raise_on_no_answer: - raise NoAnswer(response=response) - if raise_on_no_answer: - raise NoAnswer(response=response) - if rrset is None and raise_on_no_answer: - raise NoAnswer(response=response) - self.canonical_name = qname - self.rrset = rrset - if rrset is None: - while 1: - # Look for a SOA RR whose owner name is a superdomain - # of qname. - try: - srrset = response.find_rrset(response.authority, qname, - rdclass, dns.rdatatype.SOA) - if min_ttl == -1 or srrset.ttl < min_ttl: - min_ttl = srrset.ttl - if srrset[0].minimum < min_ttl: - min_ttl = srrset[0].minimum - break - except KeyError: - try: - qname = qname.parent() - except dns.name.NoParent: - break - self.expiration = time.time() + min_ttl - - def __getattr__(self, attr): - if attr == 'name': - return self.rrset.name - elif attr == 'ttl': - return self.rrset.ttl - elif attr == 'covers': - return self.rrset.covers - elif attr == 'rdclass': - return self.rrset.rdclass - elif attr == 'rdtype': - return self.rrset.rdtype - else: - raise AttributeError(attr) - - def __len__(self): - return self.rrset and len(self.rrset) or 0 - - def __iter__(self): - return self.rrset and iter(self.rrset) or iter(tuple()) - - def __getitem__(self, i): - if self.rrset is None: - raise IndexError - return self.rrset[i] - - def __delitem__(self, i): - if self.rrset is None: - raise IndexError - del self.rrset[i] - - -class Cache(object): - """Simple thread-safe DNS answer cache.""" - - def __init__(self, cleaning_interval=300.0): - """*cleaning_interval*, a ``float`` is the number of seconds between - periodic cleanings. - """ - - self.data = {} - self.cleaning_interval = cleaning_interval - self.next_cleaning = time.time() + self.cleaning_interval - self.lock = _threading.Lock() - - def _maybe_clean(self): - """Clean the cache if it's time to do so.""" - - now = time.time() - if self.next_cleaning <= now: - keys_to_delete = [] - for (k, v) in self.data.items(): - if v.expiration <= now: - keys_to_delete.append(k) - for k in keys_to_delete: - del self.data[k] - now = time.time() - self.next_cleaning = now + self.cleaning_interval - - def get(self, key): - """Get the answer associated with *key*. - - Returns None if no answer is cached for the key. - - *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the - query name, rdtype, and rdclass respectively. - - Returns a ``dns.resolver.Answer`` or ``None``. - """ - - try: - self.lock.acquire() - self._maybe_clean() - v = self.data.get(key) - if v is None or v.expiration <= time.time(): - return None - return v - finally: - self.lock.release() - - def put(self, key, value): - """Associate key and value in the cache. - - *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the - query name, rdtype, and rdclass respectively. - - *value*, a ``dns.resolver.Answer``, the answer. - """ - - try: - self.lock.acquire() - self._maybe_clean() - self.data[key] = value - finally: - self.lock.release() - - def flush(self, key=None): - """Flush the cache. - - If *key* is not ``None``, only that item is flushed. Otherwise - the entire cache is flushed. - - *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the - query name, rdtype, and rdclass respectively. - """ - - try: - self.lock.acquire() - if key is not None: - if key in self.data: - del self.data[key] - else: - self.data = {} - self.next_cleaning = time.time() + self.cleaning_interval - finally: - self.lock.release() - - -class LRUCacheNode(object): - """LRUCache node.""" - - def __init__(self, key, value): - self.key = key - self.value = value - self.prev = self - self.next = self - - def link_before(self, node): - self.prev = node.prev - self.next = node - node.prev.next = self - node.prev = self - - def link_after(self, node): - self.prev = node - self.next = node.next - node.next.prev = self - node.next = self - - def unlink(self): - self.next.prev = self.prev - self.prev.next = self.next - - -class LRUCache(object): - """Thread-safe, bounded, least-recently-used DNS answer cache. - - This cache is better than the simple cache (above) if you're - running a web crawler or other process that does a lot of - resolutions. The LRUCache has a maximum number of nodes, and when - it is full, the least-recently used node is removed to make space - for a new one. - """ - - def __init__(self, max_size=100000): - """*max_size*, an ``int``, is the maximum number of nodes to cache; - it must be greater than 0. - """ - - self.data = {} - self.set_max_size(max_size) - self.sentinel = LRUCacheNode(None, None) - self.lock = _threading.Lock() - - def set_max_size(self, max_size): - if max_size < 1: - max_size = 1 - self.max_size = max_size - - def get(self, key): - """Get the answer associated with *key*. - - Returns None if no answer is cached for the key. - - *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the - query name, rdtype, and rdclass respectively. - - Returns a ``dns.resolver.Answer`` or ``None``. - """ - - try: - self.lock.acquire() - node = self.data.get(key) - if node is None: - return None - # Unlink because we're either going to move the node to the front - # of the LRU list or we're going to free it. - node.unlink() - if node.value.expiration <= time.time(): - del self.data[node.key] - return None - node.link_after(self.sentinel) - return node.value - finally: - self.lock.release() - - def put(self, key, value): - """Associate key and value in the cache. - - *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the - query name, rdtype, and rdclass respectively. - - *value*, a ``dns.resolver.Answer``, the answer. - """ - - try: - self.lock.acquire() - node = self.data.get(key) - if node is not None: - node.unlink() - del self.data[node.key] - while len(self.data) >= self.max_size: - node = self.sentinel.prev - node.unlink() - del self.data[node.key] - node = LRUCacheNode(key, value) - node.link_after(self.sentinel) - self.data[key] = node - finally: - self.lock.release() - - def flush(self, key=None): - """Flush the cache. - - If *key* is not ``None``, only that item is flushed. Otherwise - the entire cache is flushed. - - *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the - query name, rdtype, and rdclass respectively. - """ - - try: - self.lock.acquire() - if key is not None: - node = self.data.get(key) - if node is not None: - node.unlink() - del self.data[node.key] - else: - node = self.sentinel.next - while node != self.sentinel: - next = node.next - node.prev = None - node.next = None - node = next - self.data = {} - finally: - self.lock.release() - - -class Resolver(object): - """DNS stub resolver.""" - - def __init__(self, filename='/etc/resolv.conf', configure=True): - """*filename*, a ``text`` or file object, specifying a file - in standard /etc/resolv.conf format. This parameter is meaningful - only when *configure* is true and the platform is POSIX. - - *configure*, a ``bool``. If True (the default), the resolver - instance is configured in the normal fashion for the operating - system the resolver is running on. (I.e. by reading a - /etc/resolv.conf file on POSIX systems and from the registry - on Windows systems.) - """ - - self.domain = None - self.nameservers = None - self.nameserver_ports = None - self.port = None - self.search = None - self.timeout = None - self.lifetime = None - self.keyring = None - self.keyname = None - self.keyalgorithm = None - self.edns = None - self.ednsflags = None - self.payload = None - self.cache = None - self.flags = None - self.retry_servfail = False - self.rotate = False - - self.reset() - if configure: - if sys.platform == 'win32': - self.read_registry() - elif filename: - self.read_resolv_conf(filename) - - def reset(self): - """Reset all resolver configuration to the defaults.""" - - self.domain = \ - dns.name.Name(dns.name.from_text(socket.gethostname())[1:]) - if len(self.domain) == 0: - self.domain = dns.name.root - self.nameservers = [] - self.nameserver_ports = {} - self.port = 53 - self.search = [] - self.timeout = 2.0 - self.lifetime = 30.0 - self.keyring = None - self.keyname = None - self.keyalgorithm = dns.tsig.default_algorithm - self.edns = -1 - self.ednsflags = 0 - self.payload = 0 - self.cache = None - self.flags = None - self.retry_servfail = False - self.rotate = False - - def read_resolv_conf(self, f): - """Process *f* as a file in the /etc/resolv.conf format. If f is - a ``text``, it is used as the name of the file to open; otherwise it - is treated as the file itself.""" - - if isinstance(f, string_types): - try: - f = open(f, 'r') - except IOError: - # /etc/resolv.conf doesn't exist, can't be read, etc. - # We'll just use the default resolver configuration. - self.nameservers = ['127.0.0.1'] - return - want_close = True - else: - want_close = False - try: - for l in f: - if len(l) == 0 or l[0] == '#' or l[0] == ';': - continue - tokens = l.split() - - # Any line containing less than 2 tokens is malformed - if len(tokens) < 2: - continue - - if tokens[0] == 'nameserver': - self.nameservers.append(tokens[1]) - elif tokens[0] == 'domain': - self.domain = dns.name.from_text(tokens[1]) - elif tokens[0] == 'search': - for suffix in tokens[1:]: - self.search.append(dns.name.from_text(suffix)) - elif tokens[0] == 'options': - if 'rotate' in tokens[1:]: - self.rotate = True - finally: - if want_close: - f.close() - if len(self.nameservers) == 0: - self.nameservers.append('127.0.0.1') - - def _determine_split_char(self, entry): - # - # The windows registry irritatingly changes the list element - # delimiter in between ' ' and ',' (and vice-versa) in various - # versions of windows. - # - if entry.find(' ') >= 0: - split_char = ' ' - elif entry.find(',') >= 0: - split_char = ',' - else: - # probably a singleton; treat as a space-separated list. - split_char = ' ' - return split_char - - def _config_win32_nameservers(self, nameservers): - # we call str() on nameservers to convert it from unicode to ascii - nameservers = str(nameservers) - split_char = self._determine_split_char(nameservers) - ns_list = nameservers.split(split_char) - for ns in ns_list: - if ns not in self.nameservers: - self.nameservers.append(ns) - - def _config_win32_domain(self, domain): - # we call str() on domain to convert it from unicode to ascii - self.domain = dns.name.from_text(str(domain)) - - def _config_win32_search(self, search): - # we call str() on search to convert it from unicode to ascii - search = str(search) - split_char = self._determine_split_char(search) - search_list = search.split(split_char) - for s in search_list: - if s not in self.search: - self.search.append(dns.name.from_text(s)) - - def _config_win32_fromkey(self, key, always_try_domain): - try: - servers, rtype = _winreg.QueryValueEx(key, 'NameServer') - except WindowsError: # pylint: disable=undefined-variable - servers = None - if servers: - self._config_win32_nameservers(servers) - if servers or always_try_domain: - try: - dom, rtype = _winreg.QueryValueEx(key, 'Domain') - if dom: - self._config_win32_domain(dom) - except WindowsError: # pylint: disable=undefined-variable - pass - else: - try: - servers, rtype = _winreg.QueryValueEx(key, 'DhcpNameServer') - except WindowsError: # pylint: disable=undefined-variable - servers = None - if servers: - self._config_win32_nameservers(servers) - try: - dom, rtype = _winreg.QueryValueEx(key, 'DhcpDomain') - if dom: - self._config_win32_domain(dom) - except WindowsError: # pylint: disable=undefined-variable - pass - try: - search, rtype = _winreg.QueryValueEx(key, 'SearchList') - except WindowsError: # pylint: disable=undefined-variable - search = None - if search: - self._config_win32_search(search) - - def read_registry(self): - """Extract resolver configuration from the Windows registry.""" - - lm = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) - want_scan = False - try: - try: - # XP, 2000 - tcp_params = _winreg.OpenKey(lm, - r'SYSTEM\CurrentControlSet' - r'\Services\Tcpip\Parameters') - want_scan = True - except EnvironmentError: - # ME - tcp_params = _winreg.OpenKey(lm, - r'SYSTEM\CurrentControlSet' - r'\Services\VxD\MSTCP') - try: - self._config_win32_fromkey(tcp_params, True) - finally: - tcp_params.Close() - if want_scan: - interfaces = _winreg.OpenKey(lm, - r'SYSTEM\CurrentControlSet' - r'\Services\Tcpip\Parameters' - r'\Interfaces') - try: - i = 0 - while True: - try: - guid = _winreg.EnumKey(interfaces, i) - i += 1 - key = _winreg.OpenKey(interfaces, guid) - if not self._win32_is_nic_enabled(lm, guid, key): - continue - try: - self._config_win32_fromkey(key, False) - finally: - key.Close() - except EnvironmentError: - break - finally: - interfaces.Close() - finally: - lm.Close() - - def _win32_is_nic_enabled(self, lm, guid, interface_key): - # Look in the Windows Registry to determine whether the network - # interface corresponding to the given guid is enabled. - # - # (Code contributed by Paul Marks, thanks!) - # - try: - # This hard-coded location seems to be consistent, at least - # from Windows 2000 through Vista. - connection_key = _winreg.OpenKey( - lm, - r'SYSTEM\CurrentControlSet\Control\Network' - r'\{4D36E972-E325-11CE-BFC1-08002BE10318}' - r'\%s\Connection' % guid) - - try: - # The PnpInstanceID points to a key inside Enum - (pnp_id, ttype) = _winreg.QueryValueEx( - connection_key, 'PnpInstanceID') - - if ttype != _winreg.REG_SZ: - raise ValueError - - device_key = _winreg.OpenKey( - lm, r'SYSTEM\CurrentControlSet\Enum\%s' % pnp_id) - - try: - # Get ConfigFlags for this device - (flags, ttype) = _winreg.QueryValueEx( - device_key, 'ConfigFlags') - - if ttype != _winreg.REG_DWORD: - raise ValueError - - # Based on experimentation, bit 0x1 indicates that the - # device is disabled. - return not flags & 0x1 - - finally: - device_key.Close() - finally: - connection_key.Close() - except (EnvironmentError, ValueError): - # Pre-vista, enabled interfaces seem to have a non-empty - # NTEContextList; this was how dnspython detected enabled - # nics before the code above was contributed. We've retained - # the old method since we don't know if the code above works - # on Windows 95/98/ME. - try: - (nte, ttype) = _winreg.QueryValueEx(interface_key, - 'NTEContextList') - return nte is not None - except WindowsError: # pylint: disable=undefined-variable - return False - - def _compute_timeout(self, start, lifetime=None): - lifetime = self.lifetime if lifetime is None else lifetime - now = time.time() - duration = now - start - if duration < 0: - if duration < -1: - # Time going backwards is bad. Just give up. - raise Timeout(timeout=duration) - else: - # Time went backwards, but only a little. This can - # happen, e.g. under vmware with older linux kernels. - # Pretend it didn't happen. - now = start - if duration >= lifetime: - raise Timeout(timeout=duration) - return min(lifetime - duration, self.timeout) - - def query(self, qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN, - tcp=False, source=None, raise_on_no_answer=True, source_port=0, - lifetime=None): - """Query nameservers to find the answer to the question. - - The *qname*, *rdtype*, and *rdclass* parameters may be objects - of the appropriate type, or strings that can be converted into objects - of the appropriate type. - - *qname*, a ``dns.name.Name`` or ``text``, the query name. - - *rdtype*, an ``int`` or ``text``, the query type. - - *rdclass*, an ``int`` or ``text``, the query class. - - *tcp*, a ``bool``. If ``True``, use TCP to make the query. - - *source*, a ``text`` or ``None``. If not ``None``, bind to this IP - address when making queries. - - *raise_on_no_answer*, a ``bool``. If ``True``, raise - ``dns.resolver.NoAnswer`` if there's no answer to the question. - - *source_port*, an ``int``, the port from which to send the message. - - *lifetime*, a ``float``, how long query should run before timing out. - - Raises ``dns.exception.Timeout`` if no answers could be found - in the specified lifetime. - - Raises ``dns.resolver.NXDOMAIN`` if the query name does not exist. - - Raises ``dns.resolver.YXDOMAIN`` if the query name is too long after - DNAME substitution. - - Raises ``dns.resolver.NoAnswer`` if *raise_on_no_answer* is - ``True`` and the query name exists but has no RRset of the - desired type and class. - - Raises ``dns.resolver.NoNameservers`` if no non-broken - nameservers are available to answer the question. - - Returns a ``dns.resolver.Answer`` instance. - """ - - if isinstance(qname, string_types): - qname = dns.name.from_text(qname, None) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if dns.rdatatype.is_metatype(rdtype): - raise NoMetaqueries - if isinstance(rdclass, string_types): - rdclass = dns.rdataclass.from_text(rdclass) - if dns.rdataclass.is_metaclass(rdclass): - raise NoMetaqueries - qnames_to_try = [] - if qname.is_absolute(): - qnames_to_try.append(qname) - else: - if len(qname) > 1: - qnames_to_try.append(qname.concatenate(dns.name.root)) - if self.search: - for suffix in self.search: - qnames_to_try.append(qname.concatenate(suffix)) - else: - qnames_to_try.append(qname.concatenate(self.domain)) - all_nxdomain = True - nxdomain_responses = {} - start = time.time() - _qname = None # make pylint happy - for _qname in qnames_to_try: - if self.cache: - answer = self.cache.get((_qname, rdtype, rdclass)) - if answer is not None: - if answer.rrset is None and raise_on_no_answer: - raise NoAnswer(response=answer.response) - else: - return answer - request = dns.message.make_query(_qname, rdtype, rdclass) - if self.keyname is not None: - request.use_tsig(self.keyring, self.keyname, - algorithm=self.keyalgorithm) - request.use_edns(self.edns, self.ednsflags, self.payload) - if self.flags is not None: - request.flags = self.flags - response = None - # - # make a copy of the servers list so we can alter it later. - # - nameservers = self.nameservers[:] - errors = [] - if self.rotate: - random.shuffle(nameservers) - backoff = 0.10 - while response is None: - if len(nameservers) == 0: - raise NoNameservers(request=request, errors=errors) - for nameserver in nameservers[:]: - timeout = self._compute_timeout(start, lifetime) - port = self.nameserver_ports.get(nameserver, self.port) - try: - tcp_attempt = tcp - if tcp: - response = dns.query.tcp(request, nameserver, - timeout, port, - source=source, - source_port=source_port) - else: - response = dns.query.udp(request, nameserver, - timeout, port, - source=source, - source_port=source_port) - if response.flags & dns.flags.TC: - # Response truncated; retry with TCP. - tcp_attempt = True - timeout = self._compute_timeout(start, lifetime) - response = \ - dns.query.tcp(request, nameserver, - timeout, port, - source=source, - source_port=source_port) - except (socket.error, dns.exception.Timeout) as ex: - # - # Communication failure or timeout. Go to the - # next server - # - errors.append((nameserver, tcp_attempt, port, ex, - response)) - response = None - continue - except dns.query.UnexpectedSource as ex: - # - # Who knows? Keep going. - # - errors.append((nameserver, tcp_attempt, port, ex, - response)) - response = None - continue - except dns.exception.FormError as ex: - # - # We don't understand what this server is - # saying. Take it out of the mix and - # continue. - # - nameservers.remove(nameserver) - errors.append((nameserver, tcp_attempt, port, ex, - response)) - response = None - continue - except EOFError as ex: - # - # We're using TCP and they hung up on us. - # Probably they don't support TCP (though - # they're supposed to!). Take it out of the - # mix and continue. - # - nameservers.remove(nameserver) - errors.append((nameserver, tcp_attempt, port, ex, - response)) - response = None - continue - rcode = response.rcode() - if rcode == dns.rcode.YXDOMAIN: - ex = YXDOMAIN() - errors.append((nameserver, tcp_attempt, port, ex, - response)) - raise ex - if rcode == dns.rcode.NOERROR or \ - rcode == dns.rcode.NXDOMAIN: - break - # - # We got a response, but we're not happy with the - # rcode in it. Remove the server from the mix if - # the rcode isn't SERVFAIL. - # - if rcode != dns.rcode.SERVFAIL or not self.retry_servfail: - nameservers.remove(nameserver) - errors.append((nameserver, tcp_attempt, port, - dns.rcode.to_text(rcode), response)) - response = None - if response is not None: - break - # - # All nameservers failed! - # - if len(nameservers) > 0: - # - # But we still have servers to try. Sleep a bit - # so we don't pound them! - # - timeout = self._compute_timeout(start, lifetime) - sleep_time = min(timeout, backoff) - backoff *= 2 - time.sleep(sleep_time) - if response.rcode() == dns.rcode.NXDOMAIN: - nxdomain_responses[_qname] = response - continue - all_nxdomain = False - break - if all_nxdomain: - raise NXDOMAIN(qnames=qnames_to_try, responses=nxdomain_responses) - answer = Answer(_qname, rdtype, rdclass, response, - raise_on_no_answer) - if self.cache: - self.cache.put((_qname, rdtype, rdclass), answer) - return answer - - def use_tsig(self, keyring, keyname=None, - algorithm=dns.tsig.default_algorithm): - """Add a TSIG signature to the query. - - See the documentation of the Message class for a complete - description of the keyring dictionary. - - *keyring*, a ``dict``, the TSIG keyring to use. If a - *keyring* is specified but a *keyname* is not, then the key - used will be the first key in the *keyring*. Note that the - order of keys in a dictionary is not defined, so applications - should supply a keyname when a keyring is used, unless they - know the keyring contains only one key. - - *keyname*, a ``dns.name.Name`` or ``None``, the name of the TSIG key - to use; defaults to ``None``. The key must be defined in the keyring. - - *algorithm*, a ``dns.name.Name``, the TSIG algorithm to use. - """ - - self.keyring = keyring - if keyname is None: - self.keyname = list(self.keyring.keys())[0] - else: - self.keyname = keyname - self.keyalgorithm = algorithm - - def use_edns(self, edns, ednsflags, payload): - """Configure EDNS behavior. - - *edns*, an ``int``, is the EDNS level to use. Specifying - ``None``, ``False``, or ``-1`` means "do not use EDNS", and in this case - the other parameters are ignored. Specifying ``True`` is - equivalent to specifying 0, i.e. "use EDNS0". - - *ednsflags*, an ``int``, the EDNS flag values. - - *payload*, an ``int``, is the EDNS sender's payload field, which is the - maximum size of UDP datagram the sender can handle. I.e. how big - a response to this message can be. - """ - - if edns is None: - edns = -1 - self.edns = edns - self.ednsflags = ednsflags - self.payload = payload - - def set_flags(self, flags): - """Overrides the default flags with your own. - - *flags*, an ``int``, the message flags to use. - """ - - self.flags = flags - - -#: The default resolver. -default_resolver = None - - -def get_default_resolver(): - """Get the default resolver, initializing it if necessary.""" - if default_resolver is None: - reset_default_resolver() - return default_resolver - - -def reset_default_resolver(): - """Re-initialize default resolver. - - Note that the resolver configuration (i.e. /etc/resolv.conf on UNIX - systems) will be re-read immediately. - """ - - global default_resolver - default_resolver = Resolver() - - -def query(qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN, - tcp=False, source=None, raise_on_no_answer=True, - source_port=0, lifetime=None): - """Query nameservers to find the answer to the question. - - This is a convenience function that uses the default resolver - object to make the query. - - See ``dns.resolver.Resolver.query`` for more information on the - parameters. - """ - - return get_default_resolver().query(qname, rdtype, rdclass, tcp, source, - raise_on_no_answer, source_port, - lifetime) - - -def zone_for_name(name, rdclass=dns.rdataclass.IN, tcp=False, resolver=None): - """Find the name of the zone which contains the specified name. - - *name*, an absolute ``dns.name.Name`` or ``text``, the query name. - - *rdclass*, an ``int``, the query class. - - *tcp*, a ``bool``. If ``True``, use TCP to make the query. - - *resolver*, a ``dns.resolver.Resolver`` or ``None``, the resolver to use. - If ``None``, the default resolver is used. - - Raises ``dns.resolver.NoRootSOA`` if there is no SOA RR at the DNS - root. (This is only likely to happen if you're using non-default - root servers in your network and they are misconfigured.) - - Returns a ``dns.name.Name``. - """ - - if isinstance(name, string_types): - name = dns.name.from_text(name, dns.name.root) - if resolver is None: - resolver = get_default_resolver() - if not name.is_absolute(): - raise NotAbsolute(name) - while 1: - try: - answer = resolver.query(name, dns.rdatatype.SOA, rdclass, tcp) - if answer.rrset.name == name: - return name - # otherwise we were CNAMEd or DNAMEd and need to look higher - except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer): - pass - try: - name = name.parent() - except dns.name.NoParent: - raise NoRootSOA - -# -# Support for overriding the system resolver for all python code in the -# running process. -# - -_protocols_for_socktype = { - socket.SOCK_DGRAM: [socket.SOL_UDP], - socket.SOCK_STREAM: [socket.SOL_TCP], -} - -_resolver = None -_original_getaddrinfo = socket.getaddrinfo -_original_getnameinfo = socket.getnameinfo -_original_getfqdn = socket.getfqdn -_original_gethostbyname = socket.gethostbyname -_original_gethostbyname_ex = socket.gethostbyname_ex -_original_gethostbyaddr = socket.gethostbyaddr - - -def _getaddrinfo(host=None, service=None, family=socket.AF_UNSPEC, socktype=0, - proto=0, flags=0): - if flags & (socket.AI_ADDRCONFIG | socket.AI_V4MAPPED) != 0: - raise NotImplementedError - if host is None and service is None: - raise socket.gaierror(socket.EAI_NONAME) - v6addrs = [] - v4addrs = [] - canonical_name = None - try: - # Is host None or a V6 address literal? - if host is None: - canonical_name = 'localhost' - if flags & socket.AI_PASSIVE != 0: - v6addrs.append('::') - v4addrs.append('0.0.0.0') - else: - v6addrs.append('::1') - v4addrs.append('127.0.0.1') - else: - parts = host.split('%') - if len(parts) == 2: - ahost = parts[0] - else: - ahost = host - addr = dns.ipv6.inet_aton(ahost) - v6addrs.append(host) - canonical_name = host - except Exception: - try: - # Is it a V4 address literal? - addr = dns.ipv4.inet_aton(host) - v4addrs.append(host) - canonical_name = host - except Exception: - if flags & socket.AI_NUMERICHOST == 0: - try: - if family == socket.AF_INET6 or family == socket.AF_UNSPEC: - v6 = _resolver.query(host, dns.rdatatype.AAAA, - raise_on_no_answer=False) - # Note that setting host ensures we query the same name - # for A as we did for AAAA. - host = v6.qname - canonical_name = v6.canonical_name.to_text(True) - if v6.rrset is not None: - for rdata in v6.rrset: - v6addrs.append(rdata.address) - if family == socket.AF_INET or family == socket.AF_UNSPEC: - v4 = _resolver.query(host, dns.rdatatype.A, - raise_on_no_answer=False) - host = v4.qname - canonical_name = v4.canonical_name.to_text(True) - if v4.rrset is not None: - for rdata in v4.rrset: - v4addrs.append(rdata.address) - except dns.resolver.NXDOMAIN: - raise socket.gaierror(socket.EAI_NONAME) - except Exception: - raise socket.gaierror(socket.EAI_SYSTEM) - port = None - try: - # Is it a port literal? - if service is None: - port = 0 - else: - port = int(service) - except Exception: - if flags & socket.AI_NUMERICSERV == 0: - try: - port = socket.getservbyname(service) - except Exception: - pass - if port is None: - raise socket.gaierror(socket.EAI_NONAME) - tuples = [] - if socktype == 0: - socktypes = [socket.SOCK_DGRAM, socket.SOCK_STREAM] - else: - socktypes = [socktype] - if flags & socket.AI_CANONNAME != 0: - cname = canonical_name - else: - cname = '' - if family == socket.AF_INET6 or family == socket.AF_UNSPEC: - for addr in v6addrs: - for socktype in socktypes: - for proto in _protocols_for_socktype[socktype]: - tuples.append((socket.AF_INET6, socktype, proto, - cname, (addr, port, 0, 0))) - if family == socket.AF_INET or family == socket.AF_UNSPEC: - for addr in v4addrs: - for socktype in socktypes: - for proto in _protocols_for_socktype[socktype]: - tuples.append((socket.AF_INET, socktype, proto, - cname, (addr, port))) - if len(tuples) == 0: - raise socket.gaierror(socket.EAI_NONAME) - return tuples - - -def _getnameinfo(sockaddr, flags=0): - host = sockaddr[0] - port = sockaddr[1] - if len(sockaddr) == 4: - scope = sockaddr[3] - family = socket.AF_INET6 - else: - scope = None - family = socket.AF_INET - tuples = _getaddrinfo(host, port, family, socket.SOCK_STREAM, - socket.SOL_TCP, 0) - if len(tuples) > 1: - raise socket.error('sockaddr resolved to multiple addresses') - addr = tuples[0][4][0] - if flags & socket.NI_DGRAM: - pname = 'udp' - else: - pname = 'tcp' - qname = dns.reversename.from_address(addr) - if flags & socket.NI_NUMERICHOST == 0: - try: - answer = _resolver.query(qname, 'PTR') - hostname = answer.rrset[0].target.to_text(True) - except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer): - if flags & socket.NI_NAMEREQD: - raise socket.gaierror(socket.EAI_NONAME) - hostname = addr - if scope is not None: - hostname += '%' + str(scope) - else: - hostname = addr - if scope is not None: - hostname += '%' + str(scope) - if flags & socket.NI_NUMERICSERV: - service = str(port) - else: - service = socket.getservbyport(port, pname) - return (hostname, service) - - -def _getfqdn(name=None): - if name is None: - name = socket.gethostname() - try: - return _getnameinfo(_getaddrinfo(name, 80)[0][4])[0] - except Exception: - return name - - -def _gethostbyname(name): - return _gethostbyname_ex(name)[2][0] - - -def _gethostbyname_ex(name): - aliases = [] - addresses = [] - tuples = _getaddrinfo(name, 0, socket.AF_INET, socket.SOCK_STREAM, - socket.SOL_TCP, socket.AI_CANONNAME) - canonical = tuples[0][3] - for item in tuples: - addresses.append(item[4][0]) - # XXX we just ignore aliases - return (canonical, aliases, addresses) - - -def _gethostbyaddr(ip): - try: - dns.ipv6.inet_aton(ip) - sockaddr = (ip, 80, 0, 0) - family = socket.AF_INET6 - except Exception: - sockaddr = (ip, 80) - family = socket.AF_INET - (name, port) = _getnameinfo(sockaddr, socket.NI_NAMEREQD) - aliases = [] - addresses = [] - tuples = _getaddrinfo(name, 0, family, socket.SOCK_STREAM, socket.SOL_TCP, - socket.AI_CANONNAME) - canonical = tuples[0][3] - for item in tuples: - addresses.append(item[4][0]) - # XXX we just ignore aliases - return (canonical, aliases, addresses) - - -def override_system_resolver(resolver=None): - """Override the system resolver routines in the socket module with - versions which use dnspython's resolver. - - This can be useful in testing situations where you want to control - the resolution behavior of python code without having to change - the system's resolver settings (e.g. /etc/resolv.conf). - - The resolver to use may be specified; if it's not, the default - resolver will be used. - - resolver, a ``dns.resolver.Resolver`` or ``None``, the resolver to use. - """ - - if resolver is None: - resolver = get_default_resolver() - global _resolver - _resolver = resolver - socket.getaddrinfo = _getaddrinfo - socket.getnameinfo = _getnameinfo - socket.getfqdn = _getfqdn - socket.gethostbyname = _gethostbyname - socket.gethostbyname_ex = _gethostbyname_ex - socket.gethostbyaddr = _gethostbyaddr - - -def restore_system_resolver(): - """Undo the effects of prior override_system_resolver().""" - - global _resolver - _resolver = None - socket.getaddrinfo = _original_getaddrinfo - socket.getnameinfo = _original_getnameinfo - socket.getfqdn = _original_getfqdn - socket.gethostbyname = _original_gethostbyname - socket.gethostbyname_ex = _original_gethostbyname_ex - socket.gethostbyaddr = _original_gethostbyaddr diff --git a/lib/dns/resolver.pyi b/lib/dns/resolver.pyi deleted file mode 100644 index e839ec21..00000000 --- a/lib/dns/resolver.pyi +++ /dev/null @@ -1,31 +0,0 @@ -from typing import Union, Optional, List -from . import exception, rdataclass, name, rdatatype - -import socket -_gethostbyname = socket.gethostbyname -class NXDOMAIN(exception.DNSException): - ... -def query(qname : str, rdtype : Union[int,str] = 0, rdclass : Union[int,str] = 0, - tcp=False, source=None, raise_on_no_answer=True, - source_port=0): - ... -class LRUCache: - def __init__(self, max_size=1000): - ... - def get(self, key): - ... - def put(self, key, val): - ... -class Answer: - def __init__(self, qname, rdtype, rdclass, response, - raise_on_no_answer=True): - ... -def zone_for_name(name, rdclass : int = rdataclass.IN, tcp=False, resolver : Optional[Resolver] = None): - ... - -class Resolver: - def __init__(self, configure): - self.nameservers : List[str] - def query(self, qname : str, rdtype : Union[int,str] = rdatatype.A, rdclass : Union[int,str] = rdataclass.IN, - tcp : bool = False, source : Optional[str] = None, raise_on_no_answer=True, source_port : int = 0): - ... diff --git a/lib/dns/reversename.py b/lib/dns/reversename.py deleted file mode 100644 index 8f095fa9..00000000 --- a/lib/dns/reversename.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2006-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Reverse Map Names.""" - -import binascii - -import dns.name -import dns.ipv6 -import dns.ipv4 - -from dns._compat import PY3 - -ipv4_reverse_domain = dns.name.from_text('in-addr.arpa.') -ipv6_reverse_domain = dns.name.from_text('ip6.arpa.') - - -def from_address(text): - """Convert an IPv4 or IPv6 address in textual form into a Name object whose - value is the reverse-map domain name of the address. - - *text*, a ``text``, is an IPv4 or IPv6 address in textual form - (e.g. '127.0.0.1', '::1') - - Raises ``dns.exception.SyntaxError`` if the address is badly formed. - - Returns a ``dns.name.Name``. - """ - - try: - v6 = dns.ipv6.inet_aton(text) - if dns.ipv6.is_mapped(v6): - if PY3: - parts = ['%d' % byte for byte in v6[12:]] - else: - parts = ['%d' % ord(byte) for byte in v6[12:]] - origin = ipv4_reverse_domain - else: - parts = [x for x in str(binascii.hexlify(v6).decode())] - origin = ipv6_reverse_domain - except Exception: - parts = ['%d' % - byte for byte in bytearray(dns.ipv4.inet_aton(text))] - origin = ipv4_reverse_domain - parts.reverse() - return dns.name.from_text('.'.join(parts), origin=origin) - - -def to_address(name): - """Convert a reverse map domain name into textual address form. - - *name*, a ``dns.name.Name``, an IPv4 or IPv6 address in reverse-map name - form. - - Raises ``dns.exception.SyntaxError`` if the name does not have a - reverse-map form. - - Returns a ``text``. - """ - - if name.is_subdomain(ipv4_reverse_domain): - name = name.relativize(ipv4_reverse_domain) - labels = list(name.labels) - labels.reverse() - text = b'.'.join(labels) - # run through inet_aton() to check syntax and make pretty. - return dns.ipv4.inet_ntoa(dns.ipv4.inet_aton(text)) - elif name.is_subdomain(ipv6_reverse_domain): - name = name.relativize(ipv6_reverse_domain) - labels = list(name.labels) - labels.reverse() - parts = [] - i = 0 - l = len(labels) - while i < l: - parts.append(b''.join(labels[i:i + 4])) - i += 4 - text = b':'.join(parts) - # run through inet_aton() to check syntax and make pretty. - return dns.ipv6.inet_ntoa(dns.ipv6.inet_aton(text)) - else: - raise dns.exception.SyntaxError('unknown reverse-map address family') diff --git a/lib/dns/reversename.pyi b/lib/dns/reversename.pyi deleted file mode 100644 index 97f072ea..00000000 --- a/lib/dns/reversename.pyi +++ /dev/null @@ -1,6 +0,0 @@ -from . import name -def from_address(text : str) -> name.Name: - ... - -def to_address(name : name.Name) -> str: - ... diff --git a/lib/dns/rrset.py b/lib/dns/rrset.py deleted file mode 100644 index a53ec324..00000000 --- a/lib/dns/rrset.py +++ /dev/null @@ -1,189 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS RRsets (an RRset is a named rdataset)""" - - -import dns.name -import dns.rdataset -import dns.rdataclass -import dns.renderer -from ._compat import string_types - - -class RRset(dns.rdataset.Rdataset): - - """A DNS RRset (named rdataset). - - RRset inherits from Rdataset, and RRsets can be treated as - Rdatasets in most cases. There are, however, a few notable - exceptions. RRsets have different to_wire() and to_text() method - arguments, reflecting the fact that RRsets always have an owner - name. - """ - - __slots__ = ['name', 'deleting'] - - def __init__(self, name, rdclass, rdtype, covers=dns.rdatatype.NONE, - deleting=None): - """Create a new RRset.""" - - super(RRset, self).__init__(rdclass, rdtype, covers) - self.name = name - self.deleting = deleting - - def _clone(self): - obj = super(RRset, self)._clone() - obj.name = self.name - obj.deleting = self.deleting - return obj - - def __repr__(self): - if self.covers == 0: - ctext = '' - else: - ctext = '(' + dns.rdatatype.to_text(self.covers) + ')' - if self.deleting is not None: - dtext = ' delete=' + dns.rdataclass.to_text(self.deleting) - else: - dtext = '' - return '<DNS ' + str(self.name) + ' ' + \ - dns.rdataclass.to_text(self.rdclass) + ' ' + \ - dns.rdatatype.to_text(self.rdtype) + ctext + dtext + ' RRset>' - - def __str__(self): - return self.to_text() - - def __eq__(self, other): - if not isinstance(other, RRset): - return False - if self.name != other.name: - return False - return super(RRset, self).__eq__(other) - - def match(self, name, rdclass, rdtype, covers, deleting=None): - """Returns ``True`` if this rrset matches the specified class, type, - covers, and deletion state. - """ - - if not super(RRset, self).match(rdclass, rdtype, covers): - return False - if self.name != name or self.deleting != deleting: - return False - return True - - def to_text(self, origin=None, relativize=True, **kw): - """Convert the RRset into DNS master file format. - - See ``dns.name.Name.choose_relativity`` for more information - on how *origin* and *relativize* determine the way names - are emitted. - - Any additional keyword arguments are passed on to the rdata - ``to_text()`` method. - - *origin*, a ``dns.name.Name`` or ``None``, the origin for relative - names. - - *relativize*, a ``bool``. If ``True``, names will be relativized - to *origin*. - """ - - return super(RRset, self).to_text(self.name, origin, relativize, - self.deleting, **kw) - - def to_wire(self, file, compress=None, origin=None, **kw): - """Convert the RRset to wire format. - - All keyword arguments are passed to ``dns.rdataset.to_wire()``; see - that function for details. - - Returns an ``int``, the number of records emitted. - """ - - return super(RRset, self).to_wire(self.name, file, compress, origin, - self.deleting, **kw) - - def to_rdataset(self): - """Convert an RRset into an Rdataset. - - Returns a ``dns.rdataset.Rdataset``. - """ - return dns.rdataset.from_rdata_list(self.ttl, list(self)) - - -def from_text_list(name, ttl, rdclass, rdtype, text_rdatas, - idna_codec=None): - """Create an RRset with the specified name, TTL, class, and type, and with - the specified list of rdatas in text format. - - Returns a ``dns.rrset.RRset`` object. - """ - - if isinstance(name, string_types): - name = dns.name.from_text(name, None, idna_codec=idna_codec) - if isinstance(rdclass, string_types): - rdclass = dns.rdataclass.from_text(rdclass) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - r = RRset(name, rdclass, rdtype) - r.update_ttl(ttl) - for t in text_rdatas: - rd = dns.rdata.from_text(r.rdclass, r.rdtype, t) - r.add(rd) - return r - - -def from_text(name, ttl, rdclass, rdtype, *text_rdatas): - """Create an RRset with the specified name, TTL, class, and type and with - the specified rdatas in text format. - - Returns a ``dns.rrset.RRset`` object. - """ - - return from_text_list(name, ttl, rdclass, rdtype, text_rdatas) - - -def from_rdata_list(name, ttl, rdatas, idna_codec=None): - """Create an RRset with the specified name and TTL, and with - the specified list of rdata objects. - - Returns a ``dns.rrset.RRset`` object. - """ - - if isinstance(name, string_types): - name = dns.name.from_text(name, None, idna_codec=idna_codec) - - if len(rdatas) == 0: - raise ValueError("rdata list must not be empty") - r = None - for rd in rdatas: - if r is None: - r = RRset(name, rd.rdclass, rd.rdtype) - r.update_ttl(ttl) - r.add(rd) - return r - - -def from_rdata(name, ttl, *rdatas): - """Create an RRset with the specified name and TTL, and with - the specified rdata objects. - - Returns a ``dns.rrset.RRset`` object. - """ - - return from_rdata_list(name, ttl, rdatas) diff --git a/lib/dns/rrset.pyi b/lib/dns/rrset.pyi deleted file mode 100644 index 0a81a2a0..00000000 --- a/lib/dns/rrset.pyi +++ /dev/null @@ -1,10 +0,0 @@ -from typing import List, Optional -from . import rdataset, rdatatype - -class RRset(rdataset.Rdataset): - def __init__(self, name, rdclass : int , rdtype : int, covers=rdatatype.NONE, - deleting : Optional[int] =None) -> None: - self.name = name - self.deleting = deleting -def from_text(name : str, ttl : int, rdclass : str, rdtype : str, *text_rdatas : str): - ... diff --git a/lib/dns/set.py b/lib/dns/set.py deleted file mode 100644 index 81329bf4..00000000 --- a/lib/dns/set.py +++ /dev/null @@ -1,261 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -class Set(object): - - """A simple set class. - - This class was originally used to deal with sets being missing in - ancient versions of python, but dnspython will continue to use it - as these sets are based on lists and are thus indexable, and this - ability is widely used in dnspython applications. - """ - - __slots__ = ['items'] - - def __init__(self, items=None): - """Initialize the set. - - *items*, an iterable or ``None``, the initial set of items. - """ - - self.items = [] - if items is not None: - for item in items: - self.add(item) - - def __repr__(self): - return "dns.simpleset.Set(%s)" % repr(self.items) - - def add(self, item): - """Add an item to the set. - """ - - if item not in self.items: - self.items.append(item) - - def remove(self, item): - """Remove an item from the set. - """ - - self.items.remove(item) - - def discard(self, item): - """Remove an item from the set if present. - """ - - try: - self.items.remove(item) - except ValueError: - pass - - def _clone(self): - """Make a (shallow) copy of the set. - - There is a 'clone protocol' that subclasses of this class - should use. To make a copy, first call your super's _clone() - method, and use the object returned as the new instance. Then - make shallow copies of the attributes defined in the subclass. - - This protocol allows us to write the set algorithms that - return new instances (e.g. union) once, and keep using them in - subclasses. - """ - - cls = self.__class__ - obj = cls.__new__(cls) - obj.items = list(self.items) - return obj - - def __copy__(self): - """Make a (shallow) copy of the set. - """ - - return self._clone() - - def copy(self): - """Make a (shallow) copy of the set. - """ - - return self._clone() - - def union_update(self, other): - """Update the set, adding any elements from other which are not - already in the set. - """ - - if not isinstance(other, Set): - raise ValueError('other must be a Set instance') - if self is other: - return - for item in other.items: - self.add(item) - - def intersection_update(self, other): - """Update the set, removing any elements from other which are not - in both sets. - """ - - if not isinstance(other, Set): - raise ValueError('other must be a Set instance') - if self is other: - return - # we make a copy of the list so that we can remove items from - # the list without breaking the iterator. - for item in list(self.items): - if item not in other.items: - self.items.remove(item) - - def difference_update(self, other): - """Update the set, removing any elements from other which are in - the set. - """ - - if not isinstance(other, Set): - raise ValueError('other must be a Set instance') - if self is other: - self.items = [] - else: - for item in other.items: - self.discard(item) - - def union(self, other): - """Return a new set which is the union of ``self`` and ``other``. - - Returns the same Set type as this set. - """ - - obj = self._clone() - obj.union_update(other) - return obj - - def intersection(self, other): - """Return a new set which is the intersection of ``self`` and - ``other``. - - Returns the same Set type as this set. - """ - - obj = self._clone() - obj.intersection_update(other) - return obj - - def difference(self, other): - """Return a new set which ``self`` - ``other``, i.e. the items - in ``self`` which are not also in ``other``. - - Returns the same Set type as this set. - """ - - obj = self._clone() - obj.difference_update(other) - return obj - - def __or__(self, other): - return self.union(other) - - def __and__(self, other): - return self.intersection(other) - - def __add__(self, other): - return self.union(other) - - def __sub__(self, other): - return self.difference(other) - - def __ior__(self, other): - self.union_update(other) - return self - - def __iand__(self, other): - self.intersection_update(other) - return self - - def __iadd__(self, other): - self.union_update(other) - return self - - def __isub__(self, other): - self.difference_update(other) - return self - - def update(self, other): - """Update the set, adding any elements from other which are not - already in the set. - - *other*, the collection of items with which to update the set, which - may be any iterable type. - """ - - for item in other: - self.add(item) - - def clear(self): - """Make the set empty.""" - self.items = [] - - def __eq__(self, other): - # Yes, this is inefficient but the sets we're dealing with are - # usually quite small, so it shouldn't hurt too much. - for item in self.items: - if item not in other.items: - return False - for item in other.items: - if item not in self.items: - return False - return True - - def __ne__(self, other): - return not self.__eq__(other) - - def __len__(self): - return len(self.items) - - def __iter__(self): - return iter(self.items) - - def __getitem__(self, i): - return self.items[i] - - def __delitem__(self, i): - del self.items[i] - - def issubset(self, other): - """Is this set a subset of *other*? - - Returns a ``bool``. - """ - - if not isinstance(other, Set): - raise ValueError('other must be a Set instance') - for item in self.items: - if item not in other.items: - return False - return True - - def issuperset(self, other): - """Is this set a superset of *other*? - - Returns a ``bool``. - """ - - if not isinstance(other, Set): - raise ValueError('other must be a Set instance') - for item in other.items: - if item not in self.items: - return False - return True diff --git a/lib/dns/tokenizer.py b/lib/dns/tokenizer.py deleted file mode 100644 index 880b71ce..00000000 --- a/lib/dns/tokenizer.py +++ /dev/null @@ -1,571 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Tokenize DNS master file format""" - -from io import StringIO -import sys - -import dns.exception -import dns.name -import dns.ttl -from ._compat import long, text_type, binary_type - -_DELIMITERS = { - ' ': True, - '\t': True, - '\n': True, - ';': True, - '(': True, - ')': True, - '"': True} - -_QUOTING_DELIMITERS = {'"': True} - -EOF = 0 -EOL = 1 -WHITESPACE = 2 -IDENTIFIER = 3 -QUOTED_STRING = 4 -COMMENT = 5 -DELIMITER = 6 - - -class UngetBufferFull(dns.exception.DNSException): - """An attempt was made to unget a token when the unget buffer was full.""" - - -class Token(object): - """A DNS master file format token. - - ttype: The token type - value: The token value - has_escape: Does the token value contain escapes? - """ - - def __init__(self, ttype, value='', has_escape=False): - """Initialize a token instance.""" - - self.ttype = ttype - self.value = value - self.has_escape = has_escape - - def is_eof(self): - return self.ttype == EOF - - def is_eol(self): - return self.ttype == EOL - - def is_whitespace(self): - return self.ttype == WHITESPACE - - def is_identifier(self): - return self.ttype == IDENTIFIER - - def is_quoted_string(self): - return self.ttype == QUOTED_STRING - - def is_comment(self): - return self.ttype == COMMENT - - def is_delimiter(self): - return self.ttype == DELIMITER - - def is_eol_or_eof(self): - return self.ttype == EOL or self.ttype == EOF - - def __eq__(self, other): - if not isinstance(other, Token): - return False - return (self.ttype == other.ttype and - self.value == other.value) - - def __ne__(self, other): - if not isinstance(other, Token): - return True - return (self.ttype != other.ttype or - self.value != other.value) - - def __str__(self): - return '%d "%s"' % (self.ttype, self.value) - - def unescape(self): - if not self.has_escape: - return self - unescaped = '' - l = len(self.value) - i = 0 - while i < l: - c = self.value[i] - i += 1 - if c == '\\': - if i >= l: - raise dns.exception.UnexpectedEnd - c = self.value[i] - i += 1 - if c.isdigit(): - if i >= l: - raise dns.exception.UnexpectedEnd - c2 = self.value[i] - i += 1 - if i >= l: - raise dns.exception.UnexpectedEnd - c3 = self.value[i] - i += 1 - if not (c2.isdigit() and c3.isdigit()): - raise dns.exception.SyntaxError - c = chr(int(c) * 100 + int(c2) * 10 + int(c3)) - unescaped += c - return Token(self.ttype, unescaped) - - # compatibility for old-style tuple tokens - - def __len__(self): - return 2 - - def __iter__(self): - return iter((self.ttype, self.value)) - - def __getitem__(self, i): - if i == 0: - return self.ttype - elif i == 1: - return self.value - else: - raise IndexError - - -class Tokenizer(object): - """A DNS master file format tokenizer. - - A token object is basically a (type, value) tuple. The valid - types are EOF, EOL, WHITESPACE, IDENTIFIER, QUOTED_STRING, - COMMENT, and DELIMITER. - - file: The file to tokenize - - ungotten_char: The most recently ungotten character, or None. - - ungotten_token: The most recently ungotten token, or None. - - multiline: The current multiline level. This value is increased - by one every time a '(' delimiter is read, and decreased by one every time - a ')' delimiter is read. - - quoting: This variable is true if the tokenizer is currently - reading a quoted string. - - eof: This variable is true if the tokenizer has encountered EOF. - - delimiters: The current delimiter dictionary. - - line_number: The current line number - - filename: A filename that will be returned by the where() method. - """ - - def __init__(self, f=sys.stdin, filename=None): - """Initialize a tokenizer instance. - - f: The file to tokenize. The default is sys.stdin. - This parameter may also be a string, in which case the tokenizer - will take its input from the contents of the string. - - filename: the name of the filename that the where() method - will return. - """ - - if isinstance(f, text_type): - f = StringIO(f) - if filename is None: - filename = '<string>' - elif isinstance(f, binary_type): - f = StringIO(f.decode()) - if filename is None: - filename = '<string>' - else: - if filename is None: - if f is sys.stdin: - filename = '<stdin>' - else: - filename = '<file>' - self.file = f - self.ungotten_char = None - self.ungotten_token = None - self.multiline = 0 - self.quoting = False - self.eof = False - self.delimiters = _DELIMITERS - self.line_number = 1 - self.filename = filename - - def _get_char(self): - """Read a character from input. - """ - - if self.ungotten_char is None: - if self.eof: - c = '' - else: - c = self.file.read(1) - if c == '': - self.eof = True - elif c == '\n': - self.line_number += 1 - else: - c = self.ungotten_char - self.ungotten_char = None - return c - - def where(self): - """Return the current location in the input. - - Returns a (string, int) tuple. The first item is the filename of - the input, the second is the current line number. - """ - - return (self.filename, self.line_number) - - def _unget_char(self, c): - """Unget a character. - - The unget buffer for characters is only one character large; it is - an error to try to unget a character when the unget buffer is not - empty. - - c: the character to unget - raises UngetBufferFull: there is already an ungotten char - """ - - if self.ungotten_char is not None: - raise UngetBufferFull - self.ungotten_char = c - - def skip_whitespace(self): - """Consume input until a non-whitespace character is encountered. - - The non-whitespace character is then ungotten, and the number of - whitespace characters consumed is returned. - - If the tokenizer is in multiline mode, then newlines are whitespace. - - Returns the number of characters skipped. - """ - - skipped = 0 - while True: - c = self._get_char() - if c != ' ' and c != '\t': - if (c != '\n') or not self.multiline: - self._unget_char(c) - return skipped - skipped += 1 - - def get(self, want_leading=False, want_comment=False): - """Get the next token. - - want_leading: If True, return a WHITESPACE token if the - first character read is whitespace. The default is False. - - want_comment: If True, return a COMMENT token if the - first token read is a comment. The default is False. - - Raises dns.exception.UnexpectedEnd: input ended prematurely - - Raises dns.exception.SyntaxError: input was badly formed - - Returns a Token. - """ - - if self.ungotten_token is not None: - token = self.ungotten_token - self.ungotten_token = None - if token.is_whitespace(): - if want_leading: - return token - elif token.is_comment(): - if want_comment: - return token - else: - return token - skipped = self.skip_whitespace() - if want_leading and skipped > 0: - return Token(WHITESPACE, ' ') - token = '' - ttype = IDENTIFIER - has_escape = False - while True: - c = self._get_char() - if c == '' or c in self.delimiters: - if c == '' and self.quoting: - raise dns.exception.UnexpectedEnd - if token == '' and ttype != QUOTED_STRING: - if c == '(': - self.multiline += 1 - self.skip_whitespace() - continue - elif c == ')': - if self.multiline <= 0: - raise dns.exception.SyntaxError - self.multiline -= 1 - self.skip_whitespace() - continue - elif c == '"': - if not self.quoting: - self.quoting = True - self.delimiters = _QUOTING_DELIMITERS - ttype = QUOTED_STRING - continue - else: - self.quoting = False - self.delimiters = _DELIMITERS - self.skip_whitespace() - continue - elif c == '\n': - return Token(EOL, '\n') - elif c == ';': - while 1: - c = self._get_char() - if c == '\n' or c == '': - break - token += c - if want_comment: - self._unget_char(c) - return Token(COMMENT, token) - elif c == '': - if self.multiline: - raise dns.exception.SyntaxError( - 'unbalanced parentheses') - return Token(EOF) - elif self.multiline: - self.skip_whitespace() - token = '' - continue - else: - return Token(EOL, '\n') - else: - # This code exists in case we ever want a - # delimiter to be returned. It never produces - # a token currently. - token = c - ttype = DELIMITER - else: - self._unget_char(c) - break - elif self.quoting: - if c == '\\': - c = self._get_char() - if c == '': - raise dns.exception.UnexpectedEnd - if c.isdigit(): - c2 = self._get_char() - if c2 == '': - raise dns.exception.UnexpectedEnd - c3 = self._get_char() - if c == '': - raise dns.exception.UnexpectedEnd - if not (c2.isdigit() and c3.isdigit()): - raise dns.exception.SyntaxError - c = chr(int(c) * 100 + int(c2) * 10 + int(c3)) - elif c == '\n': - raise dns.exception.SyntaxError('newline in quoted string') - elif c == '\\': - # - # It's an escape. Put it and the next character into - # the token; it will be checked later for goodness. - # - token += c - has_escape = True - c = self._get_char() - if c == '' or c == '\n': - raise dns.exception.UnexpectedEnd - token += c - if token == '' and ttype != QUOTED_STRING: - if self.multiline: - raise dns.exception.SyntaxError('unbalanced parentheses') - ttype = EOF - return Token(ttype, token, has_escape) - - def unget(self, token): - """Unget a token. - - The unget buffer for tokens is only one token large; it is - an error to try to unget a token when the unget buffer is not - empty. - - token: the token to unget - - Raises UngetBufferFull: there is already an ungotten token - """ - - if self.ungotten_token is not None: - raise UngetBufferFull - self.ungotten_token = token - - def next(self): - """Return the next item in an iteration. - - Returns a Token. - """ - - token = self.get() - if token.is_eof(): - raise StopIteration - return token - - __next__ = next - - def __iter__(self): - return self - - # Helpers - - def get_int(self, base=10): - """Read the next token and interpret it as an integer. - - Raises dns.exception.SyntaxError if not an integer. - - Returns an int. - """ - - token = self.get().unescape() - if not token.is_identifier(): - raise dns.exception.SyntaxError('expecting an identifier') - if not token.value.isdigit(): - raise dns.exception.SyntaxError('expecting an integer') - return int(token.value, base) - - def get_uint8(self): - """Read the next token and interpret it as an 8-bit unsigned - integer. - - Raises dns.exception.SyntaxError if not an 8-bit unsigned integer. - - Returns an int. - """ - - value = self.get_int() - if value < 0 or value > 255: - raise dns.exception.SyntaxError( - '%d is not an unsigned 8-bit integer' % value) - return value - - def get_uint16(self, base=10): - """Read the next token and interpret it as a 16-bit unsigned - integer. - - Raises dns.exception.SyntaxError if not a 16-bit unsigned integer. - - Returns an int. - """ - - value = self.get_int(base=base) - if value < 0 or value > 65535: - if base == 8: - raise dns.exception.SyntaxError( - '%o is not an octal unsigned 16-bit integer' % value) - else: - raise dns.exception.SyntaxError( - '%d is not an unsigned 16-bit integer' % value) - return value - - def get_uint32(self): - """Read the next token and interpret it as a 32-bit unsigned - integer. - - Raises dns.exception.SyntaxError if not a 32-bit unsigned integer. - - Returns an int. - """ - - token = self.get().unescape() - if not token.is_identifier(): - raise dns.exception.SyntaxError('expecting an identifier') - if not token.value.isdigit(): - raise dns.exception.SyntaxError('expecting an integer') - value = long(token.value) - if value < 0 or value > long(4294967296): - raise dns.exception.SyntaxError( - '%d is not an unsigned 32-bit integer' % value) - return value - - def get_string(self, origin=None): - """Read the next token and interpret it as a string. - - Raises dns.exception.SyntaxError if not a string. - - Returns a string. - """ - - token = self.get().unescape() - if not (token.is_identifier() or token.is_quoted_string()): - raise dns.exception.SyntaxError('expecting a string') - return token.value - - def get_identifier(self, origin=None): - """Read the next token, which should be an identifier. - - Raises dns.exception.SyntaxError if not an identifier. - - Returns a string. - """ - - token = self.get().unescape() - if not token.is_identifier(): - raise dns.exception.SyntaxError('expecting an identifier') - return token.value - - def get_name(self, origin=None): - """Read the next token and interpret it as a DNS name. - - Raises dns.exception.SyntaxError if not a name. - - Returns a dns.name.Name. - """ - - token = self.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError('expecting an identifier') - return dns.name.from_text(token.value, origin) - - def get_eol(self): - """Read the next token and raise an exception if it isn't EOL or - EOF. - - Returns a string. - """ - - token = self.get() - if not token.is_eol_or_eof(): - raise dns.exception.SyntaxError( - 'expected EOL or EOF, got %d "%s"' % (token.ttype, - token.value)) - return token.value - - def get_ttl(self): - """Read the next token and interpret it as a DNS TTL. - - Raises dns.exception.SyntaxError or dns.ttl.BadTTL if not an - identifier or badly formed. - - Returns an int. - """ - - token = self.get().unescape() - if not token.is_identifier(): - raise dns.exception.SyntaxError('expecting an identifier') - return dns.ttl.from_text(token.value) diff --git a/lib/dns/tsig.py b/lib/dns/tsig.py deleted file mode 100644 index 3daa3878..00000000 --- a/lib/dns/tsig.py +++ /dev/null @@ -1,236 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS TSIG support.""" - -import hashlib -import hmac -import struct - -import dns.exception -import dns.rdataclass -import dns.name -from ._compat import long, string_types, text_type - -class BadTime(dns.exception.DNSException): - - """The current time is not within the TSIG's validity time.""" - - -class BadSignature(dns.exception.DNSException): - - """The TSIG signature fails to verify.""" - - -class PeerError(dns.exception.DNSException): - - """Base class for all TSIG errors generated by the remote peer""" - - -class PeerBadKey(PeerError): - - """The peer didn't know the key we used""" - - -class PeerBadSignature(PeerError): - - """The peer didn't like the signature we sent""" - - -class PeerBadTime(PeerError): - - """The peer didn't like the time we sent""" - - -class PeerBadTruncation(PeerError): - - """The peer didn't like amount of truncation in the TSIG we sent""" - -# TSIG Algorithms - -HMAC_MD5 = dns.name.from_text("HMAC-MD5.SIG-ALG.REG.INT") -HMAC_SHA1 = dns.name.from_text("hmac-sha1") -HMAC_SHA224 = dns.name.from_text("hmac-sha224") -HMAC_SHA256 = dns.name.from_text("hmac-sha256") -HMAC_SHA384 = dns.name.from_text("hmac-sha384") -HMAC_SHA512 = dns.name.from_text("hmac-sha512") - -_hashes = { - HMAC_SHA224: hashlib.sha224, - HMAC_SHA256: hashlib.sha256, - HMAC_SHA384: hashlib.sha384, - HMAC_SHA512: hashlib.sha512, - HMAC_SHA1: hashlib.sha1, - HMAC_MD5: hashlib.md5, -} - -default_algorithm = HMAC_MD5 - -BADSIG = 16 -BADKEY = 17 -BADTIME = 18 -BADTRUNC = 22 - - -def sign(wire, keyname, secret, time, fudge, original_id, error, - other_data, request_mac, ctx=None, multi=False, first=True, - algorithm=default_algorithm): - """Return a (tsig_rdata, mac, ctx) tuple containing the HMAC TSIG rdata - for the input parameters, the HMAC MAC calculated by applying the - TSIG signature algorithm, and the TSIG digest context. - @rtype: (string, string, hmac.HMAC object) - @raises ValueError: I{other_data} is too long - @raises NotImplementedError: I{algorithm} is not supported - """ - - if isinstance(other_data, text_type): - other_data = other_data.encode() - (algorithm_name, digestmod) = get_algorithm(algorithm) - if first: - ctx = hmac.new(secret, digestmod=digestmod) - ml = len(request_mac) - if ml > 0: - ctx.update(struct.pack('!H', ml)) - ctx.update(request_mac) - id = struct.pack('!H', original_id) - ctx.update(id) - ctx.update(wire[2:]) - if first: - ctx.update(keyname.to_digestable()) - ctx.update(struct.pack('!H', dns.rdataclass.ANY)) - ctx.update(struct.pack('!I', 0)) - long_time = time + long(0) - upper_time = (long_time >> 32) & long(0xffff) - lower_time = long_time & long(0xffffffff) - time_mac = struct.pack('!HIH', upper_time, lower_time, fudge) - pre_mac = algorithm_name + time_mac - ol = len(other_data) - if ol > 65535: - raise ValueError('TSIG Other Data is > 65535 bytes') - post_mac = struct.pack('!HH', error, ol) + other_data - if first: - ctx.update(pre_mac) - ctx.update(post_mac) - else: - ctx.update(time_mac) - mac = ctx.digest() - mpack = struct.pack('!H', len(mac)) - tsig_rdata = pre_mac + mpack + mac + id + post_mac - if multi: - ctx = hmac.new(secret, digestmod=digestmod) - ml = len(mac) - ctx.update(struct.pack('!H', ml)) - ctx.update(mac) - else: - ctx = None - return (tsig_rdata, mac, ctx) - - -def hmac_md5(wire, keyname, secret, time, fudge, original_id, error, - other_data, request_mac, ctx=None, multi=False, first=True, - algorithm=default_algorithm): - return sign(wire, keyname, secret, time, fudge, original_id, error, - other_data, request_mac, ctx, multi, first, algorithm) - - -def validate(wire, keyname, secret, now, request_mac, tsig_start, tsig_rdata, - tsig_rdlen, ctx=None, multi=False, first=True): - """Validate the specified TSIG rdata against the other input parameters. - - @raises FormError: The TSIG is badly formed. - @raises BadTime: There is too much time skew between the client and the - server. - @raises BadSignature: The TSIG signature did not validate - @rtype: hmac.HMAC object""" - - (adcount,) = struct.unpack("!H", wire[10:12]) - if adcount == 0: - raise dns.exception.FormError - adcount -= 1 - new_wire = wire[0:10] + struct.pack("!H", adcount) + wire[12:tsig_start] - current = tsig_rdata - (aname, used) = dns.name.from_wire(wire, current) - current = current + used - (upper_time, lower_time, fudge, mac_size) = \ - struct.unpack("!HIHH", wire[current:current + 10]) - time = ((upper_time + long(0)) << 32) + (lower_time + long(0)) - current += 10 - mac = wire[current:current + mac_size] - current += mac_size - (original_id, error, other_size) = \ - struct.unpack("!HHH", wire[current:current + 6]) - current += 6 - other_data = wire[current:current + other_size] - current += other_size - if current != tsig_rdata + tsig_rdlen: - raise dns.exception.FormError - if error != 0: - if error == BADSIG: - raise PeerBadSignature - elif error == BADKEY: - raise PeerBadKey - elif error == BADTIME: - raise PeerBadTime - elif error == BADTRUNC: - raise PeerBadTruncation - else: - raise PeerError('unknown TSIG error code %d' % error) - time_low = time - fudge - time_high = time + fudge - if now < time_low or now > time_high: - raise BadTime - (junk, our_mac, ctx) = sign(new_wire, keyname, secret, time, fudge, - original_id, error, other_data, - request_mac, ctx, multi, first, aname) - if our_mac != mac: - raise BadSignature - return ctx - - -def get_algorithm(algorithm): - """Returns the wire format string and the hash module to use for the - specified TSIG algorithm - - @rtype: (string, hash constructor) - @raises NotImplementedError: I{algorithm} is not supported - """ - - if isinstance(algorithm, string_types): - algorithm = dns.name.from_text(algorithm) - - try: - return (algorithm.to_digestable(), _hashes[algorithm]) - except KeyError: - raise NotImplementedError("TSIG algorithm " + str(algorithm) + - " is not supported") - - -def get_algorithm_and_mac(wire, tsig_rdata, tsig_rdlen): - """Return the tsig algorithm for the specified tsig_rdata - @raises FormError: The TSIG is badly formed. - """ - current = tsig_rdata - (aname, used) = dns.name.from_wire(wire, current) - current = current + used - (upper_time, lower_time, fudge, mac_size) = \ - struct.unpack("!HIHH", wire[current:current + 10]) - current += 10 - mac = wire[current:current + mac_size] - current += mac_size - if current > tsig_rdata + tsig_rdlen: - raise dns.exception.FormError - return (aname, mac) diff --git a/lib/dns/tsigkeyring.py b/lib/dns/tsigkeyring.py deleted file mode 100644 index 5e5fe1cb..00000000 --- a/lib/dns/tsigkeyring.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""A place to store TSIG keys.""" - -from dns._compat import maybe_decode, maybe_encode - -import base64 - -import dns.name - - -def from_text(textring): - """Convert a dictionary containing (textual DNS name, base64 secret) pairs - into a binary keyring which has (dns.name.Name, binary secret) pairs. - @rtype: dict""" - - keyring = {} - for keytext in textring: - keyname = dns.name.from_text(keytext) - secret = base64.decodestring(maybe_encode(textring[keytext])) - keyring[keyname] = secret - return keyring - - -def to_text(keyring): - """Convert a dictionary containing (dns.name.Name, binary secret) pairs - into a text keyring which has (textual DNS name, base64 secret) pairs. - @rtype: dict""" - - textring = {} - for keyname in keyring: - keytext = maybe_decode(keyname.to_text()) - secret = maybe_decode(base64.encodestring(keyring[keyname])) - textring[keytext] = secret - return textring diff --git a/lib/dns/tsigkeyring.pyi b/lib/dns/tsigkeyring.pyi deleted file mode 100644 index b5d51e15..00000000 --- a/lib/dns/tsigkeyring.pyi +++ /dev/null @@ -1,7 +0,0 @@ -from typing import Dict -from . import name - -def from_text(textring : Dict[str,str]) -> Dict[name.Name,bytes]: - ... -def to_text(keyring : Dict[name.Name,bytes]) -> Dict[str, str]: - ... diff --git a/lib/dns/ttl.py b/lib/dns/ttl.py deleted file mode 100644 index 4be16bee..00000000 --- a/lib/dns/ttl.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS TTL conversion.""" - -import dns.exception -from ._compat import long - - -class BadTTL(dns.exception.SyntaxError): - """DNS TTL value is not well-formed.""" - - -def from_text(text): - """Convert the text form of a TTL to an integer. - - The BIND 8 units syntax for TTLs (e.g. '1w6d4h3m10s') is supported. - - *text*, a ``text``, the textual TTL. - - Raises ``dns.ttl.BadTTL`` if the TTL is not well-formed. - - Returns an ``int``. - """ - - if text.isdigit(): - total = long(text) - else: - if not text[0].isdigit(): - raise BadTTL - total = long(0) - current = long(0) - for c in text: - if c.isdigit(): - current *= 10 - current += long(c) - else: - c = c.lower() - if c == 'w': - total += current * long(604800) - elif c == 'd': - total += current * long(86400) - elif c == 'h': - total += current * long(3600) - elif c == 'm': - total += current * long(60) - elif c == 's': - total += current - else: - raise BadTTL("unknown unit '%s'" % c) - current = 0 - if not current == 0: - raise BadTTL("trailing integer") - if total < long(0) or total > long(2147483647): - raise BadTTL("TTL should be between 0 and 2^31 - 1 (inclusive)") - return total diff --git a/lib/dns/update.py b/lib/dns/update.py deleted file mode 100644 index 96a00d5d..00000000 --- a/lib/dns/update.py +++ /dev/null @@ -1,279 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Dynamic Update Support""" - - -import dns.message -import dns.name -import dns.opcode -import dns.rdata -import dns.rdataclass -import dns.rdataset -import dns.tsig -from ._compat import string_types - - -class Update(dns.message.Message): - - def __init__(self, zone, rdclass=dns.rdataclass.IN, keyring=None, - keyname=None, keyalgorithm=dns.tsig.default_algorithm): - """Initialize a new DNS Update object. - - See the documentation of the Message class for a complete - description of the keyring dictionary. - - *zone*, a ``dns.name.Name`` or ``text``, the zone which is being - updated. - - *rdclass*, an ``int`` or ``text``, the class of the zone. - - *keyring*, a ``dict``, the TSIG keyring to use. If a - *keyring* is specified but a *keyname* is not, then the key - used will be the first key in the *keyring*. Note that the - order of keys in a dictionary is not defined, so applications - should supply a keyname when a keyring is used, unless they - know the keyring contains only one key. - - *keyname*, a ``dns.name.Name`` or ``None``, the name of the TSIG key - to use; defaults to ``None``. The key must be defined in the keyring. - - *keyalgorithm*, a ``dns.name.Name``, the TSIG algorithm to use. - """ - super(Update, self).__init__() - self.flags |= dns.opcode.to_flags(dns.opcode.UPDATE) - if isinstance(zone, string_types): - zone = dns.name.from_text(zone) - self.origin = zone - if isinstance(rdclass, string_types): - rdclass = dns.rdataclass.from_text(rdclass) - self.zone_rdclass = rdclass - self.find_rrset(self.question, self.origin, rdclass, dns.rdatatype.SOA, - create=True, force_unique=True) - if keyring is not None: - self.use_tsig(keyring, keyname, algorithm=keyalgorithm) - - def _add_rr(self, name, ttl, rd, deleting=None, section=None): - """Add a single RR to the update section.""" - - if section is None: - section = self.authority - covers = rd.covers() - rrset = self.find_rrset(section, name, self.zone_rdclass, rd.rdtype, - covers, deleting, True, True) - rrset.add(rd, ttl) - - def _add(self, replace, section, name, *args): - """Add records. - - *replace* is the replacement mode. If ``False``, - RRs are added to an existing RRset; if ``True``, the RRset - is replaced with the specified contents. The second - argument is the section to add to. The third argument - is always a name. The other arguments can be: - - - rdataset... - - - ttl, rdata... - - - ttl, rdtype, string... - """ - - if isinstance(name, string_types): - name = dns.name.from_text(name, None) - if isinstance(args[0], dns.rdataset.Rdataset): - for rds in args: - if replace: - self.delete(name, rds.rdtype) - for rd in rds: - self._add_rr(name, rds.ttl, rd, section=section) - else: - args = list(args) - ttl = int(args.pop(0)) - if isinstance(args[0], dns.rdata.Rdata): - if replace: - self.delete(name, args[0].rdtype) - for rd in args: - self._add_rr(name, ttl, rd, section=section) - else: - rdtype = args.pop(0) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if replace: - self.delete(name, rdtype) - for s in args: - rd = dns.rdata.from_text(self.zone_rdclass, rdtype, s, - self.origin) - self._add_rr(name, ttl, rd, section=section) - - def add(self, name, *args): - """Add records. - - The first argument is always a name. The other - arguments can be: - - - rdataset... - - - ttl, rdata... - - - ttl, rdtype, string... - """ - - self._add(False, self.authority, name, *args) - - def delete(self, name, *args): - """Delete records. - - The first argument is always a name. The other - arguments can be: - - - *empty* - - - rdataset... - - - rdata... - - - rdtype, [string...] - """ - - if isinstance(name, string_types): - name = dns.name.from_text(name, None) - if len(args) == 0: - self.find_rrset(self.authority, name, dns.rdataclass.ANY, - dns.rdatatype.ANY, dns.rdatatype.NONE, - dns.rdatatype.ANY, True, True) - elif isinstance(args[0], dns.rdataset.Rdataset): - for rds in args: - for rd in rds: - self._add_rr(name, 0, rd, dns.rdataclass.NONE) - else: - args = list(args) - if isinstance(args[0], dns.rdata.Rdata): - for rd in args: - self._add_rr(name, 0, rd, dns.rdataclass.NONE) - else: - rdtype = args.pop(0) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if len(args) == 0: - self.find_rrset(self.authority, name, - self.zone_rdclass, rdtype, - dns.rdatatype.NONE, - dns.rdataclass.ANY, - True, True) - else: - for s in args: - rd = dns.rdata.from_text(self.zone_rdclass, rdtype, s, - self.origin) - self._add_rr(name, 0, rd, dns.rdataclass.NONE) - - def replace(self, name, *args): - """Replace records. - - The first argument is always a name. The other - arguments can be: - - - rdataset... - - - ttl, rdata... - - - ttl, rdtype, string... - - Note that if you want to replace the entire node, you should do - a delete of the name followed by one or more calls to add. - """ - - self._add(True, self.authority, name, *args) - - def present(self, name, *args): - """Require that an owner name (and optionally an rdata type, - or specific rdataset) exists as a prerequisite to the - execution of the update. - - The first argument is always a name. - The other arguments can be: - - - rdataset... - - - rdata... - - - rdtype, string... - """ - - if isinstance(name, string_types): - name = dns.name.from_text(name, None) - if len(args) == 0: - self.find_rrset(self.answer, name, - dns.rdataclass.ANY, dns.rdatatype.ANY, - dns.rdatatype.NONE, None, - True, True) - elif isinstance(args[0], dns.rdataset.Rdataset) or \ - isinstance(args[0], dns.rdata.Rdata) or \ - len(args) > 1: - if not isinstance(args[0], dns.rdataset.Rdataset): - # Add a 0 TTL - args = list(args) - args.insert(0, 0) - self._add(False, self.answer, name, *args) - else: - rdtype = args[0] - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - self.find_rrset(self.answer, name, - dns.rdataclass.ANY, rdtype, - dns.rdatatype.NONE, None, - True, True) - - def absent(self, name, rdtype=None): - """Require that an owner name (and optionally an rdata type) does - not exist as a prerequisite to the execution of the update.""" - - if isinstance(name, string_types): - name = dns.name.from_text(name, None) - if rdtype is None: - self.find_rrset(self.answer, name, - dns.rdataclass.NONE, dns.rdatatype.ANY, - dns.rdatatype.NONE, None, - True, True) - else: - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - self.find_rrset(self.answer, name, - dns.rdataclass.NONE, rdtype, - dns.rdatatype.NONE, None, - True, True) - - def to_wire(self, origin=None, max_size=65535): - """Return a string containing the update in DNS compressed wire - format. - - *origin*, a ``dns.name.Name`` or ``None``, the origin to be - appended to any relative names. If *origin* is ``None``, then - the origin of the ``dns.update.Update`` message object is used - (i.e. the *zone* parameter passed when the Update object was - created). - - *max_size*, an ``int``, the maximum size of the wire format - output; default is 0, which means "the message's request - payload, if nonzero, or 65535". - - Returns a ``binary``. - """ - - if origin is None: - origin = self.origin - return super(Update, self).to_wire(origin, max_size) diff --git a/lib/dns/update.pyi b/lib/dns/update.pyi deleted file mode 100644 index eeac0591..00000000 --- a/lib/dns/update.pyi +++ /dev/null @@ -1,21 +0,0 @@ -from typing import Optional,Dict,Union,Any - -from . import message, tsig, rdataclass, name - -class Update(message.Message): - def __init__(self, zone : Union[name.Name, str], rdclass : Union[int,str] = rdataclass.IN, keyring : Optional[Dict[name.Name,bytes]] = None, - keyname : Optional[name.Name] = None, keyalgorithm : Optional[name.Name] = tsig.default_algorithm) -> None: - self.id : int - def add(self, name : Union[str,name.Name], *args : Any): - ... - def delete(self, name, *args : Any): - ... - def replace(self, name : Union[str,name.Name], *args : Any): - ... - def present(self, name : Union[str,name.Name], *args : Any): - ... - def absent(self, name : Union[str,name.Name], rdtype=None): - """Require that an owner name (and optionally an rdata type) does - not exist as a prerequisite to the execution of the update.""" - def to_wire(self, origin : Optional[name.Name] = None, max_size=65535, **kw) -> bytes: - ... diff --git a/lib/dns/version.py b/lib/dns/version.py deleted file mode 100644 index f116904b..00000000 --- a/lib/dns/version.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""dnspython release version information.""" - -#: MAJOR -MAJOR = 1 -#: MINOR -MINOR = 16 -#: MICRO -MICRO = 0 -#: RELEASELEVEL -RELEASELEVEL = 0x0f -#: SERIAL -SERIAL = 0 - -if RELEASELEVEL == 0x0f: - #: version - version = '%d.%d.%d' % (MAJOR, MINOR, MICRO) -elif RELEASELEVEL == 0x00: - version = '%d.%d.%dx%d' % \ - (MAJOR, MINOR, MICRO, SERIAL) -else: - version = '%d.%d.%d%x%d' % \ - (MAJOR, MINOR, MICRO, RELEASELEVEL, SERIAL) - -#: hexversion -hexversion = MAJOR << 24 | MINOR << 16 | MICRO << 8 | RELEASELEVEL << 4 | \ - SERIAL diff --git a/lib/dns/wiredata.py b/lib/dns/wiredata.py deleted file mode 100644 index ea3c1e67..00000000 --- a/lib/dns/wiredata.py +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2011,2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Wire Data Helper""" - -import dns.exception -from ._compat import binary_type, string_types, PY2 - -# Figure out what constant python passes for an unspecified slice bound. -# It's supposed to be sys.maxint, yet on 64-bit windows sys.maxint is 2^31 - 1 -# but Python uses 2^63 - 1 as the constant. Rather than making pointless -# extra comparisons, duplicating code, or weakening WireData, we just figure -# out what constant Python will use. - - -class _SliceUnspecifiedBound(binary_type): - - def __getitem__(self, key): - return key.stop - - if PY2: - def __getslice__(self, i, j): # pylint: disable=getslice-method - return self.__getitem__(slice(i, j)) - -_unspecified_bound = _SliceUnspecifiedBound()[1:] - - -class WireData(binary_type): - # WireData is a binary type with stricter slicing - - def __getitem__(self, key): - try: - if isinstance(key, slice): - # make sure we are not going outside of valid ranges, - # do stricter control of boundaries than python does - # by default - start = key.start - stop = key.stop - - if PY2: - if stop == _unspecified_bound: - # handle the case where the right bound is unspecified - stop = len(self) - - if start < 0 or stop < 0: - raise dns.exception.FormError - # If it's not an empty slice, access left and right bounds - # to make sure they're valid - if start != stop: - super(WireData, self).__getitem__(start) - super(WireData, self).__getitem__(stop - 1) - else: - for index in (start, stop): - if index is None: - continue - elif abs(index) > len(self): - raise dns.exception.FormError - - return WireData(super(WireData, self).__getitem__( - slice(start, stop))) - return bytearray(self.unwrap())[key] - except IndexError: - raise dns.exception.FormError - - if PY2: - def __getslice__(self, i, j): # pylint: disable=getslice-method - return self.__getitem__(slice(i, j)) - - def __iter__(self): - i = 0 - while 1: - try: - yield self[i] - i += 1 - except dns.exception.FormError: - raise StopIteration - - def unwrap(self): - return binary_type(self) - - -def maybe_wrap(wire): - if isinstance(wire, WireData): - return wire - elif isinstance(wire, binary_type): - return WireData(wire) - elif isinstance(wire, string_types): - return WireData(wire.encode()) - raise ValueError("unhandled type %s" % type(wire)) diff --git a/lib/dns/zone.py b/lib/dns/zone.py deleted file mode 100644 index 1e2fe781..00000000 --- a/lib/dns/zone.py +++ /dev/null @@ -1,1127 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Zones.""" - -from __future__ import generators - -import sys -import re -import os -from io import BytesIO - -import dns.exception -import dns.name -import dns.node -import dns.rdataclass -import dns.rdatatype -import dns.rdata -import dns.rdtypes.ANY.SOA -import dns.rrset -import dns.tokenizer -import dns.ttl -import dns.grange -from ._compat import string_types, text_type, PY3 - - -class BadZone(dns.exception.DNSException): - - """The DNS zone is malformed.""" - - -class NoSOA(BadZone): - - """The DNS zone has no SOA RR at its origin.""" - - -class NoNS(BadZone): - - """The DNS zone has no NS RRset at its origin.""" - - -class UnknownOrigin(BadZone): - - """The DNS zone's origin is unknown.""" - - -class Zone(object): - - """A DNS zone. - - A Zone is a mapping from names to nodes. The zone object may be - treated like a Python dictionary, e.g. zone[name] will retrieve - the node associated with that name. The I{name} may be a - dns.name.Name object, or it may be a string. In the either case, - if the name is relative it is treated as relative to the origin of - the zone. - - @ivar rdclass: The zone's rdata class; the default is class IN. - @type rdclass: int - @ivar origin: The origin of the zone. - @type origin: dns.name.Name object - @ivar nodes: A dictionary mapping the names of nodes in the zone to the - nodes themselves. - @type nodes: dict - @ivar relativize: should names in the zone be relativized? - @type relativize: bool - @cvar node_factory: the factory used to create a new node - @type node_factory: class or callable - """ - - node_factory = dns.node.Node - - __slots__ = ['rdclass', 'origin', 'nodes', 'relativize'] - - def __init__(self, origin, rdclass=dns.rdataclass.IN, relativize=True): - """Initialize a zone object. - - @param origin: The origin of the zone. - @type origin: dns.name.Name object - @param rdclass: The zone's rdata class; the default is class IN. - @type rdclass: int""" - - if origin is not None: - if isinstance(origin, string_types): - origin = dns.name.from_text(origin) - elif not isinstance(origin, dns.name.Name): - raise ValueError("origin parameter must be convertible to a " - "DNS name") - if not origin.is_absolute(): - raise ValueError("origin parameter must be an absolute name") - self.origin = origin - self.rdclass = rdclass - self.nodes = {} - self.relativize = relativize - - def __eq__(self, other): - """Two zones are equal if they have the same origin, class, and - nodes. - @rtype: bool - """ - - if not isinstance(other, Zone): - return False - if self.rdclass != other.rdclass or \ - self.origin != other.origin or \ - self.nodes != other.nodes: - return False - return True - - def __ne__(self, other): - """Are two zones not equal? - @rtype: bool - """ - - return not self.__eq__(other) - - def _validate_name(self, name): - if isinstance(name, string_types): - name = dns.name.from_text(name, None) - elif not isinstance(name, dns.name.Name): - raise KeyError("name parameter must be convertible to a DNS name") - if name.is_absolute(): - if not name.is_subdomain(self.origin): - raise KeyError( - "name parameter must be a subdomain of the zone origin") - if self.relativize: - name = name.relativize(self.origin) - return name - - def __getitem__(self, key): - key = self._validate_name(key) - return self.nodes[key] - - def __setitem__(self, key, value): - key = self._validate_name(key) - self.nodes[key] = value - - def __delitem__(self, key): - key = self._validate_name(key) - del self.nodes[key] - - def __iter__(self): - return self.nodes.__iter__() - - def iterkeys(self): - if PY3: - return self.nodes.keys() # pylint: disable=dict-keys-not-iterating - else: - return self.nodes.iterkeys() # pylint: disable=dict-iter-method - - def keys(self): - return self.nodes.keys() # pylint: disable=dict-keys-not-iterating - - def itervalues(self): - if PY3: - return self.nodes.values() # pylint: disable=dict-values-not-iterating - else: - return self.nodes.itervalues() # pylint: disable=dict-iter-method - - def values(self): - return self.nodes.values() # pylint: disable=dict-values-not-iterating - - def items(self): - return self.nodes.items() # pylint: disable=dict-items-not-iterating - - iteritems = items - - def get(self, key): - key = self._validate_name(key) - return self.nodes.get(key) - - def __contains__(self, other): - return other in self.nodes - - def find_node(self, name, create=False): - """Find a node in the zone, possibly creating it. - - @param name: the name of the node to find - @type name: dns.name.Name object or string - @param create: should the node be created if it doesn't exist? - @type create: bool - @raises KeyError: the name is not known and create was not specified. - @rtype: dns.node.Node object - """ - - name = self._validate_name(name) - node = self.nodes.get(name) - if node is None: - if not create: - raise KeyError - node = self.node_factory() - self.nodes[name] = node - return node - - def get_node(self, name, create=False): - """Get a node in the zone, possibly creating it. - - This method is like L{find_node}, except it returns None instead - of raising an exception if the node does not exist and creation - has not been requested. - - @param name: the name of the node to find - @type name: dns.name.Name object or string - @param create: should the node be created if it doesn't exist? - @type create: bool - @rtype: dns.node.Node object or None - """ - - try: - node = self.find_node(name, create) - except KeyError: - node = None - return node - - def delete_node(self, name): - """Delete the specified node if it exists. - - It is not an error if the node does not exist. - """ - - name = self._validate_name(name) - if name in self.nodes: - del self.nodes[name] - - def find_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE, - create=False): - """Look for rdata with the specified name and type in the zone, - and return an rdataset encapsulating it. - - The I{name}, I{rdtype}, and I{covers} parameters may be - strings, in which case they will be converted to their proper - type. - - The rdataset returned is not a copy; changes to it will change - the zone. - - KeyError is raised if the name or type are not found. - Use L{get_rdataset} if you want to have None returned instead. - - @param name: the owner name to look for - @type name: DNS.name.Name object or string - @param rdtype: the rdata type desired - @type rdtype: int or string - @param covers: the covered type (defaults to None) - @type covers: int or string - @param create: should the node and rdataset be created if they do not - exist? - @type create: bool - @raises KeyError: the node or rdata could not be found - @rtype: dns.rdataset.Rdataset object - """ - - name = self._validate_name(name) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if isinstance(covers, string_types): - covers = dns.rdatatype.from_text(covers) - node = self.find_node(name, create) - return node.find_rdataset(self.rdclass, rdtype, covers, create) - - def get_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE, - create=False): - """Look for rdata with the specified name and type in the zone, - and return an rdataset encapsulating it. - - The I{name}, I{rdtype}, and I{covers} parameters may be - strings, in which case they will be converted to their proper - type. - - The rdataset returned is not a copy; changes to it will change - the zone. - - None is returned if the name or type are not found. - Use L{find_rdataset} if you want to have KeyError raised instead. - - @param name: the owner name to look for - @type name: DNS.name.Name object or string - @param rdtype: the rdata type desired - @type rdtype: int or string - @param covers: the covered type (defaults to None) - @type covers: int or string - @param create: should the node and rdataset be created if they do not - exist? - @type create: bool - @rtype: dns.rdataset.Rdataset object or None - """ - - try: - rdataset = self.find_rdataset(name, rdtype, covers, create) - except KeyError: - rdataset = None - return rdataset - - def delete_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE): - """Delete the rdataset matching I{rdtype} and I{covers}, if it - exists at the node specified by I{name}. - - The I{name}, I{rdtype}, and I{covers} parameters may be - strings, in which case they will be converted to their proper - type. - - It is not an error if the node does not exist, or if there is no - matching rdataset at the node. - - If the node has no rdatasets after the deletion, it will itself - be deleted. - - @param name: the owner name to look for - @type name: DNS.name.Name object or string - @param rdtype: the rdata type desired - @type rdtype: int or string - @param covers: the covered type (defaults to None) - @type covers: int or string - """ - - name = self._validate_name(name) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if isinstance(covers, string_types): - covers = dns.rdatatype.from_text(covers) - node = self.get_node(name) - if node is not None: - node.delete_rdataset(self.rdclass, rdtype, covers) - if len(node) == 0: - self.delete_node(name) - - def replace_rdataset(self, name, replacement): - """Replace an rdataset at name. - - It is not an error if there is no rdataset matching I{replacement}. - - Ownership of the I{replacement} object is transferred to the zone; - in other words, this method does not store a copy of I{replacement} - at the node, it stores I{replacement} itself. - - If the I{name} node does not exist, it is created. - - @param name: the owner name - @type name: DNS.name.Name object or string - @param replacement: the replacement rdataset - @type replacement: dns.rdataset.Rdataset - """ - - if replacement.rdclass != self.rdclass: - raise ValueError('replacement.rdclass != zone.rdclass') - node = self.find_node(name, True) - node.replace_rdataset(replacement) - - def find_rrset(self, name, rdtype, covers=dns.rdatatype.NONE): - """Look for rdata with the specified name and type in the zone, - and return an RRset encapsulating it. - - The I{name}, I{rdtype}, and I{covers} parameters may be - strings, in which case they will be converted to their proper - type. - - This method is less efficient than the similar - L{find_rdataset} because it creates an RRset instead of - returning the matching rdataset. It may be more convenient - for some uses since it returns an object which binds the owner - name to the rdata. - - This method may not be used to create new nodes or rdatasets; - use L{find_rdataset} instead. - - KeyError is raised if the name or type are not found. - Use L{get_rrset} if you want to have None returned instead. - - @param name: the owner name to look for - @type name: DNS.name.Name object or string - @param rdtype: the rdata type desired - @type rdtype: int or string - @param covers: the covered type (defaults to None) - @type covers: int or string - @raises KeyError: the node or rdata could not be found - @rtype: dns.rrset.RRset object - """ - - name = self._validate_name(name) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if isinstance(covers, string_types): - covers = dns.rdatatype.from_text(covers) - rdataset = self.nodes[name].find_rdataset(self.rdclass, rdtype, covers) - rrset = dns.rrset.RRset(name, self.rdclass, rdtype, covers) - rrset.update(rdataset) - return rrset - - def get_rrset(self, name, rdtype, covers=dns.rdatatype.NONE): - """Look for rdata with the specified name and type in the zone, - and return an RRset encapsulating it. - - The I{name}, I{rdtype}, and I{covers} parameters may be - strings, in which case they will be converted to their proper - type. - - This method is less efficient than the similar L{get_rdataset} - because it creates an RRset instead of returning the matching - rdataset. It may be more convenient for some uses since it - returns an object which binds the owner name to the rdata. - - This method may not be used to create new nodes or rdatasets; - use L{find_rdataset} instead. - - None is returned if the name or type are not found. - Use L{find_rrset} if you want to have KeyError raised instead. - - @param name: the owner name to look for - @type name: DNS.name.Name object or string - @param rdtype: the rdata type desired - @type rdtype: int or string - @param covers: the covered type (defaults to None) - @type covers: int or string - @rtype: dns.rrset.RRset object - """ - - try: - rrset = self.find_rrset(name, rdtype, covers) - except KeyError: - rrset = None - return rrset - - def iterate_rdatasets(self, rdtype=dns.rdatatype.ANY, - covers=dns.rdatatype.NONE): - """Return a generator which yields (name, rdataset) tuples for - all rdatasets in the zone which have the specified I{rdtype} - and I{covers}. If I{rdtype} is dns.rdatatype.ANY, the default, - then all rdatasets will be matched. - - @param rdtype: int or string - @type rdtype: int or string - @param covers: the covered type (defaults to None) - @type covers: int or string - """ - - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if isinstance(covers, string_types): - covers = dns.rdatatype.from_text(covers) - for (name, node) in self.iteritems(): # pylint: disable=dict-iter-method - for rds in node: - if rdtype == dns.rdatatype.ANY or \ - (rds.rdtype == rdtype and rds.covers == covers): - yield (name, rds) - - def iterate_rdatas(self, rdtype=dns.rdatatype.ANY, - covers=dns.rdatatype.NONE): - """Return a generator which yields (name, ttl, rdata) tuples for - all rdatas in the zone which have the specified I{rdtype} - and I{covers}. If I{rdtype} is dns.rdatatype.ANY, the default, - then all rdatas will be matched. - - @param rdtype: int or string - @type rdtype: int or string - @param covers: the covered type (defaults to None) - @type covers: int or string - """ - - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if isinstance(covers, string_types): - covers = dns.rdatatype.from_text(covers) - for (name, node) in self.iteritems(): # pylint: disable=dict-iter-method - for rds in node: - if rdtype == dns.rdatatype.ANY or \ - (rds.rdtype == rdtype and rds.covers == covers): - for rdata in rds: - yield (name, rds.ttl, rdata) - - def to_file(self, f, sorted=True, relativize=True, nl=None): - """Write a zone to a file. - - @param f: file or string. If I{f} is a string, it is treated - as the name of a file to open. - @param sorted: if True, the file will be written with the - names sorted in DNSSEC order from least to greatest. Otherwise - the names will be written in whatever order they happen to have - in the zone's dictionary. - @param relativize: if True, domain names in the output will be - relativized to the zone's origin (if possible). - @type relativize: bool - @param nl: The end of line string. If not specified, the - output will use the platform's native end-of-line marker (i.e. - LF on POSIX, CRLF on Windows, CR on Macintosh). - @type nl: string or None - """ - - if isinstance(f, string_types): - f = open(f, 'wb') - want_close = True - else: - want_close = False - - # must be in this way, f.encoding may contain None, or even attribute - # may not be there - file_enc = getattr(f, 'encoding', None) - if file_enc is None: - file_enc = 'utf-8' - - if nl is None: - nl_b = os.linesep.encode(file_enc) # binary mode, '\n' is not enough - nl = u'\n' - elif isinstance(nl, string_types): - nl_b = nl.encode(file_enc) - else: - nl_b = nl - nl = nl.decode() - - try: - if sorted: - names = list(self.keys()) - names.sort() - else: - names = self.iterkeys() # pylint: disable=dict-iter-method - for n in names: - l = self[n].to_text(n, origin=self.origin, - relativize=relativize) - if isinstance(l, text_type): - l_b = l.encode(file_enc) - else: - l_b = l - l = l.decode() - - try: - f.write(l_b) - f.write(nl_b) - except TypeError: # textual mode - f.write(l) - f.write(nl) - finally: - if want_close: - f.close() - - def to_text(self, sorted=True, relativize=True, nl=None): - """Return a zone's text as though it were written to a file. - - @param sorted: if True, the file will be written with the - names sorted in DNSSEC order from least to greatest. Otherwise - the names will be written in whatever order they happen to have - in the zone's dictionary. - @param relativize: if True, domain names in the output will be - relativized to the zone's origin (if possible). - @type relativize: bool - @param nl: The end of line string. If not specified, the - output will use the platform's native end-of-line marker (i.e. - LF on POSIX, CRLF on Windows, CR on Macintosh). - @type nl: string or None - """ - temp_buffer = BytesIO() - self.to_file(temp_buffer, sorted, relativize, nl) - return_value = temp_buffer.getvalue() - temp_buffer.close() - return return_value - - def check_origin(self): - """Do some simple checking of the zone's origin. - - @raises dns.zone.NoSOA: there is no SOA RR - @raises dns.zone.NoNS: there is no NS RRset - @raises KeyError: there is no origin node - """ - if self.relativize: - name = dns.name.empty - else: - name = self.origin - if self.get_rdataset(name, dns.rdatatype.SOA) is None: - raise NoSOA - if self.get_rdataset(name, dns.rdatatype.NS) is None: - raise NoNS - - -class _MasterReader(object): - - """Read a DNS master file - - @ivar tok: The tokenizer - @type tok: dns.tokenizer.Tokenizer object - @ivar last_ttl: The last seen explicit TTL for an RR - @type last_ttl: int - @ivar last_ttl_known: Has last TTL been detected - @type last_ttl_known: bool - @ivar default_ttl: The default TTL from a $TTL directive or SOA RR - @type default_ttl: int - @ivar default_ttl_known: Has default TTL been detected - @type default_ttl_known: bool - @ivar last_name: The last name read - @type last_name: dns.name.Name object - @ivar current_origin: The current origin - @type current_origin: dns.name.Name object - @ivar relativize: should names in the zone be relativized? - @type relativize: bool - @ivar zone: the zone - @type zone: dns.zone.Zone object - @ivar saved_state: saved reader state (used when processing $INCLUDE) - @type saved_state: list of (tokenizer, current_origin, last_name, file, - last_ttl, last_ttl_known, default_ttl, default_ttl_known) tuples. - @ivar current_file: the file object of the $INCLUDed file being parsed - (None if no $INCLUDE is active). - @ivar allow_include: is $INCLUDE allowed? - @type allow_include: bool - @ivar check_origin: should sanity checks of the origin node be done? - The default is True. - @type check_origin: bool - """ - - def __init__(self, tok, origin, rdclass, relativize, zone_factory=Zone, - allow_include=False, check_origin=True): - if isinstance(origin, string_types): - origin = dns.name.from_text(origin) - self.tok = tok - self.current_origin = origin - self.relativize = relativize - self.last_ttl = 0 - self.last_ttl_known = False - self.default_ttl = 0 - self.default_ttl_known = False - self.last_name = self.current_origin - self.zone = zone_factory(origin, rdclass, relativize=relativize) - self.saved_state = [] - self.current_file = None - self.allow_include = allow_include - self.check_origin = check_origin - - def _eat_line(self): - while 1: - token = self.tok.get() - if token.is_eol_or_eof(): - break - - def _rr_line(self): - """Process one line from a DNS master file.""" - # Name - if self.current_origin is None: - raise UnknownOrigin - token = self.tok.get(want_leading=True) - if not token.is_whitespace(): - self.last_name = dns.name.from_text( - token.value, self.current_origin) - else: - token = self.tok.get() - if token.is_eol_or_eof(): - # treat leading WS followed by EOL/EOF as if they were EOL/EOF. - return - self.tok.unget(token) - name = self.last_name - if not name.is_subdomain(self.zone.origin): - self._eat_line() - return - if self.relativize: - name = name.relativize(self.zone.origin) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - # TTL - try: - ttl = dns.ttl.from_text(token.value) - self.last_ttl = ttl - self.last_ttl_known = True - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except dns.ttl.BadTTL: - if not (self.last_ttl_known or self.default_ttl_known): - raise dns.exception.SyntaxError("Missing default TTL value") - if self.default_ttl_known: - ttl = self.default_ttl - else: - ttl = self.last_ttl - # Class - try: - rdclass = dns.rdataclass.from_text(token.value) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except dns.exception.SyntaxError: - raise dns.exception.SyntaxError - except Exception: - rdclass = self.zone.rdclass - if rdclass != self.zone.rdclass: - raise dns.exception.SyntaxError("RR class is not zone's class") - # Type - try: - rdtype = dns.rdatatype.from_text(token.value) - except: - raise dns.exception.SyntaxError( - "unknown rdatatype '%s'" % token.value) - n = self.zone.nodes.get(name) - if n is None: - n = self.zone.node_factory() - self.zone.nodes[name] = n - try: - rd = dns.rdata.from_text(rdclass, rdtype, self.tok, - self.current_origin, False) - except dns.exception.SyntaxError: - # Catch and reraise. - (ty, va) = sys.exc_info()[:2] - raise va - except: - # All exceptions that occur in the processing of rdata - # are treated as syntax errors. This is not strictly - # correct, but it is correct almost all of the time. - # We convert them to syntax errors so that we can emit - # helpful filename:line info. - (ty, va) = sys.exc_info()[:2] - raise dns.exception.SyntaxError( - "caught exception {}: {}".format(str(ty), str(va))) - - if not self.default_ttl_known and isinstance(rd, dns.rdtypes.ANY.SOA.SOA): - # The pre-RFC2308 and pre-BIND9 behavior inherits the zone default - # TTL from the SOA minttl if no $TTL statement is present before the - # SOA is parsed. - self.default_ttl = rd.minimum - self.default_ttl_known = True - - rd.choose_relativity(self.zone.origin, self.relativize) - covers = rd.covers() - rds = n.find_rdataset(rdclass, rdtype, covers, True) - rds.add(rd, ttl) - - def _parse_modify(self, side): - # Here we catch everything in '{' '}' in a group so we can replace it - # with ''. - is_generate1 = re.compile("^.*\$({(\+|-?)(\d+),(\d+),(.)}).*$") - is_generate2 = re.compile("^.*\$({(\+|-?)(\d+)}).*$") - is_generate3 = re.compile("^.*\$({(\+|-?)(\d+),(\d+)}).*$") - # Sometimes there are modifiers in the hostname. These come after - # the dollar sign. They are in the form: ${offset[,width[,base]]}. - # Make names - g1 = is_generate1.match(side) - if g1: - mod, sign, offset, width, base = g1.groups() - if sign == '': - sign = '+' - g2 = is_generate2.match(side) - if g2: - mod, sign, offset = g2.groups() - if sign == '': - sign = '+' - width = 0 - base = 'd' - g3 = is_generate3.match(side) - if g3: - mod, sign, offset, width = g1.groups() - if sign == '': - sign = '+' - width = g1.groups()[2] - base = 'd' - - if not (g1 or g2 or g3): - mod = '' - sign = '+' - offset = 0 - width = 0 - base = 'd' - - if base != 'd': - raise NotImplementedError() - - return mod, sign, offset, width, base - - def _generate_line(self): - # range lhs [ttl] [class] type rhs [ comment ] - """Process one line containing the GENERATE statement from a DNS - master file.""" - if self.current_origin is None: - raise UnknownOrigin - - token = self.tok.get() - # Range (required) - try: - start, stop, step = dns.grange.from_text(token.value) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except: - raise dns.exception.SyntaxError - - # lhs (required) - try: - lhs = token.value - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except: - raise dns.exception.SyntaxError - - # TTL - try: - ttl = dns.ttl.from_text(token.value) - self.last_ttl = ttl - self.last_ttl_known = True - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except dns.ttl.BadTTL: - if not (self.last_ttl_known or self.default_ttl_known): - raise dns.exception.SyntaxError("Missing default TTL value") - if self.default_ttl_known: - ttl = self.default_ttl - else: - ttl = self.last_ttl - # Class - try: - rdclass = dns.rdataclass.from_text(token.value) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except dns.exception.SyntaxError: - raise dns.exception.SyntaxError - except Exception: - rdclass = self.zone.rdclass - if rdclass != self.zone.rdclass: - raise dns.exception.SyntaxError("RR class is not zone's class") - # Type - try: - rdtype = dns.rdatatype.from_text(token.value) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except Exception: - raise dns.exception.SyntaxError("unknown rdatatype '%s'" % - token.value) - - # lhs (required) - try: - rhs = token.value - except: - raise dns.exception.SyntaxError - - lmod, lsign, loffset, lwidth, lbase = self._parse_modify(lhs) - rmod, rsign, roffset, rwidth, rbase = self._parse_modify(rhs) - for i in range(start, stop + 1, step): - # +1 because bind is inclusive and python is exclusive - - if lsign == u'+': - lindex = i + int(loffset) - elif lsign == u'-': - lindex = i - int(loffset) - - if rsign == u'-': - rindex = i - int(roffset) - elif rsign == u'+': - rindex = i + int(roffset) - - lzfindex = str(lindex).zfill(int(lwidth)) - rzfindex = str(rindex).zfill(int(rwidth)) - - name = lhs.replace(u'$%s' % (lmod), lzfindex) - rdata = rhs.replace(u'$%s' % (rmod), rzfindex) - - self.last_name = dns.name.from_text(name, self.current_origin) - name = self.last_name - if not name.is_subdomain(self.zone.origin): - self._eat_line() - return - if self.relativize: - name = name.relativize(self.zone.origin) - - n = self.zone.nodes.get(name) - if n is None: - n = self.zone.node_factory() - self.zone.nodes[name] = n - try: - rd = dns.rdata.from_text(rdclass, rdtype, rdata, - self.current_origin, False) - except dns.exception.SyntaxError: - # Catch and reraise. - (ty, va) = sys.exc_info()[:2] - raise va - except: - # All exceptions that occur in the processing of rdata - # are treated as syntax errors. This is not strictly - # correct, but it is correct almost all of the time. - # We convert them to syntax errors so that we can emit - # helpful filename:line info. - (ty, va) = sys.exc_info()[:2] - raise dns.exception.SyntaxError("caught exception %s: %s" % - (str(ty), str(va))) - - rd.choose_relativity(self.zone.origin, self.relativize) - covers = rd.covers() - rds = n.find_rdataset(rdclass, rdtype, covers, True) - rds.add(rd, ttl) - - def read(self): - """Read a DNS master file and build a zone object. - - @raises dns.zone.NoSOA: No SOA RR was found at the zone origin - @raises dns.zone.NoNS: No NS RRset was found at the zone origin - """ - - try: - while 1: - token = self.tok.get(True, True) - if token.is_eof(): - if self.current_file is not None: - self.current_file.close() - if len(self.saved_state) > 0: - (self.tok, - self.current_origin, - self.last_name, - self.current_file, - self.last_ttl, - self.last_ttl_known, - self.default_ttl, - self.default_ttl_known) = self.saved_state.pop(-1) - continue - break - elif token.is_eol(): - continue - elif token.is_comment(): - self.tok.get_eol() - continue - elif token.value[0] == u'$': - c = token.value.upper() - if c == u'$TTL': - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError("bad $TTL") - self.default_ttl = dns.ttl.from_text(token.value) - self.default_ttl_known = True - self.tok.get_eol() - elif c == u'$ORIGIN': - self.current_origin = self.tok.get_name() - self.tok.get_eol() - if self.zone.origin is None: - self.zone.origin = self.current_origin - elif c == u'$INCLUDE' and self.allow_include: - token = self.tok.get() - filename = token.value - token = self.tok.get() - if token.is_identifier(): - new_origin =\ - dns.name.from_text(token.value, - self.current_origin) - self.tok.get_eol() - elif not token.is_eol_or_eof(): - raise dns.exception.SyntaxError( - "bad origin in $INCLUDE") - else: - new_origin = self.current_origin - self.saved_state.append((self.tok, - self.current_origin, - self.last_name, - self.current_file, - self.last_ttl, - self.last_ttl_known, - self.default_ttl, - self.default_ttl_known)) - self.current_file = open(filename, 'r') - self.tok = dns.tokenizer.Tokenizer(self.current_file, - filename) - self.current_origin = new_origin - elif c == u'$GENERATE': - self._generate_line() - else: - raise dns.exception.SyntaxError( - "Unknown master file directive '" + c + "'") - continue - self.tok.unget(token) - self._rr_line() - except dns.exception.SyntaxError as detail: - (filename, line_number) = self.tok.where() - if detail is None: - detail = "syntax error" - raise dns.exception.SyntaxError( - "%s:%d: %s" % (filename, line_number, detail)) - - # Now that we're done reading, do some basic checking of the zone. - if self.check_origin: - self.zone.check_origin() - - -def from_text(text, origin=None, rdclass=dns.rdataclass.IN, - relativize=True, zone_factory=Zone, filename=None, - allow_include=False, check_origin=True): - """Build a zone object from a master file format string. - - @param text: the master file format input - @type text: string. - @param origin: The origin of the zone; if not specified, the first - $ORIGIN statement in the master file will determine the origin of the - zone. - @type origin: dns.name.Name object or string - @param rdclass: The zone's rdata class; the default is class IN. - @type rdclass: int - @param relativize: should names be relativized? The default is True - @type relativize: bool - @param zone_factory: The zone factory to use - @type zone_factory: function returning a Zone - @param filename: The filename to emit when describing where an error - occurred; the default is '<string>'. - @type filename: string - @param allow_include: is $INCLUDE allowed? - @type allow_include: bool - @param check_origin: should sanity checks of the origin node be done? - The default is True. - @type check_origin: bool - @raises dns.zone.NoSOA: No SOA RR was found at the zone origin - @raises dns.zone.NoNS: No NS RRset was found at the zone origin - @rtype: dns.zone.Zone object - """ - - # 'text' can also be a file, but we don't publish that fact - # since it's an implementation detail. The official file - # interface is from_file(). - - if filename is None: - filename = '<string>' - tok = dns.tokenizer.Tokenizer(text, filename) - reader = _MasterReader(tok, origin, rdclass, relativize, zone_factory, - allow_include=allow_include, - check_origin=check_origin) - reader.read() - return reader.zone - - -def from_file(f, origin=None, rdclass=dns.rdataclass.IN, - relativize=True, zone_factory=Zone, filename=None, - allow_include=True, check_origin=True): - """Read a master file and build a zone object. - - @param f: file or string. If I{f} is a string, it is treated - as the name of a file to open. - @param origin: The origin of the zone; if not specified, the first - $ORIGIN statement in the master file will determine the origin of the - zone. - @type origin: dns.name.Name object or string - @param rdclass: The zone's rdata class; the default is class IN. - @type rdclass: int - @param relativize: should names be relativized? The default is True - @type relativize: bool - @param zone_factory: The zone factory to use - @type zone_factory: function returning a Zone - @param filename: The filename to emit when describing where an error - occurred; the default is '<file>', or the value of I{f} if I{f} is a - string. - @type filename: string - @param allow_include: is $INCLUDE allowed? - @type allow_include: bool - @param check_origin: should sanity checks of the origin node be done? - The default is True. - @type check_origin: bool - @raises dns.zone.NoSOA: No SOA RR was found at the zone origin - @raises dns.zone.NoNS: No NS RRset was found at the zone origin - @rtype: dns.zone.Zone object - """ - - str_type = string_types - if PY3: - opts = 'r' - else: - opts = 'rU' - - if isinstance(f, str_type): - if filename is None: - filename = f - f = open(f, opts) - want_close = True - else: - if filename is None: - filename = '<file>' - want_close = False - - try: - z = from_text(f, origin, rdclass, relativize, zone_factory, - filename, allow_include, check_origin) - finally: - if want_close: - f.close() - return z - - -def from_xfr(xfr, zone_factory=Zone, relativize=True, check_origin=True): - """Convert the output of a zone transfer generator into a zone object. - - @param xfr: The xfr generator - @type xfr: generator of dns.message.Message objects - @param relativize: should names be relativized? The default is True. - It is essential that the relativize setting matches the one specified - to dns.query.xfr(). - @type relativize: bool - @param check_origin: should sanity checks of the origin node be done? - The default is True. - @type check_origin: bool - @raises dns.zone.NoSOA: No SOA RR was found at the zone origin - @raises dns.zone.NoNS: No NS RRset was found at the zone origin - @rtype: dns.zone.Zone object - """ - - z = None - for r in xfr: - if z is None: - if relativize: - origin = r.origin - else: - origin = r.answer[0].name - rdclass = r.answer[0].rdclass - z = zone_factory(origin, rdclass, relativize=relativize) - for rrset in r.answer: - znode = z.nodes.get(rrset.name) - if not znode: - znode = z.node_factory() - z.nodes[rrset.name] = znode - zrds = znode.find_rdataset(rrset.rdclass, rrset.rdtype, - rrset.covers, True) - zrds.update_ttl(rrset.ttl) - for rd in rrset: - rd.choose_relativity(z.origin, relativize) - zrds.add(rd) - if check_origin: - z.check_origin() - return z diff --git a/lib/dns/zone.pyi b/lib/dns/zone.pyi deleted file mode 100644 index 911d7a01..00000000 --- a/lib/dns/zone.pyi +++ /dev/null @@ -1,55 +0,0 @@ -from typing import Generator, Optional, Union, Tuple, Iterable, Callable, Any, Iterator, TextIO, BinaryIO, Dict -from . import rdata, zone, rdataclass, name, rdataclass, message, rdatatype, exception, node, rdataset, rrset, rdatatype - -class BadZone(exception.DNSException): ... -class NoSOA(BadZone): ... -class NoNS(BadZone): ... -class UnknownOrigin(BadZone): ... - -class Zone: - def __getitem__(self, key : str) -> node.Node: - ... - def __init__(self, origin : Union[str,name.Name], rdclass : int = rdataclass.IN, relativize : bool = True) -> None: - self.nodes : Dict[str,node.Node] - self.origin = origin - def values(self): - return self.nodes.values() - def iterate_rdatas(self, rdtype : Union[int,str] = rdatatype.ANY, covers : Union[int,str] = None) -> Iterable[Tuple[name.Name, int, rdata.Rdata]]: - ... - def __iter__(self) -> Iterator[str]: - ... - def get_node(self, name : Union[name.Name,str], create=False) -> Optional[node.Node]: - ... - def find_rrset(self, name : Union[str,name.Name], rdtype : Union[int,str], covers=rdatatype.NONE) -> rrset.RRset: - ... - def find_rdataset(self, name : Union[str,name.Name], rdtype : Union[str,int], covers=rdatatype.NONE, - create=False) -> rdataset.Rdataset: - ... - def get_rdataset(self, name : Union[str,name.Name], rdtype : Union[str,int], covers=rdatatype.NONE, create=False) -> Optional[rdataset.Rdataset]: - ... - def get_rrset(self, name : Union[str,name.Name], rdtype : Union[str,int], covers=rdatatype.NONE) -> Optional[rrset.RRset]: - ... - def replace_rdataset(self, name : Union[str,name.Name], replacement : rdataset.Rdataset) -> None: - ... - def delete_rdataset(self, name : Union[str,name.Name], rdtype : Union[str,int], covers=rdatatype.NONE) -> None: - ... - def iterate_rdatasets(self, rdtype : Union[str,int] =rdatatype.ANY, - covers : Union[str,int] =rdatatype.NONE): - ... - def to_file(self, f : Union[TextIO, BinaryIO, str], sorted=True, relativize=True, nl : Optional[bytes] = None): - ... - def to_text(self, sorted=True, relativize=True, nl : Optional[bytes] = None) -> bytes: - ... - -def from_xfr(xfr : Generator[Any,Any,message.Message], zone_factory : Callable[..., zone.Zone] = zone.Zone, relativize=True, check_origin=True): - ... - -def from_text(text : str, origin : Optional[Union[str,name.Name]] = None, rdclass : int = rdataclass.IN, - relativize=True, zone_factory : Callable[...,zone.Zone] = zone.Zone, filename : Optional[str] = None, - allow_include=False, check_origin=True) -> zone.Zone: - ... - -def from_file(f, origin : Optional[Union[str,name.Name]] = None, rdclass=rdataclass.IN, - relativize=True, zone_factory : Callable[..., zone.Zone] = Zone, filename : Optional[str] = None, - allow_include=True, check_origin=True) -> zone.Zone: - ... diff --git a/lib/guessit/__init__.py b/lib/guessit/__init__.py new file mode 100644 index 00000000..03f8d208 --- /dev/null +++ b/lib/guessit/__init__.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Extracts as much information as possible from a video file. +""" +from . import monkeypatch as _monkeypatch + +from .api import guessit, GuessItApi +from .options import ConfigurationException +from .rules.common.quantity import Size + +from .__version__ import __version__ + +_monkeypatch.monkeypatch_rebulk() diff --git a/lib/guessit/__main__.py b/lib/guessit/__main__.py new file mode 100644 index 00000000..fad196d6 --- /dev/null +++ b/lib/guessit/__main__.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Entry point module +""" +# pragma: no cover +from __future__ import print_function + +import json +import logging +import os +import sys + +import six +from rebulk.__version__ import __version__ as __rebulk_version__ + +from guessit import api +from guessit.__version__ import __version__ +from guessit.jsonutils import GuessitEncoder +from guessit.options import argument_parser, parse_options, load_config, merge_options + + +try: + from collections import OrderedDict +except ImportError: # pragma: no-cover + from ordereddict import OrderedDict # pylint:disable=import-error + + +def guess_filename(filename, options): + """ + Guess a single filename using given options + :param filename: filename to parse + :type filename: str + :param options: + :type options: dict + :return: + :rtype: + """ + if not options.get('yaml') and not options.get('json') and not options.get('show_property'): + print('For:', filename) + + guess = api.guessit(filename, options) + + if options.get('show_property'): + print(guess.get(options.get('show_property'), '')) + return + + if options.get('json'): + print(json.dumps(guess, cls=GuessitEncoder, ensure_ascii=False)) + elif options.get('yaml'): + import yaml + from guessit import yamlutils + + ystr = yaml.dump({filename: OrderedDict(guess)}, Dumper=yamlutils.CustomDumper, default_flow_style=False, + allow_unicode=True) + i = 0 + for yline in ystr.splitlines(): + if i == 0: + print("? " + yline[:-1]) + elif i == 1: + print(":" + yline[1:]) + else: + print(yline) + i += 1 + else: + print('GuessIt found:', json.dumps(guess, cls=GuessitEncoder, indent=4, ensure_ascii=False)) + + +def display_properties(options): + """ + Display properties + """ + properties = api.properties(options) + + if options.get('json'): + if options.get('values'): + print(json.dumps(properties, cls=GuessitEncoder, ensure_ascii=False)) + else: + print(json.dumps(list(properties.keys()), cls=GuessitEncoder, ensure_ascii=False)) + elif options.get('yaml'): + import yaml + from guessit import yamlutils + if options.get('values'): + print(yaml.dump(properties, Dumper=yamlutils.CustomDumper, default_flow_style=False, allow_unicode=True)) + else: + print(yaml.dump(list(properties.keys()), Dumper=yamlutils.CustomDumper, default_flow_style=False, + allow_unicode=True)) + else: + print('GuessIt properties:') + + properties_list = list(sorted(properties.keys())) + for property_name in properties_list: + property_values = properties.get(property_name) + print(2 * ' ' + '[+] %s' % (property_name,)) + if property_values and options.get('values'): + for property_value in property_values: + print(4 * ' ' + '[!] %s' % (property_value,)) + + +def fix_argv_encoding(): + """ + Fix encoding of sys.argv on windows Python 2 + """ + if six.PY2 and os.name == 'nt': # pragma: no cover + # see http://bugs.python.org/issue2128 + import locale + + for i, j in enumerate(sys.argv): + sys.argv[i] = j.decode(locale.getpreferredencoding()) + + +def main(args=None): # pylint:disable=too-many-branches + """ + Main function for entry point + """ + fix_argv_encoding() + + if args is None: # pragma: no cover + options = parse_options() + else: + options = parse_options(args) + + config = load_config(options) + options = merge_options(config, options) + + if options.get('verbose'): + logging.basicConfig(stream=sys.stdout, format='%(message)s') + logging.getLogger().setLevel(logging.DEBUG) + + help_required = True + + if options.get('version'): + print('+-------------------------------------------------------+') + print('+ GuessIt ' + __version__ + (28 - len(__version__)) * ' ' + '+') + print('+-------------------------------------------------------+') + print('+ Rebulk ' + __rebulk_version__ + (29 - len(__rebulk_version__)) * ' ' + '+') + print('+-------------------------------------------------------+') + print('| Please report any bug or feature request at |') + print('| https://github.com/guessit-io/guessit/issues. |') + print('+-------------------------------------------------------+') + help_required = False + + if options.get('yaml'): + try: + import yaml # pylint:disable=unused-variable,unused-import + except ImportError: # pragma: no cover + del options['yaml'] + print('PyYAML is not installed. \'--yaml\' option will be ignored ...', file=sys.stderr) + + if options.get('properties') or options.get('values'): + display_properties(options) + help_required = False + + filenames = [] + if options.get('filename'): + for filename in options.get('filename'): + filenames.append(filename) + if options.get('input_file'): + if six.PY2: + input_file = open(options.get('input_file'), 'r') + else: + input_file = open(options.get('input_file'), 'r', encoding='utf-8') + try: + filenames.extend([line.strip() for line in input_file.readlines()]) + finally: + input_file.close() + + filenames = list(filter(lambda f: f, filenames)) + + if filenames: + for filename in filenames: + help_required = False + guess_filename(filename, options) + + if help_required: # pragma: no cover + argument_parser.print_help() + + +if __name__ == '__main__': # pragma: no cover + main() diff --git a/lib/guessit/__version__.py b/lib/guessit/__version__.py new file mode 100644 index 00000000..0cd3e067 --- /dev/null +++ b/lib/guessit/__version__.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Version module +""" +# pragma: no cover +__version__ = '3.1.2.dev0' diff --git a/lib/guessit/api.py b/lib/guessit/api.py new file mode 100644 index 00000000..8e306340 --- /dev/null +++ b/lib/guessit/api.py @@ -0,0 +1,263 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +API functions that can be used by external software +""" + +try: + from collections import OrderedDict +except ImportError: # pragma: no-cover + from ordereddict import OrderedDict # pylint:disable=import-error + +import os +import traceback + +import six +from rebulk.introspector import introspect + +from .__version__ import __version__ +from .options import parse_options, load_config, merge_options +from .rules import rebulk_builder + + +class GuessitException(Exception): + """ + Exception raised when guessit fails to perform a guess because of an internal error. + """ + + def __init__(self, string, options): + super(GuessitException, self).__init__("An internal error has occured in guessit.\n" + "===================== Guessit Exception Report =====================\n" + "version=%s\n" + "string=%s\n" + "options=%s\n" + "--------------------------------------------------------------------\n" + "%s" + "--------------------------------------------------------------------\n" + "Please report at " + "https://github.com/guessit-io/guessit/issues.\n" + "====================================================================" % + (__version__, str(string), str(options), traceback.format_exc())) + + self.string = string + self.options = options + + +def configure(options=None, rules_builder=rebulk_builder, force=False): + """ + Load configuration files and initialize rebulk rules if required. + + :param options: + :type options: dict + :param rules_builder: + :type rules_builder: + :param force: + :type force: bool + :return: + """ + default_api.configure(options, rules_builder=rules_builder, force=force) + + +def guessit(string, options=None): + """ + Retrieves all matches from string as a dict + :param string: the filename or release name + :type string: str + :param options: + :type options: str|dict + :return: + :rtype: + """ + return default_api.guessit(string, options) + + +def properties(options=None): + """ + Retrieves all properties with possible values that can be guessed + :param options: + :type options: str|dict + :return: + :rtype: + """ + return default_api.properties(options) + + +def suggested_expected(titles, options=None): + """ + Return a list of suggested titles to be used as `expected_title` based on the list of titles + :param titles: the filename or release name + :type titles: list|set|dict + :param options: + :type options: str|dict + :return: + :rtype: list of str + """ + return default_api.suggested_expected(titles, options) + + +class GuessItApi(object): + """ + An api class that can be configured with custom Rebulk configuration. + """ + + def __init__(self): + """Default constructor.""" + self.rebulk = None + self.config = None + self.load_config_options = None + self.advanced_config = None + + @classmethod + def _fix_encoding(cls, value): + if isinstance(value, list): + return [cls._fix_encoding(item) for item in value] + if isinstance(value, dict): + return {cls._fix_encoding(k): cls._fix_encoding(v) for k, v in value.items()} + if six.PY2 and isinstance(value, six.text_type): + return value.encode('utf-8') + if six.PY3 and isinstance(value, six.binary_type): + return value.decode('ascii') + return value + + @classmethod + def _has_same_properties(cls, dic1, dic2, values): + for value in values: + if dic1.get(value) != dic2.get(value): + return False + return True + + def configure(self, options=None, rules_builder=rebulk_builder, force=False, sanitize_options=True): + """ + Load configuration files and initialize rebulk rules if required. + + :param options: + :type options: str|dict + :param rules_builder: + :type rules_builder: + :param force: + :type force: bool + :return: + :rtype: dict + """ + if sanitize_options: + options = parse_options(options, True) + options = self._fix_encoding(options) + + if self.config is None or self.load_config_options is None or force or \ + not self._has_same_properties(self.load_config_options, + options, + ['config', 'no_user_config', 'no_default_config']): + config = load_config(options) + config = self._fix_encoding(config) + self.load_config_options = options + else: + config = self.config + + advanced_config = merge_options(config.get('advanced_config'), options.get('advanced_config')) + + should_build_rebulk = force or not self.rebulk or not self.advanced_config or \ + self.advanced_config != advanced_config + + if should_build_rebulk: + self.advanced_config = advanced_config + self.rebulk = rules_builder(advanced_config) + + self.config = config + return self.config + + def guessit(self, string, options=None): # pylint: disable=too-many-branches + """ + Retrieves all matches from string as a dict + :param string: the filename or release name + :type string: str|Path + :param options: + :type options: str|dict + :return: + :rtype: + """ + try: + from pathlib import Path + if isinstance(string, Path): + try: + # Handle path-like object + string = os.fspath(string) + except AttributeError: + string = str(string) + except ImportError: + pass + + try: + options = parse_options(options, True) + options = self._fix_encoding(options) + config = self.configure(options, sanitize_options=False) + options = merge_options(config, options) + result_decode = False + result_encode = False + + if six.PY2: + if isinstance(string, six.text_type): + string = string.encode("utf-8") + result_decode = True + elif isinstance(string, six.binary_type): + string = six.binary_type(string) + if six.PY3: + if isinstance(string, six.binary_type): + string = string.decode('ascii') + result_encode = True + elif isinstance(string, six.text_type): + string = six.text_type(string) + + matches = self.rebulk.matches(string, options) + if result_decode: + for match in matches: + if isinstance(match.value, six.binary_type): + match.value = match.value.decode("utf-8") + if result_encode: + for match in matches: + if isinstance(match.value, six.text_type): + match.value = match.value.encode("ascii") + return matches.to_dict(options.get('advanced', False), options.get('single_value', False), + options.get('enforce_list', False)) + except: + raise GuessitException(string, options) + + def properties(self, options=None): + """ + Grab properties and values that can be generated. + :param options: + :type options: + :return: + :rtype: + """ + options = parse_options(options, True) + options = self._fix_encoding(options) + config = self.configure(options, sanitize_options=False) + options = merge_options(config, options) + unordered = introspect(self.rebulk, options).properties + ordered = OrderedDict() + for k in sorted(unordered.keys(), key=six.text_type): + ordered[k] = list(sorted(unordered[k], key=six.text_type)) + if hasattr(self.rebulk, 'customize_properties'): + ordered = self.rebulk.customize_properties(ordered) + return ordered + + def suggested_expected(self, titles, options=None): + """ + Return a list of suggested titles to be used as `expected_title` based on the list of titles + :param titles: the filename or release name + :type titles: list|set|dict + :param options: + :type options: str|dict + :return: + :rtype: list of str + """ + suggested = [] + for title in titles: + guess = self.guessit(title, options) + if len(guess) != 2 or 'title' not in guess: + suggested.append(title) + + return suggested + + +default_api = GuessItApi() diff --git a/lib/guessit/backports.py b/lib/guessit/backports.py new file mode 100644 index 00000000..c149a6b5 --- /dev/null +++ b/lib/guessit/backports.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Backports +""" +# pragma: no-cover +# pylint: skip-file + +def cmp_to_key(mycmp): + """functools.cmp_to_key backport""" + class KeyClass(object): + """Key class""" + def __init__(self, obj, *args): # pylint: disable=unused-argument + self.obj = obj + def __lt__(self, other): + return mycmp(self.obj, other.obj) < 0 + def __gt__(self, other): + return mycmp(self.obj, other.obj) > 0 + def __eq__(self, other): + return mycmp(self.obj, other.obj) == 0 + def __le__(self, other): + return mycmp(self.obj, other.obj) <= 0 + def __ge__(self, other): + return mycmp(self.obj, other.obj) >= 0 + def __ne__(self, other): + return mycmp(self.obj, other.obj) != 0 + return KeyClass diff --git a/lib/guessit/config/options.json b/lib/guessit/config/options.json new file mode 100644 index 00000000..da7c7030 --- /dev/null +++ b/lib/guessit/config/options.json @@ -0,0 +1,586 @@ +{ + "expected_title": [ + "OSS 117", + "This is Us" + ], + "allowed_countries": [ + "au", + "gb", + "us" + ], + "allowed_languages": [ + "ca", + "cs", + "de", + "en", + "es", + "fr", + "he", + "hi", + "hu", + "it", + "ja", + "ko", + "mul", + "nl", + "no", + "pl", + "pt", + "ro", + "ru", + "sv", + "te", + "uk", + "und" + ], + "advanced_config": { + "common_words": [ + "ca", + "cat", + "de", + "he", + "it", + "no", + "por", + "rum", + "se", + "st", + "sub" + ], + "groups": { + "starting": "([{", + "ending": ")]}" + }, + "audio_codec": { + "audio_channels": { + "1.0": [ + "1ch", + "mono" + ], + "2.0": [ + "2ch", + "stereo", + "re:(2[\\W_]0(?:ch)?)(?=[^\\d]|$)" + ], + "5.1": [ + "5ch", + "6ch", + "re:(5[\\W_][01](?:ch)?)(?=[^\\d]|$)", + "re:(6[\\W_]0(?:ch)?)(?=[^\\d]|$)" + ], + "7.1": [ + "7ch", + "8ch", + "re:(7[\\W_][01](?:ch)?)(?=[^\\d]|$)" + ] + } + }, + "container": { + "subtitles": [ + "srt", + "idx", + "sub", + "ssa", + "ass" + ], + "info": [ + "nfo" + ], + "videos": [ + "3g2", + "3gp", + "3gp2", + "asf", + "avi", + "divx", + "flv", + "iso", + "m4v", + "mk2", + "mk3d", + "mka", + "mkv", + "mov", + "mp4", + "mp4a", + "mpeg", + "mpg", + "ogg", + "ogm", + "ogv", + "qt", + "ra", + "ram", + "rm", + "ts", + "vob", + "wav", + "webm", + "wma", + "wmv" + ], + "torrent": [ + "torrent" + ], + "nzb": [ + "nzb" + ] + }, + "country": { + "synonyms": { + "ES": [ + "españa" + ], + "GB": [ + "UK" + ], + "BR": [ + "brazilian", + "bra" + ], + "CA": [ + "québec", + "quebec", + "qc" + ], + "MX": [ + "Latinoamérica", + "latin america" + ] + } + }, + "episodes": { + "season_max_range": 100, + "episode_max_range": 100, + "max_range_gap": 1, + "season_markers": [ + "s" + ], + "season_ep_markers": [ + "x" + ], + "disc_markers": [ + "d" + ], + "episode_markers": [ + "xe", + "ex", + "ep", + "e", + "x" + ], + "range_separators": [ + "-", + "~", + "to", + "a" + ], + "discrete_separators": [ + "+", + "&", + "and", + "et" + ], + "season_words": [ + "season", + "saison", + "seizoen", + "seasons", + "saisons", + "tem", + "temp", + "temporada", + "temporadas", + "stagione" + ], + "episode_words": [ + "episode", + "episodes", + "eps", + "ep", + "episodio", + "episodios", + "capitulo", + "capitulos" + ], + "of_words": [ + "of", + "sur" + ], + "all_words": [ + "All" + ] + }, + "language": { + "synonyms": { + "ell": [ + "gr", + "greek" + ], + "spa": [ + "esp", + "español", + "espanol" + ], + "fra": [ + "français", + "vf", + "vff", + "vfi", + "vfq" + ], + "swe": [ + "se" + ], + "por_BR": [ + "po", + "pb", + "pob", + "ptbr", + "br", + "brazilian" + ], + "deu_CH": [ + "swissgerman", + "swiss german" + ], + "nld_BE": [ + "flemish" + ], + "cat": [ + "català", + "castellano", + "espanol castellano", + "español castellano" + ], + "ces": [ + "cz" + ], + "ukr": [ + "ua" + ], + "zho": [ + "cn" + ], + "jpn": [ + "jp" + ], + "hrv": [ + "scr" + ], + "mul": [ + "multi", + "dl" + ] + }, + "subtitle_affixes": [ + "sub", + "subs", + "esub", + "esubs", + "subbed", + "custom subbed", + "custom subs", + "custom sub", + "customsubbed", + "customsubs", + "customsub", + "soft subtitles", + "soft subs" + ], + "subtitle_prefixes": [ + "st", + "vost", + "subforced", + "fansub", + "hardsub", + "legenda", + "legendas", + "legendado", + "subtitulado", + "soft", + "subtitles" + ], + "subtitle_suffixes": [ + "subforced", + "fansub", + "hardsub" + ], + "language_affixes": [ + "dublado", + "dubbed", + "dub" + ], + "language_prefixes": [ + "true" + ], + "language_suffixes": [ + "audio" + ], + "weak_affixes": [ + "v", + "audio", + "true" + ] + }, + "part": { + "prefixes": [ + "pt", + "part" + ] + }, + "release_group": { + "forbidden_names": [ + "bonus", + "by", + "for", + "par", + "pour", + "rip" + ], + "ignored_seps": "[]{}()" + }, + "screen_size": { + "frame_rates": [ + "23.976", + "24", + "25", + "29.970", + "30", + "48", + "50", + "60", + "120" + ], + "min_ar": 1.333, + "max_ar": 1.898, + "interlaced": [ + "360", + "480", + "576", + "900", + "1080" + ], + "progressive": [ + "360", + "480", + "540", + "576", + "900", + "1080", + "368", + "720", + "1440", + "2160", + "4320" + ] + }, + "website": { + "safe_tlds": [ + "com", + "net", + "org" + ], + "safe_subdomains": [ + "www" + ], + "safe_prefixes": [ + "co", + "com", + "net", + "org" + ], + "prefixes": [ + "from" + ] + }, + "streaming_service": { + "A&E": [ + "AE", + "A&E" + ], + "ABC": "AMBC", + "ABC Australia": "AUBC", + "Al Jazeera English": "AJAZ", + "AMC": "AMC", + "Amazon Prime": [ + "AMZN", + "Amazon", + "re:Amazon-?Prime" + ], + "Adult Swim": [ + "AS", + "re:Adult-?Swim" + ], + "America's Test Kitchen": "ATK", + "Animal Planet": "ANPL", + "AnimeLab": "ANLB", + "AOL": "AOL", + "ARD": "ARD", + "BBC iPlayer": [ + "iP", + "re:BBC-?iPlayer" + ], + "BravoTV": "BRAV", + "Canal+": "CNLP", + "Cartoon Network": "CN", + "CBC": "CBC", + "CBS": "CBS", + "CNBC": "CNBC", + "Comedy Central": [ + "CC", + "re:Comedy-?Central" + ], + "Channel 4": "4OD", + "CHRGD": "CHGD", + "Cinemax": "CMAX", + "Country Music Television": "CMT", + "Comedians in Cars Getting Coffee": "CCGC", + "Crunchy Roll": [ + "CR", + "re:Crunchy-?Roll" + ], + "Crackle": "CRKL", + "CSpan": "CSPN", + "CTV": "CTV", + "CuriosityStream": "CUR", + "CWSeed": "CWS", + "Daisuki": "DSKI", + "DC Universe": "DCU", + "Deadhouse Films": "DHF", + "DramaFever": [ + "DF", + "DramaFever" + ], + "Digiturk Diledigin Yerde": "DDY", + "Discovery": [ + "DISC", + "Discovery" + ], + "Disney": [ + "DSNY", + "Disney" + ], + "DIY Network": "DIY", + "Doc Club": "DOCC", + "DPlay": "DPLY", + "E!": "ETV", + "ePix": "EPIX", + "El Trece": "ETTV", + "ESPN": "ESPN", + "Esquire": "ESQ", + "Family": "FAM", + "Family Jr": "FJR", + "Food Network": "FOOD", + "Fox": "FOX", + "Freeform": "FREE", + "FYI Network": "FYI", + "Global": "GLBL", + "GloboSat Play": "GLOB", + "Hallmark": "HLMK", + "HBO Go": [ + "HBO", + "re:HBO-?Go" + ], + "HGTV": "HGTV", + "History": [ + "HIST", + "History" + ], + "Hulu": "HULU", + "Investigation Discovery": "ID", + "IFC": "IFC", + "iTunes": "iTunes", + "ITV": "ITV", + "Knowledge Network": "KNOW", + "Lifetime": "LIFE", + "Motor Trend OnDemand": "MTOD", + "MBC": [ + "MBC", + "MBCVOD" + ], + "MSNBC": "MNBC", + "MTV": "MTV", + "National Geographic": [ + "NATG", + "re:National-?Geographic" + ], + "NBA TV": [ + "NBA", + "re:NBA-?TV" + ], + "NBC": "NBC", + "Netflix": [ + "NF", + "Netflix" + ], + "NFL": "NFL", + "NFL Now": "NFLN", + "NHL GameCenter": "GC", + "Nickelodeon": [ + "NICK", + "Nickelodeon" + ], + "Norsk Rikskringkasting": "NRK", + "OnDemandKorea": [ + "ODK", + "OnDemandKorea" + ], + "PBS": "PBS", + "PBS Kids": "PBSK", + "Playstation Network": "PSN", + "Pluzz": "PLUZ", + "RTE One": "RTE", + "SBS (AU)": "SBS", + "SeeSo": [ + "SESO", + "SeeSo" + ], + "Shomi": "SHMI", + "Spike": "SPIK", + "Spike TV": [ + "SPKE", + "re:Spike-?TV" + ], + "Sportsnet": "SNET", + "Sprout": "SPRT", + "Stan": "STAN", + "Starz": "STZ", + "Sveriges Television": "SVT", + "SwearNet": "SWER", + "Syfy": "SYFY", + "TBS": "TBS", + "TFou": "TFOU", + "The CW": [ + "CW", + "re:The-?CW" + ], + "TLC": "TLC", + "TubiTV": "TUBI", + "TV3 Ireland": "TV3", + "TV4 Sweeden": "TV4", + "TVING": "TVING", + "TV Land": [ + "TVL", + "re:TV-?Land" + ], + "UFC": "UFC", + "UKTV": "UKTV", + "Univision": "UNIV", + "USA Network": "USAN", + "Velocity": "VLCT", + "VH1": "VH1", + "Viceland": "VICE", + "Viki": "VIKI", + "Vimeo": "VMEO", + "VRV": "VRV", + "W Network": "WNET", + "WatchMe": "WME", + "WWE Network": "WWEN", + "Xbox Video": "XBOX", + "Yahoo": "YHOO", + "YouTube Red": "RED", + "ZDF": "ZDF" + } + } +} diff --git a/lib/guessit/jsonutils.py b/lib/guessit/jsonutils.py new file mode 100644 index 00000000..0a0ac3a6 --- /dev/null +++ b/lib/guessit/jsonutils.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +JSON Utils +""" +import json + +from six import text_type +from rebulk.match import Match + +class GuessitEncoder(json.JSONEncoder): + """ + JSON Encoder for guessit response + """ + + def default(self, o): # pylint:disable=method-hidden + if isinstance(o, Match): + return o.advanced + if hasattr(o, 'name'): # Babelfish languages/countries long name + return text_type(o.name) + # pragma: no cover + return text_type(o) diff --git a/lib/guessit/monkeypatch.py b/lib/guessit/monkeypatch.py new file mode 100644 index 00000000..33e7c46e --- /dev/null +++ b/lib/guessit/monkeypatch.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Monkeypatch initialisation functions +""" + +try: + from collections import OrderedDict +except ImportError: # pragma: no-cover + from ordereddict import OrderedDict # pylint:disable=import-error + +from rebulk.match import Match + + +def monkeypatch_rebulk(): + """Monkeypatch rebulk classes""" + + @property + def match_advanced(self): + """ + Build advanced dict from match + :param self: + :return: + """ + + ret = OrderedDict() + ret['value'] = self.value + if self.raw: + ret['raw'] = self.raw + ret['start'] = self.start + ret['end'] = self.end + return ret + + Match.advanced = match_advanced diff --git a/lib/guessit/options.py b/lib/guessit/options.py new file mode 100644 index 00000000..8fa6825c --- /dev/null +++ b/lib/guessit/options.py @@ -0,0 +1,295 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Options +""" +import copy +import json +import os +import pkgutil +import shlex + +from argparse import ArgumentParser + +import six + + +def build_argument_parser(): + """ + Builds the argument parser + :return: the argument parser + :rtype: ArgumentParser + """ + opts = ArgumentParser() + opts.add_argument(dest='filename', help='Filename or release name to guess', nargs='*') + + naming_opts = opts.add_argument_group("Naming") + naming_opts.add_argument('-t', '--type', dest='type', default=None, + help='The suggested file type: movie, episode. If undefined, type will be guessed.') + naming_opts.add_argument('-n', '--name-only', dest='name_only', action='store_true', default=None, + help='Parse files as name only, considering "/" and "\\" like other separators.') + naming_opts.add_argument('-Y', '--date-year-first', action='store_true', dest='date_year_first', default=None, + help='If short date is found, consider the first digits as the year.') + naming_opts.add_argument('-D', '--date-day-first', action='store_true', dest='date_day_first', default=None, + help='If short date is found, consider the second digits as the day.') + naming_opts.add_argument('-L', '--allowed-languages', action='append', dest='allowed_languages', default=None, + help='Allowed language (can be used multiple times)') + naming_opts.add_argument('-C', '--allowed-countries', action='append', dest='allowed_countries', default=None, + help='Allowed country (can be used multiple times)') + naming_opts.add_argument('-E', '--episode-prefer-number', action='store_true', dest='episode_prefer_number', + default=None, + help='Guess "serie.213.avi" as the episode 213. Without this option, ' + 'it will be guessed as season 2, episode 13') + naming_opts.add_argument('-T', '--expected-title', action='append', dest='expected_title', default=None, + help='Expected title to parse (can be used multiple times)') + naming_opts.add_argument('-G', '--expected-group', action='append', dest='expected_group', default=None, + help='Expected release group (can be used multiple times)') + naming_opts.add_argument('--includes', action='append', dest='includes', default=None, + help='List of properties to be detected') + naming_opts.add_argument('--excludes', action='append', dest='excludes', default=None, + help='List of properties to be ignored') + + input_opts = opts.add_argument_group("Input") + input_opts.add_argument('-f', '--input-file', dest='input_file', default=None, + help='Read filenames from an input text file. File should use UTF-8 charset.') + + output_opts = opts.add_argument_group("Output") + output_opts.add_argument('-v', '--verbose', action='store_true', dest='verbose', default=None, + help='Display debug output') + output_opts.add_argument('-P', '--show-property', dest='show_property', default=None, + help='Display the value of a single property (title, series, video_codec, year, ...)') + output_opts.add_argument('-a', '--advanced', dest='advanced', action='store_true', default=None, + help='Display advanced information for filename guesses, as json output') + output_opts.add_argument('-s', '--single-value', dest='single_value', action='store_true', default=None, + help='Keep only first value found for each property') + output_opts.add_argument('-l', '--enforce-list', dest='enforce_list', action='store_true', default=None, + help='Wrap each found value in a list even when property has a single value') + output_opts.add_argument('-j', '--json', dest='json', action='store_true', default=None, + help='Display information for filename guesses as json output') + output_opts.add_argument('-y', '--yaml', dest='yaml', action='store_true', default=None, + help='Display information for filename guesses as yaml output') + + conf_opts = opts.add_argument_group("Configuration") + conf_opts.add_argument('-c', '--config', dest='config', action='append', default=None, + help='Filepath to configuration file. Configuration file contains the same ' + 'options as those from command line options, but option names have "-" characters ' + 'replaced with "_". This configuration will be merged with default and user ' + 'configuration files.') + conf_opts.add_argument('--no-user-config', dest='no_user_config', action='store_true', + default=None, + help='Disable user configuration. If not defined, guessit tries to read configuration files ' + 'at ~/.guessit/options.(json|yml|yaml) and ~/.config/guessit/options.(json|yml|yaml)') + conf_opts.add_argument('--no-default-config', dest='no_default_config', action='store_true', + default=None, + help='Disable default configuration. This should be done only if you are providing a full ' + 'configuration through user configuration or --config option. If no "advanced_config" ' + 'is provided by another configuration file, it will still be loaded from default ' + 'configuration.') + + information_opts = opts.add_argument_group("Information") + information_opts.add_argument('-p', '--properties', dest='properties', action='store_true', default=None, + help='Display properties that can be guessed.') + information_opts.add_argument('-V', '--values', dest='values', action='store_true', default=None, + help='Display property values that can be guessed.') + information_opts.add_argument('--version', dest='version', action='store_true', default=None, + help='Display the guessit version.') + + return opts + + +def parse_options(options=None, api=False): + """ + Parse given option string + + :param options: + :type options: + :param api + :type api: boolean + :return: + :rtype: + """ + if isinstance(options, six.string_types): + args = shlex.split(options) + options = vars(argument_parser.parse_args(args)) + elif options is None: + if api: + options = {} + else: + options = vars(argument_parser.parse_args()) + elif not isinstance(options, dict): + options = vars(argument_parser.parse_args(options)) + return options + + +argument_parser = build_argument_parser() + + +class ConfigurationException(Exception): + """ + Exception related to configuration file. + """ + pass # pylint:disable=unnecessary-pass + + +def load_config(options): + """ + Load options from configuration files, if defined and present. + :param options: + :type options: + :return: + :rtype: + """ + configurations = [] + + if not options.get('no_default_config'): + default_options_data = pkgutil.get_data('guessit', 'config/options.json').decode('utf-8') + default_options = json.loads(default_options_data) + configurations.append(default_options) + + config_files = [] + + if not options.get('no_user_config'): + home_directory = os.path.expanduser("~") + cwd = os.getcwd() + yaml_supported = False + try: + import yaml # pylint:disable=unused-variable,unused-import + yaml_supported = True + except ImportError: + pass + + config_file_locations = get_options_file_locations(home_directory, cwd, yaml_supported) + config_files = [f for f in config_file_locations if os.path.exists(f)] + + custom_config_files = options.get('config') + if custom_config_files: + config_files = config_files + custom_config_files + + for config_file in config_files: + config_file_options = load_config_file(config_file) + if config_file_options: + configurations.append(config_file_options) + + config = {} + if configurations: + config = merge_options(*configurations) + + if 'advanced_config' not in config: + # Guessit doesn't work without advanced_config, so we use default if no configuration files provides it. + default_options_data = pkgutil.get_data('guessit', 'config/options.json').decode('utf-8') + default_options = json.loads(default_options_data) + config['advanced_config'] = default_options['advanced_config'] + + return config + + +def merge_options(*options): + """ + Merge options into a single options dict. + :param options: + :type options: + :return: + :rtype: + """ + + merged = {} + if options: + if options[0]: + merged.update(copy.deepcopy(options[0])) + + for options in options[1:]: + if options: + pristine = options.get('pristine') + + if pristine is True: + merged = {} + elif pristine: + for to_reset in pristine: + if to_reset in merged: + del merged[to_reset] + + for (option, value) in options.items(): + merge_option_value(option, value, merged) + + return merged + + +def merge_option_value(option, value, merged): + """ + Merge option value + :param option: + :param value: + :param merged: + :return: + """ + if value is not None and option != 'pristine': + if option in merged.keys() and isinstance(merged[option], list): + for val in value: + if val not in merged[option]: + merged[option].append(val) + elif option in merged.keys() and isinstance(merged[option], dict): + merged[option] = merge_options(merged[option], value) + elif isinstance(value, list): + merged[option] = list(value) + else: + merged[option] = value + + +def load_config_file(filepath): + """ + Load a configuration as an options dict. + + Format of the file is given with filepath extension. + :param filepath: + :type filepath: + :return: + :rtype: + """ + if filepath.endswith('.json'): + with open(filepath) as config_file_data: + return json.load(config_file_data) + if filepath.endswith('.yaml') or filepath.endswith('.yml'): + try: + import yaml + with open(filepath) as config_file_data: + return yaml.load(config_file_data, yaml.SafeLoader) + except ImportError: # pragma: no cover + raise ConfigurationException('Configuration file extension is not supported. ' + 'PyYAML should be installed to support "%s" file' % ( + filepath,)) + + try: + # Try to load input as JSON + return json.loads(filepath) + except: # pylint: disable=bare-except + pass + + raise ConfigurationException('Configuration file extension is not supported for "%s" file.' % (filepath,)) + + +def get_options_file_locations(homedir, cwd, yaml_supported=False): + """ + Get all possible locations for options file. + :param homedir: user home directory + :type homedir: basestring + :param cwd: current working directory + :type homedir: basestring + :return: + :rtype: list + """ + locations = [] + + configdirs = [(os.path.join(homedir, '.guessit'), 'options'), + (os.path.join(homedir, '.config', 'guessit'), 'options'), + (cwd, 'guessit.options')] + configexts = ['json'] + + if yaml_supported: + configexts.append('yaml') + configexts.append('yml') + + for configdir in configdirs: + for configext in configexts: + locations.append(os.path.join(configdir[0], configdir[1] + '.' + configext)) + + return locations diff --git a/lib/guessit/reutils.py b/lib/guessit/reutils.py new file mode 100644 index 00000000..0b654d27 --- /dev/null +++ b/lib/guessit/reutils.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Utils for re module +""" + +from rebulk.remodule import re + + +def build_or_pattern(patterns, name=None, escape=False): + """ + Build a or pattern string from a list of possible patterns + + :param patterns: + :type patterns: + :param name: + :type name: + :param escape: + :type escape: + :return: + :rtype: + """ + or_pattern = [] + for pattern in patterns: + if not or_pattern: + or_pattern.append('(?') + if name: + or_pattern.append('P<' + name + '>') + else: + or_pattern.append(':') + else: + or_pattern.append('|') + or_pattern.append('(?:%s)' % re.escape(pattern) if escape else pattern) + or_pattern.append(')') + return ''.join(or_pattern) diff --git a/lib/guessit/rules/__init__.py b/lib/guessit/rules/__init__.py new file mode 100644 index 00000000..f16bc4e0 --- /dev/null +++ b/lib/guessit/rules/__init__.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Rebulk object default builder +""" +from rebulk import Rebulk + +from .markers.path import path +from .markers.groups import groups + +from .properties.episodes import episodes +from .properties.container import container +from .properties.source import source +from .properties.video_codec import video_codec +from .properties.audio_codec import audio_codec +from .properties.screen_size import screen_size +from .properties.website import website +from .properties.date import date +from .properties.title import title +from .properties.episode_title import episode_title +from .properties.language import language +from .properties.country import country +from .properties.release_group import release_group +from .properties.streaming_service import streaming_service +from .properties.other import other +from .properties.size import size +from .properties.bit_rate import bit_rate +from .properties.edition import edition +from .properties.cds import cds +from .properties.bonus import bonus +from .properties.film import film +from .properties.part import part +from .properties.crc import crc +from .properties.mimetype import mimetype +from .properties.type import type_ + +from .processors import processors + + +def rebulk_builder(config): + """ + Default builder for main Rebulk object used by api. + :return: Main Rebulk object + :rtype: Rebulk + """ + def _config(name): + return config.get(name, {}) + + rebulk = Rebulk() + + common_words = frozenset(_config('common_words')) + + rebulk.rebulk(path(_config('path'))) + rebulk.rebulk(groups(_config('groups'))) + + rebulk.rebulk(episodes(_config('episodes'))) + rebulk.rebulk(container(_config('container'))) + rebulk.rebulk(source(_config('source'))) + rebulk.rebulk(video_codec(_config('video_codec'))) + rebulk.rebulk(audio_codec(_config('audio_codec'))) + rebulk.rebulk(screen_size(_config('screen_size'))) + rebulk.rebulk(website(_config('website'))) + rebulk.rebulk(date(_config('date'))) + rebulk.rebulk(title(_config('title'))) + rebulk.rebulk(episode_title(_config('episode_title'))) + rebulk.rebulk(language(_config('language'), common_words)) + rebulk.rebulk(country(_config('country'), common_words)) + rebulk.rebulk(release_group(_config('release_group'))) + rebulk.rebulk(streaming_service(_config('streaming_service'))) + rebulk.rebulk(other(_config('other'))) + rebulk.rebulk(size(_config('size'))) + rebulk.rebulk(bit_rate(_config('bit_rate'))) + rebulk.rebulk(edition(_config('edition'))) + rebulk.rebulk(cds(_config('cds'))) + rebulk.rebulk(bonus(_config('bonus'))) + rebulk.rebulk(film(_config('film'))) + rebulk.rebulk(part(_config('part'))) + rebulk.rebulk(crc(_config('crc'))) + + rebulk.rebulk(processors(_config('processors'))) + + rebulk.rebulk(mimetype(_config('mimetype'))) + rebulk.rebulk(type_(_config('type'))) + + def customize_properties(properties): + """ + Customize default rebulk properties + """ + count = properties['count'] + del properties['count'] + + properties['season_count'] = count + properties['episode_count'] = count + + return properties + + rebulk.customize_properties = customize_properties + + return rebulk diff --git a/lib/guessit/rules/common/__init__.py b/lib/guessit/rules/common/__init__.py new file mode 100644 index 00000000..444dc72a --- /dev/null +++ b/lib/guessit/rules/common/__init__.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Common module +""" +import re + +seps = r' [](){}+*|=-_~#/\\.,;:' # list of tags/words separators +seps_no_groups = seps.replace('[](){}', '') +seps_no_fs = seps.replace('/', '').replace('\\', '') + +title_seps = r'-+/\|' # separators for title + +dash = (r'-', r'['+re.escape(seps_no_fs)+']') # abbreviation used by many rebulk objects. +alt_dash = (r'@', r'['+re.escape(seps_no_fs)+']') # abbreviation used by many rebulk objects. diff --git a/lib/guessit/rules/common/comparators.py b/lib/guessit/rules/common/comparators.py new file mode 100644 index 00000000..f46f0c11 --- /dev/null +++ b/lib/guessit/rules/common/comparators.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Comparators +""" +try: + from functools import cmp_to_key +except ImportError: + from ...backports import cmp_to_key + + +def marker_comparator_predicate(match): + """ + Match predicate used in comparator + """ + return ( + not match.private + and match.name not in ('proper_count', 'title') + and not (match.name == 'container' and 'extension' in match.tags) + and not (match.name == 'other' and match.value == 'Rip') + ) + + +def marker_weight(matches, marker, predicate): + """ + Compute the comparator weight of a marker + :param matches: + :param marker: + :param predicate: + :return: + """ + return len(set(match.name for match in matches.range(*marker.span, predicate=predicate))) + + +def marker_comparator(matches, markers, predicate): + """ + Builds a comparator that returns markers sorted from the most valuable to the less. + + Take the parts where matches count is higher, then when length is higher, then when position is at left. + + :param matches: + :type matches: + :param markers: + :param predicate: + :return: + :rtype: + """ + + def comparator(marker1, marker2): + """ + The actual comparator function. + """ + matches_count = marker_weight(matches, marker2, predicate) - marker_weight(matches, marker1, predicate) + if matches_count: + return matches_count + + # give preference to rightmost path + return markers.index(marker2) - markers.index(marker1) + + return comparator + + +def marker_sorted(markers, matches, predicate=marker_comparator_predicate): + """ + Sort markers from matches, from the most valuable to the less. + + :param markers: + :type markers: + :param matches: + :type matches: + :param predicate: + :return: + :rtype: + """ + return sorted(markers, key=cmp_to_key(marker_comparator(matches, markers, predicate=predicate))) diff --git a/lib/guessit/rules/common/date.py b/lib/guessit/rules/common/date.py new file mode 100644 index 00000000..e513af9f --- /dev/null +++ b/lib/guessit/rules/common/date.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Date +""" +from dateutil import parser + +from rebulk.remodule import re + +_dsep = r'[-/ \.]' +_dsep_bis = r'[-/ \.x]' + +date_regexps = [ + re.compile(r'%s((\d{8}))%s' % (_dsep, _dsep), re.IGNORECASE), + re.compile(r'%s((\d{6}))%s' % (_dsep, _dsep), re.IGNORECASE), + re.compile(r'(?:^|[^\d])((\d{2})%s(\d{1,2})%s(\d{1,2}))(?:$|[^\d])' % (_dsep, _dsep), re.IGNORECASE), + re.compile(r'(?:^|[^\d])((\d{1,2})%s(\d{1,2})%s(\d{2}))(?:$|[^\d])' % (_dsep, _dsep), re.IGNORECASE), + re.compile(r'(?:^|[^\d])((\d{4})%s(\d{1,2})%s(\d{1,2}))(?:$|[^\d])' % (_dsep_bis, _dsep), re.IGNORECASE), + re.compile(r'(?:^|[^\d])((\d{1,2})%s(\d{1,2})%s(\d{4}))(?:$|[^\d])' % (_dsep, _dsep_bis), re.IGNORECASE), + re.compile(r'(?:^|[^\d])((\d{1,2}(?:st|nd|rd|th)?%s(?:[a-z]{3,10})%s\d{4}))(?:$|[^\d])' % (_dsep, _dsep), + re.IGNORECASE)] + + +def valid_year(year): + """Check if number is a valid year""" + return 1920 <= year < 2030 + + +def _is_int(string): + """ + Check if the input string is an integer + + :param string: + :type string: + :return: + :rtype: + """ + try: + int(string) + return True + except ValueError: + return False + + +def _guess_day_first_parameter(groups): # pylint:disable=inconsistent-return-statements + """ + If day_first is not defined, use some heuristic to fix it. + It helps to solve issues with python dateutils 2.5.3 parser changes. + + :param groups: match groups found for the date + :type groups: list of match objects + :return: day_first option guessed value + :rtype: bool + """ + + # If match starts with a long year, then day_first is force to false. + if _is_int(groups[0]) and valid_year(int(groups[0][:4])): + return False + # If match ends with a long year, the day_first is forced to true. + if _is_int(groups[-1]) and valid_year(int(groups[-1][-4:])): + return True + # If match starts with a short year, then day_first is force to false. + if _is_int(groups[0]) and int(groups[0][:2]) > 31: + return False + # If match ends with a short year, then day_first is force to true. + if _is_int(groups[-1]) and int(groups[-1][-2:]) > 31: + return True + + +def search_date(string, year_first=None, day_first=None): # pylint:disable=inconsistent-return-statements + """Looks for date patterns, and if found return the date and group span. + + Assumes there are sentinels at the beginning and end of the string that + always allow matching a non-digit delimiting the date. + + Year can be defined on two digit only. It will return the nearest possible + date from today. + + >>> search_date(' This happened on 2002-04-22. ') + (18, 28, datetime.date(2002, 4, 22)) + + >>> search_date(' And this on 17-06-1998. ') + (13, 23, datetime.date(1998, 6, 17)) + + >>> search_date(' no date in here ') + """ + for date_re in date_regexps: + search_match = date_re.search(string) + if not search_match: + continue + + start, end = search_match.start(1), search_match.end(1) + groups = search_match.groups()[1:] + match = '-'.join(groups) + + if match is None: + continue + + if year_first and day_first is None: + day_first = False + + if day_first is None: + day_first = _guess_day_first_parameter(groups) + + # If day_first/year_first is undefined, parse is made using both possible values. + yearfirst_opts = [False, True] + if year_first is not None: + yearfirst_opts = [year_first] + + dayfirst_opts = [True, False] + if day_first is not None: + dayfirst_opts = [day_first] + + kwargs_list = ({'dayfirst': d, 'yearfirst': y} + for d in dayfirst_opts for y in yearfirst_opts) + for kwargs in kwargs_list: + try: + date = parser.parse(match, **kwargs) + except (ValueError, TypeError): # pragma: no cover + # see https://bugs.launchpad.net/dateutil/+bug/1247643 + date = None + + # check date plausibility + if date and valid_year(date.year): # pylint:disable=no-member + return start, end, date.date() # pylint:disable=no-member diff --git a/lib/guessit/rules/common/expected.py b/lib/guessit/rules/common/expected.py new file mode 100644 index 00000000..eae562a2 --- /dev/null +++ b/lib/guessit/rules/common/expected.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Expected property factory +""" +import re + +from rebulk import Rebulk +from rebulk.utils import find_all + +from . import dash, seps + + +def build_expected_function(context_key): + """ + Creates a expected property function + :param context_key: + :type context_key: + :param cleanup: + :type cleanup: + :return: + :rtype: + """ + + def expected(input_string, context): + """ + Expected property functional pattern. + :param input_string: + :type input_string: + :param context: + :type context: + :return: + :rtype: + """ + ret = [] + for search in context.get(context_key): + if search.startswith('re:'): + search = search[3:] + search = search.replace(' ', '-') + matches = Rebulk().regex(search, abbreviations=[dash], flags=re.IGNORECASE) \ + .matches(input_string, context) + for match in matches: + ret.append(match.span) + else: + value = search + for sep in seps: + input_string = input_string.replace(sep, ' ') + search = search.replace(sep, ' ') + for start in find_all(input_string, search, ignore_case=True): + ret.append({'start': start, 'end': start + len(search), 'value': value}) + return ret + + return expected diff --git a/lib/guessit/rules/common/formatters.py b/lib/guessit/rules/common/formatters.py new file mode 100644 index 00000000..2a64dee9 --- /dev/null +++ b/lib/guessit/rules/common/formatters.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Formatters +""" +from rebulk.formatters import formatters +from rebulk.remodule import re +from . import seps + +_excluded_clean_chars = ',:;-/\\' +clean_chars = "" +for sep in seps: + if sep not in _excluded_clean_chars: + clean_chars += sep + + +def _potential_before(i, input_string): + """ + Check if the character at position i can be a potential single char separator considering what's before it. + + :param i: + :type i: int + :param input_string: + :type input_string: str + :return: + :rtype: bool + """ + return i - 1 >= 0 and input_string[i] in seps and input_string[i - 2] in seps and input_string[i - 1] not in seps + + +def _potential_after(i, input_string): + """ + Check if the character at position i can be a potential single char separator considering what's after it. + + :param i: + :type i: int + :param input_string: + :type input_string: str + :return: + :rtype: bool + """ + return i + 2 >= len(input_string) or \ + input_string[i + 2] == input_string[i] and input_string[i + 1] not in seps + + +def cleanup(input_string): + """ + Removes and strip separators from input_string (but keep ',;' characters) + + It also keep separators for single characters (Mavels Agents of S.H.I.E.L.D.) + + :param input_string: + :type input_string: str + :return: + :rtype: + """ + clean_string = input_string + for char in clean_chars: + clean_string = clean_string.replace(char, ' ') + + # Restore input separator if they separate single characters. + # Useful for Mavels Agents of S.H.I.E.L.D. + # https://github.com/guessit-io/guessit/issues/278 + + indices = [i for i, letter in enumerate(clean_string) if letter in seps] + + dots = set() + if indices: + clean_list = list(clean_string) + + potential_indices = [] + + for i in indices: + if _potential_before(i, input_string) and _potential_after(i, input_string): + potential_indices.append(i) + + replace_indices = [] + + for potential_index in potential_indices: + if potential_index - 2 in potential_indices or potential_index + 2 in potential_indices: + replace_indices.append(potential_index) + + if replace_indices: + for replace_index in replace_indices: + dots.add(input_string[replace_index]) + clean_list[replace_index] = input_string[replace_index] + clean_string = ''.join(clean_list) + + clean_string = strip(clean_string, ''.join([c for c in seps if c not in dots])) + + clean_string = re.sub(' +', ' ', clean_string) + return clean_string + + +def strip(input_string, chars=seps): + """ + Strip separators from input_string + :param input_string: + :param chars: + :type input_string: + :return: + :rtype: + """ + return input_string.strip(chars) + + +def raw_cleanup(raw): + """ + Cleanup a raw value to perform raw comparison + :param raw: + :type raw: + :return: + :rtype: + """ + return formatters(cleanup, strip)(raw.lower()) + + +def reorder_title(title, articles=('the',), separators=(',', ', ')): + """ + Reorder the title + :param title: + :type title: + :param articles: + :type articles: + :param separators: + :type separators: + :return: + :rtype: + """ + ltitle = title.lower() + for article in articles: + for separator in separators: + suffix = separator + article + if ltitle[-len(suffix):] == suffix: + return title[-len(suffix) + len(separator):] + ' ' + title[:-len(suffix)] + return title diff --git a/lib/guessit/rules/common/numeral.py b/lib/guessit/rules/common/numeral.py new file mode 100644 index 00000000..7c064fdb --- /dev/null +++ b/lib/guessit/rules/common/numeral.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +parse numeral from various formats +""" +from rebulk.remodule import re + +digital_numeral = r'\d{1,4}' + +roman_numeral = r'(?=[MCDLXVI]+)M{0,4}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})' + +english_word_numeral_list = [ + 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', + 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen', 'twenty' +] + +french_word_numeral_list = [ + 'zéro', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf', 'dix', + 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dix-sept', 'dix-huit', 'dix-neuf', 'vingt' +] + +french_alt_word_numeral_list = [ + 'zero', 'une', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf', 'dix', + 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dixsept', 'dixhuit', 'dixneuf', 'vingt' +] + + +def __build_word_numeral(*args): + """ + Build word numeral regexp from list. + + :param args: + :type args: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + re_ = None + for word_list in args: + for word in word_list: + if not re_: + re_ = r'(?:(?=\w+)' + else: + re_ += '|' + re_ += word + re_ += ')' + return re_ + + +word_numeral = __build_word_numeral(english_word_numeral_list, french_word_numeral_list, french_alt_word_numeral_list) + +numeral = '(?:' + digital_numeral + '|' + roman_numeral + '|' + word_numeral + ')' + +__romanNumeralMap = ( + ('M', 1000), + ('CM', 900), + ('D', 500), + ('CD', 400), + ('C', 100), + ('XC', 90), + ('L', 50), + ('XL', 40), + ('X', 10), + ('IX', 9), + ('V', 5), + ('IV', 4), + ('I', 1) +) + +__romanNumeralPattern = re.compile('^' + roman_numeral + '$') + + +def __parse_roman(value): + """ + convert Roman numeral to integer + + :param value: Value to parse + :type value: string + :return: + :rtype: + """ + if not __romanNumeralPattern.search(value): + raise ValueError('Invalid Roman numeral: %s' % value) + + result = 0 + index = 0 + for num, integer in __romanNumeralMap: + while value[index:index + len(num)] == num: + result += integer + index += len(num) + return result + + +def __parse_word(value): + """ + Convert Word numeral to integer + + :param value: Value to parse + :type value: string + :return: + :rtype: + """ + for word_list in [english_word_numeral_list, french_word_numeral_list, french_alt_word_numeral_list]: + try: + return word_list.index(value.lower()) + except ValueError: + pass + raise ValueError # pragma: no cover + + +_clean_re = re.compile(r'[^\d]*(\d+)[^\d]*') + + +def parse_numeral(value, int_enabled=True, roman_enabled=True, word_enabled=True, clean=True): + """ + Parse a numeric value into integer. + + :param value: Value to parse. Can be an integer, roman numeral or word. + :type value: string + :param int_enabled: + :type int_enabled: + :param roman_enabled: + :type roman_enabled: + :param word_enabled: + :type word_enabled: + :param clean: + :type clean: + :return: Numeric value, or None if value can't be parsed + :rtype: int + """ + # pylint: disable=too-many-branches + if int_enabled: + try: + if clean: + match = _clean_re.match(value) + if match: + clean_value = match.group(1) + return int(clean_value) + return int(value) + except ValueError: + pass + if roman_enabled: + try: + if clean: + for word in value.split(): + try: + return __parse_roman(word.upper()) + except ValueError: + pass + return __parse_roman(value) + except ValueError: + pass + if word_enabled: + try: + if clean: + for word in value.split(): + try: + return __parse_word(word) + except ValueError: # pragma: no cover + pass + return __parse_word(value) # pragma: no cover + except ValueError: # pragma: no cover + pass + raise ValueError('Invalid numeral: ' + value) # pragma: no cover diff --git a/lib/guessit/rules/common/pattern.py b/lib/guessit/rules/common/pattern.py new file mode 100644 index 00000000..5f560f2c --- /dev/null +++ b/lib/guessit/rules/common/pattern.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Pattern utility functions +""" + + +def is_disabled(context, name): + """Whether a specific pattern is disabled. + + The context object might define an inclusion list (includes) or an exclusion list (excludes) + A pattern is considered disabled if it's found in the exclusion list or + it's not found in the inclusion list and the inclusion list is not empty or not defined. + + :param context: + :param name: + :return: + """ + if not context: + return False + + excludes = context.get('excludes') + if excludes and name in excludes: + return True + + includes = context.get('includes') + return includes and name not in includes diff --git a/lib/guessit/rules/common/quantity.py b/lib/guessit/rules/common/quantity.py new file mode 100644 index 00000000..bbd41fbb --- /dev/null +++ b/lib/guessit/rules/common/quantity.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Quantities: Size +""" +import re +from abc import abstractmethod + +import six + +from ..common import seps + + +class Quantity(object): + """ + Represent a quantity object with magnitude and units. + """ + + parser_re = re.compile(r'(?P<magnitude>\d+(?:[.]\d+)?)(?P<units>[^\d]+)?') + + def __init__(self, magnitude, units): + self.magnitude = magnitude + self.units = units + + @classmethod + @abstractmethod + def parse_units(cls, value): + """ + Parse a string to a proper unit notation. + """ + raise NotImplementedError + + @classmethod + def fromstring(cls, string): + """ + Parse the string into a quantity object. + :param string: + :return: + """ + values = cls.parser_re.match(string).groupdict() + try: + magnitude = int(values['magnitude']) + except ValueError: + magnitude = float(values['magnitude']) + units = cls.parse_units(values['units']) + + return cls(magnitude, units) + + def __hash__(self): + return hash(str(self)) + + def __eq__(self, other): + if isinstance(other, six.string_types): + return str(self) == other + if not isinstance(other, self.__class__): + return NotImplemented + return self.magnitude == other.magnitude and self.units == other.units + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return '<{0} [{1}]>'.format(self.__class__.__name__, self) + + def __str__(self): + return '{0}{1}'.format(self.magnitude, self.units) + + +class Size(Quantity): + """ + Represent size. + + e.g.: 1.1GB, 300MB + """ + + @classmethod + def parse_units(cls, value): + return value.strip(seps).upper() + + +class BitRate(Quantity): + """ + Represent bit rate. + + e.g.: 320Kbps, 1.5Mbps + """ + + @classmethod + def parse_units(cls, value): + value = value.strip(seps).capitalize() + for token in ('bits', 'bit'): + value = value.replace(token, 'bps') + + return value + + +class FrameRate(Quantity): + """ + Represent frame rate. + + e.g.: 24fps, 60fps + """ + + @classmethod + def parse_units(cls, value): + return 'fps' diff --git a/lib/guessit/rules/common/validators.py b/lib/guessit/rules/common/validators.py new file mode 100644 index 00000000..0d0eb3eb --- /dev/null +++ b/lib/guessit/rules/common/validators.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Validators +""" +from functools import partial + +from rebulk.validators import chars_before, chars_after, chars_surround +from . import seps + +seps_before = partial(chars_before, seps) +seps_after = partial(chars_after, seps) +seps_surround = partial(chars_surround, seps) + + +def int_coercable(string): + """ + Check if string can be coerced to int + :param string: + :type string: + :return: + :rtype: + """ + try: + int(string) + return True + except ValueError: + return False + + +def and_(*validators): + """ + Compose validators functions + :param validators: + :type validators: + :return: + :rtype: + """ + def composed(string): + """ + Composed validators function + :param string: + :type string: + :return: + :rtype: + """ + for validator in validators: + if not validator(string): + return False + return True + return composed + + +def or_(*validators): + """ + Compose validators functions + :param validators: + :type validators: + :return: + :rtype: + """ + def composed(string): + """ + Composed validators function + :param string: + :type string: + :return: + :rtype: + """ + for validator in validators: + if validator(string): + return True + return False + return composed diff --git a/lib/guessit/rules/common/words.py b/lib/guessit/rules/common/words.py new file mode 100644 index 00000000..cccbc7d2 --- /dev/null +++ b/lib/guessit/rules/common/words.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Words utils +""" +from collections import namedtuple + +from . import seps + +_Word = namedtuple('_Word', ['span', 'value']) + + +def iter_words(string): + """ + Iterate on all words in a string + :param string: + :type string: + :return: + :rtype: iterable[str] + """ + i = 0 + last_sep_index = -1 + inside_word = False + for char in string: + if ord(char) < 128 and char in seps: # Make sure we don't exclude unicode characters. + if inside_word: + yield _Word(span=(last_sep_index+1, i), value=string[last_sep_index+1:i]) + inside_word = False + last_sep_index = i + else: + inside_word = True + i += 1 + if inside_word: + yield _Word(span=(last_sep_index+1, i), value=string[last_sep_index+1:i]) diff --git a/lib/guessit/rules/markers/__init__.py b/lib/guessit/rules/markers/__init__.py new file mode 100644 index 00000000..6a48a13b --- /dev/null +++ b/lib/guessit/rules/markers/__init__.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Markers +""" diff --git a/lib/guessit/rules/markers/groups.py b/lib/guessit/rules/markers/groups.py new file mode 100644 index 00000000..4716d15d --- /dev/null +++ b/lib/guessit/rules/markers/groups.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Groups markers (...), [...] and {...} +""" +from rebulk import Rebulk + + +def groups(config): + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk() + rebulk.defaults(name="group", marker=True) + + starting = config['starting'] + ending = config['ending'] + + def mark_groups(input_string): + """ + Functional pattern to mark groups (...), [...] and {...}. + + :param input_string: + :return: + """ + openings = ([], [], []) + i = 0 + + ret = [] + for char in input_string: + start_type = starting.find(char) + if start_type > -1: + openings[start_type].append(i) + + i += 1 + + end_type = ending.find(char) + if end_type > -1: + try: + start_index = openings[end_type].pop() + ret.append((start_index, i)) + except IndexError: + pass + return ret + + rebulk.functional(mark_groups) + return rebulk diff --git a/lib/guessit/rules/markers/path.py b/lib/guessit/rules/markers/path.py new file mode 100644 index 00000000..6d993b75 --- /dev/null +++ b/lib/guessit/rules/markers/path.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Path markers +""" +from rebulk import Rebulk + +from rebulk.utils import find_all + + +def path(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk() + rebulk.defaults(name="path", marker=True) + + def mark_path(input_string, context): + """ + Functional pattern to mark path elements. + + :param input_string: + :param context: + :return: + """ + ret = [] + if context.get('name_only', False): + ret.append((0, len(input_string))) + else: + indices = list(find_all(input_string, '/')) + indices += list(find_all(input_string, '\\')) + indices += [-1, len(input_string)] + + indices.sort() + + for i in range(0, len(indices) - 1): + ret.append((indices[i] + 1, indices[i + 1])) + + return ret + + rebulk.functional(mark_path) + return rebulk diff --git a/lib/guessit/rules/match_processors.py b/lib/guessit/rules/match_processors.py new file mode 100644 index 00000000..0b49372f --- /dev/null +++ b/lib/guessit/rules/match_processors.py @@ -0,0 +1,20 @@ +""" +Match processors +""" +from guessit.rules.common import seps + + +def strip(match, chars=seps): + """ + Strip given characters from match. + + :param chars: + :param match: + :return: + """ + while match.input_string[match.start] in chars: + match.start += 1 + while match.input_string[match.end - 1] in chars: + match.end -= 1 + if not match: + return False diff --git a/lib/guessit/rules/processors.py b/lib/guessit/rules/processors.py new file mode 100644 index 00000000..5b018140 --- /dev/null +++ b/lib/guessit/rules/processors.py @@ -0,0 +1,259 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Processors +""" +from collections import defaultdict +import copy + +import six + +from rebulk import Rebulk, Rule, CustomRule, POST_PROCESS, PRE_PROCESS, AppendMatch, RemoveMatch + +from .common import seps_no_groups +from .common.formatters import cleanup +from .common.comparators import marker_sorted +from .common.date import valid_year +from .common.words import iter_words + + +class EnlargeGroupMatches(CustomRule): + """ + Enlarge matches that are starting and/or ending group to include brackets in their span. + """ + priority = PRE_PROCESS + + def when(self, matches, context): + starting = [] + ending = [] + + for group in matches.markers.named('group'): + for match in matches.starting(group.start + 1): + starting.append(match) + + for match in matches.ending(group.end - 1): + ending.append(match) + + if starting or ending: + return starting, ending + return False + + def then(self, matches, when_response, context): + starting, ending = when_response + for match in starting: + matches.remove(match) + match.start -= 1 + match.raw_start += 1 + matches.append(match) + + for match in ending: + matches.remove(match) + match.end += 1 + match.raw_end -= 1 + matches.append(match) + + +class EquivalentHoles(Rule): + """ + Creates equivalent matches for holes that have same values than existing (case insensitive) + """ + priority = POST_PROCESS + consequence = AppendMatch + + def when(self, matches, context): + new_matches = [] + + for filepath in marker_sorted(matches.markers.named('path'), matches): + holes = matches.holes(start=filepath.start, end=filepath.end, formatter=cleanup) + for name in matches.names: + for hole in list(holes): + for current_match in matches.named(name): + if isinstance(current_match.value, six.string_types) and \ + hole.value.lower() == current_match.value.lower(): + if 'equivalent-ignore' in current_match.tags: + continue + new_value = _preferred_string(hole.value, current_match.value) + if hole.value != new_value: + hole.value = new_value + if current_match.value != new_value: + current_match.value = new_value + hole.name = name + hole.tags = ['equivalent'] + new_matches.append(hole) + if hole in holes: + holes.remove(hole) + + return new_matches + + +class RemoveAmbiguous(Rule): + """ + If multiple matches are found with same name and different values, keep the one in the most valuable filepart. + Also keep others match with same name and values than those kept ones. + """ + + priority = POST_PROCESS + consequence = RemoveMatch + + def __init__(self, sort_function=marker_sorted, predicate=None): + super(RemoveAmbiguous, self).__init__() + self.sort_function = sort_function + self.predicate = predicate + + def when(self, matches, context): + fileparts = self.sort_function(matches.markers.named('path'), matches) + + previous_fileparts_names = set() + values = defaultdict(list) + + to_remove = [] + for filepart in fileparts: + filepart_matches = matches.range(filepart.start, filepart.end, predicate=self.predicate) + + filepart_names = set() + for match in filepart_matches: + filepart_names.add(match.name) + if match.name in previous_fileparts_names: + if match.value not in values[match.name]: + to_remove.append(match) + else: + if match.value not in values[match.name]: + values[match.name].append(match.value) + + previous_fileparts_names.update(filepart_names) + + return to_remove + + +class RemoveLessSpecificSeasonEpisode(RemoveAmbiguous): + """ + If multiple season/episodes matches are found with different values, + keep the one tagged as 'SxxExx' or in the rightmost filepart. + """ + def __init__(self, name): + super(RemoveLessSpecificSeasonEpisode, self).__init__( + sort_function=(lambda markers, matches: + marker_sorted(list(reversed(markers)), matches, + lambda match: match.name == name and 'SxxExx' in match.tags)), + predicate=lambda match: match.name == name) + + +def _preferred_string(value1, value2): # pylint:disable=too-many-return-statements + """ + Retrieves preferred title from both values. + :param value1: + :type value1: str + :param value2: + :type value2: str + :return: The preferred title + :rtype: str + """ + if value1 == value2: + return value1 + if value1.istitle() and not value2.istitle(): + return value1 + if not value1.isupper() and value2.isupper(): + return value1 + if not value1.isupper() and value1[0].isupper() and not value2[0].isupper(): + return value1 + if _count_title_words(value1) > _count_title_words(value2): + return value1 + return value2 + + +def _count_title_words(value): + """ + Count only many words are titles in value. + :param value: + :type value: + :return: + :rtype: + """ + ret = 0 + for word in iter_words(value): + if word.value.istitle(): + ret += 1 + return ret + + +class SeasonYear(Rule): + """ + If a season is a valid year and no year was found, create an match with year. + """ + priority = POST_PROCESS + consequence = AppendMatch + + def when(self, matches, context): + ret = [] + if not matches.named('year'): + for season in matches.named('season'): + if valid_year(season.value): + year = copy.copy(season) + year.name = 'year' + ret.append(year) + return ret + + +class YearSeason(Rule): + """ + If a year is found, no season found, and episode is found, create an match with season. + """ + priority = POST_PROCESS + consequence = AppendMatch + + def when(self, matches, context): + ret = [] + if not matches.named('season') and matches.named('episode'): + for year in matches.named('year'): + season = copy.copy(year) + season.name = 'season' + ret.append(season) + return ret + + +class Processors(CustomRule): + """ + Empty rule for ordering post_processing properly. + """ + priority = POST_PROCESS + + def when(self, matches, context): + pass + + def then(self, matches, when_response, context): # pragma: no cover + pass + + +class StripSeparators(CustomRule): + """ + Strip separators from matches. Keep separators if they are from acronyms, like in ".S.H.I.E.L.D." + """ + priority = POST_PROCESS + + def when(self, matches, context): + return matches + + def then(self, matches, when_response, context): # pragma: no cover + for match in matches: + for _ in range(0, len(match.span)): + if match.raw[0] in seps_no_groups and (len(match.raw) < 3 or match.raw[2] not in seps_no_groups): + match.raw_start += 1 + + for _ in reversed(range(0, len(match.span))): + if match.raw[-1] in seps_no_groups and (len(match.raw) < 3 or match.raw[-3] not in seps_no_groups): + match.raw_end -= 1 + + +def processors(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + return Rebulk().rules(EnlargeGroupMatches, EquivalentHoles, + RemoveLessSpecificSeasonEpisode('season'), + RemoveLessSpecificSeasonEpisode('episode'), + RemoveAmbiguous, SeasonYear, YearSeason, Processors, StripSeparators) diff --git a/lib/guessit/rules/properties/__init__.py b/lib/guessit/rules/properties/__init__.py new file mode 100644 index 00000000..e0a24eaf --- /dev/null +++ b/lib/guessit/rules/properties/__init__.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Properties +""" diff --git a/lib/guessit/rules/properties/audio_codec.py b/lib/guessit/rules/properties/audio_codec.py new file mode 100644 index 00000000..815caff9 --- /dev/null +++ b/lib/guessit/rules/properties/audio_codec.py @@ -0,0 +1,235 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +audio_codec, audio_profile and audio_channels property +""" +from rebulk import Rebulk, Rule, RemoveMatch +from rebulk.remodule import re + +from ..common import dash +from ..common.pattern import is_disabled +from ..common.validators import seps_before, seps_after + +audio_properties = ['audio_codec', 'audio_profile', 'audio_channels'] + + +def audio_codec(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk()\ + .regex_defaults(flags=re.IGNORECASE, abbreviations=[dash])\ + .string_defaults(ignore_case=True) + + def audio_codec_priority(match1, match2): + """ + Gives priority to audio_codec + :param match1: + :type match1: + :param match2: + :type match2: + :return: + :rtype: + """ + if match1.name == 'audio_codec' and match2.name in ['audio_profile', 'audio_channels']: + return match2 + if match1.name in ['audio_profile', 'audio_channels'] and match2.name == 'audio_codec': + return match1 + return '__default__' + + rebulk.defaults(name='audio_codec', + conflict_solver=audio_codec_priority, + disabled=lambda context: is_disabled(context, 'audio_codec')) + + rebulk.regex("MP3", "LAME", r"LAME(?:\d)+-?(?:\d)+", value="MP3") + rebulk.string("MP2", value="MP2") + rebulk.regex('Dolby', 'DolbyDigital', 'Dolby-Digital', 'DD', 'AC3D?', value='Dolby Digital') + rebulk.regex('Dolby-?Atmos', 'Atmos', value='Dolby Atmos') + rebulk.string("AAC", value="AAC") + rebulk.string('EAC3', 'DDP', 'DD+', value='Dolby Digital Plus') + rebulk.string("Flac", value="FLAC") + rebulk.string("DTS", value="DTS") + rebulk.regex('DTS-?HD', 'DTS(?=-?MA)', value='DTS-HD', + conflict_solver=lambda match, other: other if other.name == 'audio_codec' else '__default__') + rebulk.regex('True-?HD', value='Dolby TrueHD') + rebulk.string('Opus', value='Opus') + rebulk.string('Vorbis', value='Vorbis') + rebulk.string('PCM', value='PCM') + rebulk.string('LPCM', value='LPCM') + + rebulk.defaults(clear=True, + name='audio_profile', + disabled=lambda context: is_disabled(context, 'audio_profile')) + rebulk.string('MA', value='Master Audio', tags=['audio_profile.rule', 'DTS-HD']) + rebulk.string('HR', 'HRA', value='High Resolution Audio', tags=['audio_profile.rule', 'DTS-HD']) + rebulk.string('ES', value='Extended Surround', tags=['audio_profile.rule', 'DTS']) + rebulk.string('HE', value='High Efficiency', tags=['audio_profile.rule', 'AAC']) + rebulk.string('LC', value='Low Complexity', tags=['audio_profile.rule', 'AAC']) + rebulk.string('HQ', value='High Quality', tags=['audio_profile.rule', 'Dolby Digital']) + rebulk.string('EX', value='EX', tags=['audio_profile.rule', 'Dolby Digital']) + + rebulk.defaults(clear=True, + name="audio_channels", + disabled=lambda context: is_disabled(context, 'audio_channels')) + rebulk.regex('7[01]', value='7.1', validator=seps_after, tags='weak-audio_channels') + rebulk.regex('5[01]', value='5.1', validator=seps_after, tags='weak-audio_channels') + rebulk.string('20', value='2.0', validator=seps_after, tags='weak-audio_channels') + + for value, items in config.get('audio_channels').items(): + for item in items: + if item.startswith('re:'): + rebulk.regex(item[3:], value=value, children=True) + else: + rebulk.string(item, value=value) + + rebulk.rules(DtsHDRule, DtsRule, AacRule, DolbyDigitalRule, AudioValidatorRule, HqConflictRule, + AudioChannelsValidatorRule) + + return rebulk + + +class AudioValidatorRule(Rule): + """ + Remove audio properties if not surrounded by separators and not next each others + """ + priority = 64 + consequence = RemoveMatch + + def when(self, matches, context): + ret = [] + + audio_list = matches.range(predicate=lambda match: match.name in audio_properties) + for audio in audio_list: + if not seps_before(audio): + valid_before = matches.range(audio.start - 1, audio.start, + lambda match: match.name in audio_properties) + if not valid_before: + ret.append(audio) + continue + if not seps_after(audio): + valid_after = matches.range(audio.end, audio.end + 1, + lambda match: match.name in audio_properties) + if not valid_after: + ret.append(audio) + continue + + return ret + + +class AudioProfileRule(Rule): + """ + Abstract rule to validate audio profiles + """ + priority = 64 + dependency = AudioValidatorRule + consequence = RemoveMatch + + def __init__(self, codec): + super(AudioProfileRule, self).__init__() + self.codec = codec + + def enabled(self, context): + return not is_disabled(context, 'audio_profile') + + def when(self, matches, context): + profile_list = matches.named('audio_profile', + lambda match: 'audio_profile.rule' in match.tags and + self.codec in match.tags) + ret = [] + for profile in profile_list: + codec = matches.at_span(profile.span, + lambda match: match.name == 'audio_codec' and + match.value == self.codec, 0) + if not codec: + codec = matches.previous(profile, + lambda match: match.name == 'audio_codec' and + match.value == self.codec) + if not codec: + codec = matches.next(profile, + lambda match: match.name == 'audio_codec' and + match.value == self.codec) + if not codec: + ret.append(profile) + if codec: + ret.extend(matches.conflicting(profile)) + return ret + + +class DtsHDRule(AudioProfileRule): + """ + Rule to validate DTS-HD profile + """ + + def __init__(self): + super(DtsHDRule, self).__init__('DTS-HD') + + +class DtsRule(AudioProfileRule): + """ + Rule to validate DTS profile + """ + + def __init__(self): + super(DtsRule, self).__init__('DTS') + + +class AacRule(AudioProfileRule): + """ + Rule to validate AAC profile + """ + + def __init__(self): + super(AacRule, self).__init__('AAC') + + +class DolbyDigitalRule(AudioProfileRule): + """ + Rule to validate Dolby Digital profile + """ + + def __init__(self): + super(DolbyDigitalRule, self).__init__('Dolby Digital') + + +class HqConflictRule(Rule): + """ + Solve conflict between HQ from other property and from audio_profile. + """ + + dependency = [DtsHDRule, DtsRule, AacRule, DolbyDigitalRule] + consequence = RemoveMatch + + def enabled(self, context): + return not is_disabled(context, 'audio_profile') + + def when(self, matches, context): + hq_audio = matches.named('audio_profile', lambda m: m.value == 'High Quality') + hq_audio_spans = [match.span for match in hq_audio] + return matches.named('other', lambda m: m.span in hq_audio_spans) + + +class AudioChannelsValidatorRule(Rule): + """ + Remove audio_channel if no audio codec as previous match. + """ + priority = 128 + consequence = RemoveMatch + + def enabled(self, context): + return not is_disabled(context, 'audio_channels') + + def when(self, matches, context): + ret = [] + + for audio_channel in matches.tagged('weak-audio_channels'): + valid_before = matches.range(audio_channel.start - 1, audio_channel.start, + lambda match: match.name == 'audio_codec') + if not valid_before: + ret.append(audio_channel) + + return ret diff --git a/lib/guessit/rules/properties/bit_rate.py b/lib/guessit/rules/properties/bit_rate.py new file mode 100644 index 00000000..d279c9f1 --- /dev/null +++ b/lib/guessit/rules/properties/bit_rate.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +video_bit_rate and audio_bit_rate properties +""" +import re + +from rebulk import Rebulk +from rebulk.rules import Rule, RemoveMatch, RenameMatch + +from ..common import dash, seps +from ..common.pattern import is_disabled +from ..common.quantity import BitRate +from ..common.validators import seps_surround + + +def bit_rate(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: (is_disabled(context, 'audio_bit_rate') + and is_disabled(context, 'video_bit_rate'))) + rebulk = rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) + rebulk.defaults(name='audio_bit_rate', validator=seps_surround) + rebulk.regex(r'\d+-?[kmg]b(ps|its?)', r'\d+\.\d+-?[kmg]b(ps|its?)', + conflict_solver=( + lambda match, other: match + if other.name == 'audio_channels' and 'weak-audio_channels' not in other.tags + else other + ), + formatter=BitRate.fromstring, tags=['release-group-prefix']) + + rebulk.rules(BitRateTypeRule) + + return rebulk + + +class BitRateTypeRule(Rule): + """ + Convert audio bit rate guess into video bit rate. + """ + consequence = [RenameMatch('video_bit_rate'), RemoveMatch] + + def when(self, matches, context): + to_rename = [] + to_remove = [] + + if is_disabled(context, 'audio_bit_rate'): + to_remove.extend(matches.named('audio_bit_rate')) + else: + video_bit_rate_disabled = is_disabled(context, 'video_bit_rate') + for match in matches.named('audio_bit_rate'): + previous = matches.previous(match, index=0, + predicate=lambda m: m.name in ('source', 'screen_size', 'video_codec')) + if previous and not matches.holes(previous.end, match.start, predicate=lambda m: m.value.strip(seps)): + after = matches.next(match, index=0, predicate=lambda m: m.name == 'audio_codec') + if after and not matches.holes(match.end, after.start, predicate=lambda m: m.value.strip(seps)): + bitrate = match.value + if bitrate.units == 'Kbps' or (bitrate.units == 'Mbps' and bitrate.magnitude < 10): + continue + + if video_bit_rate_disabled: + to_remove.append(match) + else: + to_rename.append(match) + + if to_rename or to_remove: + return to_rename, to_remove + return False diff --git a/lib/guessit/rules/properties/bonus.py b/lib/guessit/rules/properties/bonus.py new file mode 100644 index 00000000..54087aa3 --- /dev/null +++ b/lib/guessit/rules/properties/bonus.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +bonus property +""" +from rebulk.remodule import re + +from rebulk import Rebulk, AppendMatch, Rule + +from .title import TitleFromPosition +from ..common.formatters import cleanup +from ..common.pattern import is_disabled +from ..common.validators import seps_surround + + +def bonus(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'bonus')) + rebulk = rebulk.regex_defaults(flags=re.IGNORECASE) + + rebulk.regex(r'x(\d+)', name='bonus', private_parent=True, children=True, formatter=int, + validator={'__parent__': seps_surround}, + validate_all=True, + conflict_solver=lambda match, conflicting: match + if conflicting.name in ('video_codec', 'episode') and 'weak-episode' not in conflicting.tags + else '__default__') + + rebulk.rules(BonusTitleRule) + + return rebulk + + +class BonusTitleRule(Rule): + """ + Find bonus title after bonus. + """ + dependency = TitleFromPosition + consequence = AppendMatch + + properties = {'bonus_title': [None]} + + def when(self, matches, context): # pylint:disable=inconsistent-return-statements + bonus_number = matches.named('bonus', lambda match: not match.private, index=0) + if bonus_number: + filepath = matches.markers.at_match(bonus_number, lambda marker: marker.name == 'path', 0) + hole = matches.holes(bonus_number.end, filepath.end + 1, formatter=cleanup, index=0) + if hole and hole.value: + hole.name = 'bonus_title' + return hole diff --git a/lib/guessit/rules/properties/cds.py b/lib/guessit/rules/properties/cds.py new file mode 100644 index 00000000..873df6fe --- /dev/null +++ b/lib/guessit/rules/properties/cds.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +cd and cd_count properties +""" +from rebulk.remodule import re + +from rebulk import Rebulk + +from ..common import dash +from ..common.pattern import is_disabled + + +def cds(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'cd')) + rebulk = rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) + + rebulk.regex(r'cd-?(?P<cd>\d+)(?:-?of-?(?P<cd_count>\d+))?', + validator={'cd': lambda match: 0 < match.value < 100, + 'cd_count': lambda match: 0 < match.value < 100}, + formatter={'cd': int, 'cd_count': int}, + children=True, + private_parent=True, + properties={'cd': [None], 'cd_count': [None]}) + rebulk.regex(r'(?P<cd_count>\d+)-?cds?', + validator={'cd': lambda match: 0 < match.value < 100, + 'cd_count': lambda match: 0 < match.value < 100}, + formatter={'cd_count': int}, + children=True, + private_parent=True, + properties={'cd': [None], 'cd_count': [None]}) + + return rebulk diff --git a/lib/guessit/rules/properties/container.py b/lib/guessit/rules/properties/container.py new file mode 100644 index 00000000..0f1860af --- /dev/null +++ b/lib/guessit/rules/properties/container.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +container property +""" +from rebulk.remodule import re + +from rebulk import Rebulk + +from ..common import seps +from ..common.pattern import is_disabled +from ..common.validators import seps_surround +from ...reutils import build_or_pattern + + +def container(config): + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'container')) + rebulk = rebulk.regex_defaults(flags=re.IGNORECASE).string_defaults(ignore_case=True) + rebulk.defaults(name='container', + formatter=lambda value: value.strip(seps), + tags=['extension'], + conflict_solver=lambda match, other: other + if other.name in ('source', 'video_codec') or + other.name == 'container' and 'extension' not in other.tags + else '__default__') + + subtitles = config['subtitles'] + info = config['info'] + videos = config['videos'] + torrent = config['torrent'] + nzb = config['nzb'] + + rebulk.regex(r'\.'+build_or_pattern(subtitles)+'$', exts=subtitles, tags=['extension', 'subtitle']) + rebulk.regex(r'\.'+build_or_pattern(info)+'$', exts=info, tags=['extension', 'info']) + rebulk.regex(r'\.'+build_or_pattern(videos)+'$', exts=videos, tags=['extension', 'video']) + rebulk.regex(r'\.'+build_or_pattern(torrent)+'$', exts=torrent, tags=['extension', 'torrent']) + rebulk.regex(r'\.'+build_or_pattern(nzb)+'$', exts=nzb, tags=['extension', 'nzb']) + + rebulk.defaults(clear=True, + name='container', + validator=seps_surround, + formatter=lambda s: s.lower(), + conflict_solver=lambda match, other: match + if other.name in ('source', + 'video_codec') or other.name == 'container' and 'extension' in other.tags + else '__default__') + + rebulk.string(*[sub for sub in subtitles if sub not in ('sub', 'ass')], tags=['subtitle']) + rebulk.string(*videos, tags=['video']) + rebulk.string(*torrent, tags=['torrent']) + rebulk.string(*nzb, tags=['nzb']) + + return rebulk diff --git a/lib/guessit/rules/properties/country.py b/lib/guessit/rules/properties/country.py new file mode 100644 index 00000000..172c2990 --- /dev/null +++ b/lib/guessit/rules/properties/country.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +country property +""" +# pylint: disable=no-member +import babelfish + +from rebulk import Rebulk +from ..common.pattern import is_disabled +from ..common.words import iter_words + + +def country(config, common_words): + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :param common_words: common words + :type common_words: set + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'country')) + rebulk = rebulk.defaults(name='country') + + def find_countries(string, context=None): + """ + Find countries in given string. + """ + allowed_countries = context.get('allowed_countries') if context else None + return CountryFinder(allowed_countries, common_words).find(string) + + rebulk.functional(find_countries, + #  Prefer language and any other property over country if not US or GB. + conflict_solver=lambda match, other: match + if other.name != 'language' or match.value not in (babelfish.Country('US'), + babelfish.Country('GB')) + else other, + properties={'country': [None]}, + disabled=lambda context: not context.get('allowed_countries')) + + babelfish.country_converters['guessit'] = GuessitCountryConverter(config['synonyms']) + + return rebulk + + +class GuessitCountryConverter(babelfish.CountryReverseConverter): # pylint: disable=missing-docstring + def __init__(self, synonyms): + self.guessit_exceptions = {} + + for alpha2, synlist in synonyms.items(): + for syn in synlist: + self.guessit_exceptions[syn.lower()] = alpha2 + + @property + def codes(self): # pylint: disable=missing-docstring + return (babelfish.country_converters['name'].codes | + frozenset(babelfish.COUNTRIES.values()) | + frozenset(self.guessit_exceptions.keys())) + + def convert(self, alpha2): + if alpha2 == 'GB': + return 'UK' + return str(babelfish.Country(alpha2)) + + def reverse(self, name): # pylint:disable=arguments-differ + # exceptions come first, as they need to override a potential match + # with any of the other guessers + try: + return self.guessit_exceptions[name.lower()] + except KeyError: + pass + + try: + return babelfish.Country(name.upper()).alpha2 + except ValueError: + pass + + for conv in [babelfish.Country.fromname]: + try: + return conv(name).alpha2 + except babelfish.CountryReverseError: + pass + + raise babelfish.CountryReverseError(name) + + +class CountryFinder(object): + """Helper class to search and return country matches.""" + + def __init__(self, allowed_countries, common_words): + self.allowed_countries = {l.lower() for l in allowed_countries or []} + self.common_words = common_words + + def find(self, string): + """Return all matches for country.""" + for word_match in iter_words(string.strip().lower()): + word = word_match.value + if word.lower() in self.common_words: + continue + + try: + country_object = babelfish.Country.fromguessit(word) + if (country_object.name.lower() in self.allowed_countries or + country_object.alpha2.lower() in self.allowed_countries): + yield self._to_rebulk_match(word_match, country_object) + except babelfish.Error: + continue + + @classmethod + def _to_rebulk_match(cls, word, value): + return word.span[0], word.span[1], {'value': value} diff --git a/lib/guessit/rules/properties/crc.py b/lib/guessit/rules/properties/crc.py new file mode 100644 index 00000000..eedee93d --- /dev/null +++ b/lib/guessit/rules/properties/crc.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +crc and uuid properties +""" +from rebulk.remodule import re + +from rebulk import Rebulk +from ..common.pattern import is_disabled +from ..common.validators import seps_surround + + +def crc(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'crc32')) + rebulk = rebulk.regex_defaults(flags=re.IGNORECASE) + rebulk.defaults(validator=seps_surround) + + rebulk.regex('(?:[a-fA-F]|[0-9]){8}', name='crc32', + conflict_solver=lambda match, other: other + if other.name in ['episode', 'season'] + else '__default__') + + rebulk.functional(guess_idnumber, name='uuid', + conflict_solver=lambda match, other: match + if other.name in ['episode', 'season'] + else '__default__') + return rebulk + + +_DIGIT = 0 +_LETTER = 1 +_OTHER = 2 + +_idnum = re.compile(r'(?P<uuid>[a-zA-Z0-9-]{20,})') # 1.0, (0, 0)) + + +def guess_idnumber(string): + """ + Guess id number function + :param string: + :type string: + :return: + :rtype: + """ + # pylint:disable=invalid-name + ret = [] + + matches = list(_idnum.finditer(string)) + for match in matches: + result = match.groupdict() + switch_count = 0 + switch_letter_count = 0 + letter_count = 0 + last_letter = None + + last = _LETTER + for c in result['uuid']: + if c in '0123456789': + ci = _DIGIT + elif c in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ': + ci = _LETTER + if c != last_letter: + switch_letter_count += 1 + last_letter = c + letter_count += 1 + else: + ci = _OTHER + + if ci != last: + switch_count += 1 + + last = ci + + # only return the result as probable if we alternate often between + # char type (more likely for hash values than for common words) + switch_ratio = float(switch_count) / len(result['uuid']) + letters_ratio = (float(switch_letter_count) / letter_count) if letter_count > 0 else 1 + + if switch_ratio > 0.4 and letters_ratio > 0.4: + ret.append(match.span()) + + return ret diff --git a/lib/guessit/rules/properties/date.py b/lib/guessit/rules/properties/date.py new file mode 100644 index 00000000..e50cdfa3 --- /dev/null +++ b/lib/guessit/rules/properties/date.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +date and year properties +""" +from rebulk import Rebulk, RemoveMatch, Rule + +from ..common.date import search_date, valid_year +from ..common.pattern import is_disabled +from ..common.validators import seps_surround + + +def date(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk().defaults(validator=seps_surround) + + rebulk.regex(r"\d{4}", name="year", formatter=int, + disabled=lambda context: is_disabled(context, 'year'), + conflict_solver=lambda match, other: other + if other.name in ('episode', 'season') and len(other.raw) < len(match.raw) + else '__default__', + validator=lambda match: seps_surround(match) and valid_year(match.value)) + + def date_functional(string, context): # pylint:disable=inconsistent-return-statements + """ + Search for date in the string and retrieves match + + :param string: + :return: + """ + + ret = search_date(string, context.get('date_year_first'), context.get('date_day_first')) + if ret: + return ret[0], ret[1], {'value': ret[2]} + + rebulk.functional(date_functional, name="date", properties={'date': [None]}, + disabled=lambda context: is_disabled(context, 'date'), + conflict_solver=lambda match, other: other + if other.name in ('episode', 'season', 'crc32') + else '__default__') + + rebulk.rules(KeepMarkedYearInFilepart) + + return rebulk + + +class KeepMarkedYearInFilepart(Rule): + """ + Keep first years marked with [](){} in filepart, or if no year is marked, ensure it won't override titles. + """ + priority = 64 + consequence = RemoveMatch + + def enabled(self, context): + return not is_disabled(context, 'year') + + def when(self, matches, context): + ret = [] + if len(matches.named('year')) > 1: + for filepart in matches.markers.named('path'): + years = matches.range(filepart.start, filepart.end, lambda match: match.name == 'year') + if len(years) > 1: + group_years = [] + ungroup_years = [] + for year in years: + if matches.markers.at_match(year, lambda marker: marker.name == 'group'): + group_years.append(year) + else: + ungroup_years.append(year) + if group_years and ungroup_years: + ret.extend(ungroup_years) + ret.extend(group_years[1:]) # Keep the first year in marker. + elif not group_years: + ret.append(ungroup_years[0]) # Keep first year for title. + if len(ungroup_years) > 2: + ret.extend(ungroup_years[2:]) + return ret diff --git a/lib/guessit/rules/properties/edition.py b/lib/guessit/rules/properties/edition.py new file mode 100644 index 00000000..822aa4ee --- /dev/null +++ b/lib/guessit/rules/properties/edition.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +edition property +""" +from rebulk.remodule import re + +from rebulk import Rebulk +from ..common import dash +from ..common.pattern import is_disabled +from ..common.validators import seps_surround + + +def edition(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'edition')) + rebulk = rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]).string_defaults(ignore_case=True) + rebulk.defaults(name='edition', validator=seps_surround) + + rebulk.regex('collector', "collector'?s?-edition", 'edition-collector', value='Collector') + rebulk.regex('special-edition', 'edition-special', value='Special', + conflict_solver=lambda match, other: other + if other.name == 'episode_details' and other.value == 'Special' + else '__default__') + rebulk.string('se', value='Special', tags='has-neighbor') + rebulk.string('ddc', value="Director's Definitive Cut") + rebulk.regex('criterion-edition', 'edition-criterion', 'CC', value='Criterion') + rebulk.regex('deluxe', 'deluxe-edition', 'edition-deluxe', value='Deluxe') + rebulk.regex('limited', 'limited-edition', value='Limited', tags=['has-neighbor', 'release-group-prefix']) + rebulk.regex(r'theatrical-cut', r'theatrical-edition', r'theatrical', value='Theatrical') + rebulk.regex(r"director'?s?-cut", r"director'?s?-cut-edition", r"edition-director'?s?-cut", 'DC', + value="Director's Cut") + rebulk.regex('extended', 'extended-?cut', 'extended-?version', + value='Extended', tags=['has-neighbor', 'release-group-prefix']) + rebulk.regex('alternat(e|ive)(?:-?Cut)?', value='Alternative Cut', tags=['has-neighbor', 'release-group-prefix']) + for value in ('Remastered', 'Uncensored', 'Uncut', 'Unrated'): + rebulk.string(value, value=value, tags=['has-neighbor', 'release-group-prefix']) + rebulk.string('Festival', value='Festival', tags=['has-neighbor-before', 'has-neighbor-after']) + rebulk.regex('imax', 'imax-edition', value='IMAX') + rebulk.regex('fan-edit(?:ion)?', 'fan-collection', value='Fan') + rebulk.regex('ultimate-edition', value='Ultimate') + rebulk.regex("ultimate-collector'?s?-edition", value=['Ultimate', 'Collector']) + rebulk.regex('ultimate-fan-edit(?:ion)?', 'ultimate-fan-collection', value=['Ultimate', 'Fan']) + + return rebulk diff --git a/lib/guessit/rules/properties/episode_title.py b/lib/guessit/rules/properties/episode_title.py new file mode 100644 index 00000000..ece8921d --- /dev/null +++ b/lib/guessit/rules/properties/episode_title.py @@ -0,0 +1,300 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Episode title +""" +from collections import defaultdict + +from rebulk import Rebulk, Rule, AppendMatch, RemoveMatch, RenameMatch, POST_PROCESS + +from ..common import seps, title_seps +from ..common.formatters import cleanup +from ..common.pattern import is_disabled +from ..common.validators import or_ +from ..properties.title import TitleFromPosition, TitleBaseRule +from ..properties.type import TypeProcessor + + +def episode_title(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + previous_names = ('episode', 'episode_count', + 'season', 'season_count', 'date', 'title', 'year') + + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'episode_title')) + rebulk = rebulk.rules(RemoveConflictsWithEpisodeTitle(previous_names), + EpisodeTitleFromPosition(previous_names), + AlternativeTitleReplace(previous_names), + TitleToEpisodeTitle, + Filepart3EpisodeTitle, + Filepart2EpisodeTitle, + RenameEpisodeTitleWhenMovieType) + return rebulk + + +class RemoveConflictsWithEpisodeTitle(Rule): + """ + Remove conflicting matches that might lead to wrong episode_title parsing. + """ + + priority = 64 + consequence = RemoveMatch + + def __init__(self, previous_names): + super(RemoveConflictsWithEpisodeTitle, self).__init__() + self.previous_names = previous_names + self.next_names = ('streaming_service', 'screen_size', 'source', + 'video_codec', 'audio_codec', 'other', 'container') + self.affected_if_holes_after = ('part', ) + self.affected_names = ('part', 'year') + + def when(self, matches, context): + to_remove = [] + for filepart in matches.markers.named('path'): + for match in matches.range(filepart.start, filepart.end, + predicate=lambda m: m.name in self.affected_names): + before = matches.range(filepart.start, match.start, predicate=lambda m: not m.private, index=-1) + if not before or before.name not in self.previous_names: + continue + + after = matches.range(match.end, filepart.end, predicate=lambda m: not m.private, index=0) + if not after or after.name not in self.next_names: + continue + + group = matches.markers.at_match(match, predicate=lambda m: m.name == 'group', index=0) + + def has_value_in_same_group(current_match, current_group=group): + """Return true if current match has value and belongs to the current group.""" + return current_match.value.strip(seps) and ( + current_group == matches.markers.at_match(current_match, + predicate=lambda mm: mm.name == 'group', index=0) + ) + + holes_before = matches.holes(before.end, match.start, predicate=has_value_in_same_group) + holes_after = matches.holes(match.end, after.start, predicate=has_value_in_same_group) + + if not holes_before and not holes_after: + continue + + if match.name in self.affected_if_holes_after and not holes_after: + continue + + to_remove.append(match) + if match.parent: + to_remove.append(match.parent) + + return to_remove + + +class TitleToEpisodeTitle(Rule): + """ + If multiple different title are found, convert the one following episode number to episode_title. + """ + dependency = TitleFromPosition + + def when(self, matches, context): + titles = matches.named('title') + title_groups = defaultdict(list) + for title in titles: + title_groups[title.value].append(title) + + episode_titles = [] + if len(title_groups) < 2: + return episode_titles + + for title in titles: + if matches.previous(title, lambda match: match.name == 'episode'): + episode_titles.append(title) + + return episode_titles + + def then(self, matches, when_response, context): + for title in when_response: + matches.remove(title) + title.name = 'episode_title' + matches.append(title) + + +class EpisodeTitleFromPosition(TitleBaseRule): + """ + Add episode title match in existing matches + Must run after TitleFromPosition rule. + """ + dependency = TitleToEpisodeTitle + + def __init__(self, previous_names): + super(EpisodeTitleFromPosition, self).__init__('episode_title', ['title']) + self.previous_names = previous_names + + def hole_filter(self, hole, matches): + episode = matches.previous(hole, + lambda previous: previous.named(*self.previous_names), + 0) + + crc32 = matches.named('crc32') + + return episode or crc32 + + def filepart_filter(self, filepart, matches): + # Filepart where title was found. + if matches.range(filepart.start, filepart.end, lambda match: match.name == 'title'): + return True + return False + + def should_remove(self, match, matches, filepart, hole, context): + if match.name == 'episode_details': + return False + return super(EpisodeTitleFromPosition, self).should_remove(match, matches, filepart, hole, context) + + def when(self, matches, context): # pylint:disable=inconsistent-return-statements + if matches.named('episode_title'): + return + return super(EpisodeTitleFromPosition, self).when(matches, context) + + +class AlternativeTitleReplace(Rule): + """ + If alternateTitle was found and title is next to episode, season or date, replace it with episode_title. + """ + dependency = EpisodeTitleFromPosition + consequence = RenameMatch + + def __init__(self, previous_names): + super(AlternativeTitleReplace, self).__init__() + self.previous_names = previous_names + + def when(self, matches, context): # pylint:disable=inconsistent-return-statements + if matches.named('episode_title'): + return + + alternative_title = matches.range(predicate=lambda match: match.name == 'alternative_title', index=0) + if alternative_title: + main_title = matches.chain_before(alternative_title.start, seps=seps, + predicate=lambda match: 'title' in match.tags, index=0) + if main_title: + episode = matches.previous(main_title, + lambda previous: previous.named(*self.previous_names), + 0) + + crc32 = matches.named('crc32') + + if episode or crc32: + return alternative_title + + def then(self, matches, when_response, context): + matches.remove(when_response) + when_response.name = 'episode_title' + when_response.tags.append('alternative-replaced') + matches.append(when_response) + + +class RenameEpisodeTitleWhenMovieType(Rule): + """ + Rename episode_title by alternative_title when type is movie. + """ + priority = POST_PROCESS + + dependency = TypeProcessor + consequence = RenameMatch + + def when(self, matches, context): # pylint:disable=inconsistent-return-statements + if matches.named('episode_title', lambda m: 'alternative-replaced' not in m.tags) \ + and not matches.named('type', lambda m: m.value == 'episode'): + return matches.named('episode_title') + + def then(self, matches, when_response, context): + for match in when_response: + matches.remove(match) + match.name = 'alternative_title' + matches.append(match) + + +class Filepart3EpisodeTitle(Rule): + """ + If we have at least 3 filepart structured like this: + + Serie name/SO1/E01-episode_title.mkv + AAAAAAAAAA/BBB/CCCCCCCCCCCCCCCCCCCC + + Serie name/SO1/episode_title-E01.mkv + AAAAAAAAAA/BBB/CCCCCCCCCCCCCCCCCCCC + + If CCCC contains episode and BBB contains seasonNumber + Then title is to be found in AAAA. + """ + consequence = AppendMatch('title') + + def when(self, matches, context): # pylint:disable=inconsistent-return-statements + if matches.tagged('filepart-title'): + return + + fileparts = matches.markers.named('path') + if len(fileparts) < 3: + return + + filename = fileparts[-1] + directory = fileparts[-2] + subdirectory = fileparts[-3] + + episode_number = matches.range(filename.start, filename.end, lambda match: match.name == 'episode', 0) + if episode_number: + season = matches.range(directory.start, directory.end, lambda match: match.name == 'season', 0) + + if season: + hole = matches.holes(subdirectory.start, subdirectory.end, + ignore=or_(lambda match: 'weak-episode' in match.tags, TitleBaseRule.is_ignored), + formatter=cleanup, seps=title_seps, predicate=lambda match: match.value, + index=0) + if hole: + return hole + + +class Filepart2EpisodeTitle(Rule): + """ + If we have at least 2 filepart structured like this: + + Serie name SO1/E01-episode_title.mkv + AAAAAAAAAAAAA/BBBBBBBBBBBBBBBBBBBBB + + If BBBB contains episode and AAA contains a hole followed by seasonNumber + then title is to be found in AAAA. + + or + + Serie name/SO1E01-episode_title.mkv + AAAAAAAAAA/BBBBBBBBBBBBBBBBBBBBB + + If BBBB contains season and episode and AAA contains a hole + then title is to be found in AAAA. + """ + consequence = AppendMatch('title') + + def when(self, matches, context): # pylint:disable=inconsistent-return-statements + if matches.tagged('filepart-title'): + return + + fileparts = matches.markers.named('path') + if len(fileparts) < 2: + return + + filename = fileparts[-1] + directory = fileparts[-2] + + episode_number = matches.range(filename.start, filename.end, lambda match: match.name == 'episode', 0) + if episode_number: + season = (matches.range(directory.start, directory.end, lambda match: match.name == 'season', 0) or + matches.range(filename.start, filename.end, lambda match: match.name == 'season', 0)) + if season: + hole = matches.holes(directory.start, directory.end, + ignore=or_(lambda match: 'weak-episode' in match.tags, TitleBaseRule.is_ignored), + formatter=cleanup, seps=title_seps, + predicate=lambda match: match.value, index=0) + if hole: + hole.tags.append('filepart-title') + return hole diff --git a/lib/guessit/rules/properties/episodes.py b/lib/guessit/rules/properties/episodes.py new file mode 100644 index 00000000..345c785d --- /dev/null +++ b/lib/guessit/rules/properties/episodes.py @@ -0,0 +1,912 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +episode, season, disc, episode_count, season_count and episode_details properties +""" +import copy +from collections import defaultdict + +from rebulk import Rebulk, RemoveMatch, Rule, AppendMatch, RenameMatch +from rebulk.match import Match +from rebulk.remodule import re +from rebulk.utils import is_iterable + +from guessit.rules import match_processors +from guessit.rules.common.numeral import parse_numeral, numeral +from .title import TitleFromPosition +from ..common import dash, alt_dash, seps, seps_no_fs +from ..common.formatters import strip +from ..common.pattern import is_disabled +from ..common.validators import seps_surround, int_coercable, and_ +from ...reutils import build_or_pattern + + +def episodes(config): + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + + # pylint: disable=too-many-branches,too-many-statements,too-many-locals + def is_season_episode_disabled(context): + """Whether season and episode rules should be enabled.""" + return is_disabled(context, 'episode') or is_disabled(context, 'season') + + def episodes_season_chain_breaker(matches): + """ + Break chains if there's more than 100 offset between two neighbor values. + :param matches: + :type matches: + :return: + :rtype: + """ + eps = matches.named('episode') + if len(eps) > 1 and abs(eps[-1].value - eps[-2].value) > episode_max_range: + return True + + seasons = matches.named('season') + if len(seasons) > 1 and abs(seasons[-1].value - seasons[-2].value) > season_max_range: + return True + return False + + def season_episode_conflict_solver(match, other): + """ + Conflict solver for episode/season patterns + + :param match: + :param other: + :return: + """ + if match.name != other.name: + if match.name == 'episode' and other.name == 'year': + return match + if match.name in ('season', 'episode'): + if other.name in ('video_codec', 'audio_codec', 'container', 'date'): + return match + if (other.name == 'audio_channels' and 'weak-audio_channels' not in other.tags + and not match.initiator.children.named(match.name + 'Marker')) or ( + other.name == 'screen_size' and not int_coercable(other.raw)): + return match + if other.name in ('season', 'episode') and match.initiator != other.initiator: + if (match.initiator.name in ('weak_episode', 'weak_duplicate') + and other.initiator.name in ('weak_episode', 'weak_duplicate')): + return '__default__' + for current in (match, other): + if 'weak-episode' in current.tags or 'x' in current.initiator.raw.lower(): + return current + return '__default__' + + def ordering_validator(match): + """ + Validator for season list. They should be in natural order to be validated. + + episode/season separated by a weak discrete separator should be consecutive, unless a strong discrete separator + or a range separator is present in the chain (1.3&5 is valid, but 1.3-5 is not valid and 1.3.5 is not valid) + """ + values = match.children.to_dict() + if 'season' in values and is_iterable(values['season']): + # Season numbers must be in natural order to be validated. + if not list(sorted(values['season'])) == values['season']: + return False + if 'episode' in values and is_iterable(values['episode']): + # Season numbers must be in natural order to be validated. + if not list(sorted(values['episode'])) == values['episode']: + return False + + def is_consecutive(property_name): + """ + Check if the property season or episode has valid consecutive values. + :param property_name: + :type property_name: + :return: + :rtype: + """ + previous_match = None + valid = True + for current_match in match.children.named(property_name): + if previous_match: + match.children.previous(current_match, + lambda m: m.name == property_name + 'Separator') + separator = match.children.previous(current_match, + lambda m: m.name == property_name + 'Separator', 0) + if separator: + if separator.raw not in range_separators and separator.raw in weak_discrete_separators: + if not 0 < current_match.value - previous_match.value <= max_range_gap + 1: + valid = False + if separator.raw in strong_discrete_separators: + valid = True + break + previous_match = current_match + return valid + + return is_consecutive('episode') and is_consecutive('season') + + def validate_roman(match): + """ + Validate a roman match if surrounded by separators + :param match: + :type match: + :return: + :rtype: + """ + if int_coercable(match.raw): + return True + return seps_surround(match) + + season_words = config['season_words'] + episode_words = config['episode_words'] + of_words = config['of_words'] + all_words = config['all_words'] + season_markers = config['season_markers'] + season_ep_markers = config['season_ep_markers'] + disc_markers = config['disc_markers'] + episode_markers = config['episode_markers'] + range_separators = config['range_separators'] + weak_discrete_separators = list(sep for sep in seps_no_fs if sep not in range_separators) + strong_discrete_separators = config['discrete_separators'] + discrete_separators = strong_discrete_separators + weak_discrete_separators + episode_max_range = config['episode_max_range'] + season_max_range = config['season_max_range'] + max_range_gap = config['max_range_gap'] + + rebulk = Rebulk() \ + .regex_defaults(flags=re.IGNORECASE) \ + .string_defaults(ignore_case=True) \ + .chain_defaults(chain_breaker=episodes_season_chain_breaker) \ + .defaults(private_names=['episodeSeparator', 'seasonSeparator', 'episodeMarker', 'seasonMarker'], + formatter={'season': int, 'episode': int, 'version': int, 'count': int}, + children=True, + private_parent=True, + conflict_solver=season_episode_conflict_solver, + abbreviations=[alt_dash]) + + # S01E02, 01x02, S01S02S03 + rebulk.chain( + tags=['SxxExx'], + validate_all=True, + validator={'__parent__': and_(seps_surround, ordering_validator)}, + disabled=is_season_episode_disabled) \ + .defaults(tags=['SxxExx']) \ + .regex(build_or_pattern(season_markers, name='seasonMarker') + r'(?P<season>\d+)@?' + + build_or_pattern(episode_markers + disc_markers, name='episodeMarker') + r'@?(?P<episode>\d+)')\ + .repeater('+') \ + .regex(build_or_pattern(episode_markers + disc_markers + discrete_separators + range_separators, + name='episodeSeparator', + escape=True) + + r'(?P<episode>\d+)').repeater('*') + + rebulk.chain(tags=['SxxExx'], + validate_all=True, + validator={'__parent__': and_(seps_surround, ordering_validator)}, + disabled=is_season_episode_disabled) \ + .defaults(tags=['SxxExx']) \ + .regex(r'(?P<season>\d+)@?' + + build_or_pattern(season_ep_markers, name='episodeMarker') + + r'@?(?P<episode>\d+)').repeater('+') \ + + rebulk.chain(tags=['SxxExx'], + validate_all=True, + validator={'__parent__': and_(seps_surround, ordering_validator)}, + disabled=is_season_episode_disabled) \ + .defaults(tags=['SxxExx']) \ + .regex(r'(?P<season>\d+)@?' + + build_or_pattern(season_ep_markers, name='episodeMarker') + + r'@?(?P<episode>\d+)') \ + .regex(build_or_pattern(season_ep_markers + discrete_separators + range_separators, + name='episodeSeparator', + escape=True) + + r'(?P<episode>\d+)').repeater('*') + + rebulk.chain(tags=['SxxExx'], + validate_all=True, + validator={'__parent__': and_(seps_surround, ordering_validator)}, + disabled=is_season_episode_disabled) \ + .defaults(tags=['SxxExx']) \ + .regex(build_or_pattern(season_markers, name='seasonMarker') + r'(?P<season>\d+)') \ + .regex('(?P<other>Extras)', name='other', value='Extras', tags=['no-release-group-prefix']).repeater('?') \ + .regex(build_or_pattern(season_markers + discrete_separators + range_separators, + name='seasonSeparator', + escape=True) + + r'(?P<season>\d+)').repeater('*') + + # episode_details property + for episode_detail in ('Special', 'Pilot', 'Unaired', 'Final'): + rebulk.string(episode_detail, + private_parent=False, + children=False, + value=episode_detail, + name='episode_details', + disabled=lambda context: is_disabled(context, 'episode_details')) + + rebulk.defaults(private_names=['episodeSeparator', 'seasonSeparator', 'episodeMarker', 'seasonMarker'], + validate_all=True, + validator={'__parent__': and_(seps_surround, ordering_validator)}, + children=True, + private_parent=True, + conflict_solver=season_episode_conflict_solver) + + rebulk.chain(validate_all=True, + conflict_solver=season_episode_conflict_solver, + formatter={'season': parse_numeral, 'count': parse_numeral}, + validator={'__parent__': and_(seps_surround, ordering_validator), + 'season': validate_roman, + 'count': validate_roman}, + disabled=lambda context: context.get('type') == 'movie' or is_disabled(context, 'season')) \ + .defaults(formatter={'season': parse_numeral, 'count': parse_numeral}, + validator={'season': validate_roman, 'count': validate_roman}, + conflict_solver=season_episode_conflict_solver) \ + .regex(build_or_pattern(season_words, name='seasonMarker') + '@?(?P<season>' + numeral + ')') \ + .regex(r'' + build_or_pattern(of_words) + '@?(?P<count>' + numeral + ')').repeater('?') \ + .regex(r'@?' + build_or_pattern(range_separators + discrete_separators + ['@'], + name='seasonSeparator', escape=True) + + r'@?(?P<season>\d+)').repeater('*') + + rebulk.defaults(abbreviations=[dash]) + + rebulk.regex(build_or_pattern(episode_words, name='episodeMarker') + r'-?(?P<episode>\d+)' + + r'(?:v(?P<version>\d+))?' + + r'(?:-?' + build_or_pattern(of_words) + r'-?(?P<count>\d+))?', # Episode 4 + disabled=lambda context: context.get('type') == 'episode' or is_disabled(context, 'episode')) + + rebulk.regex(build_or_pattern(episode_words, name='episodeMarker') + r'-?(?P<episode>' + numeral + ')' + + r'(?:v(?P<version>\d+))?' + + r'(?:-?' + build_or_pattern(of_words) + r'-?(?P<count>\d+))?', # Episode 4 + validator={'episode': validate_roman}, + formatter={'episode': parse_numeral}, + disabled=lambda context: context.get('type') != 'episode' or is_disabled(context, 'episode')) + + rebulk.regex(r'S?(?P<season>\d+)-?(?:xE|Ex|E|x)-?(?P<other>' + build_or_pattern(all_words) + ')', + tags=['SxxExx'], + formatter={'other': lambda match: 'Complete'}, + disabled=lambda context: is_disabled(context, 'season')) + + # 12, 13 + rebulk.chain(tags=['weak-episode'], + disabled=lambda context: context.get('type') == 'movie' or is_disabled(context, 'episode')) \ + .defaults(validator=None, tags=['weak-episode']) \ + .regex(r'(?P<episode>\d{2})') \ + .regex(r'v(?P<version>\d+)').repeater('?') \ + .regex(r'(?P<episodeSeparator>[x-])(?P<episode>\d{2})', abbreviations=None).repeater('*') + + # 012, 013 + rebulk.chain(tags=['weak-episode'], + disabled=lambda context: context.get('type') == 'movie' or is_disabled(context, 'episode')) \ + .defaults(validator=None, tags=['weak-episode']) \ + .regex(r'0(?P<episode>\d{1,2})') \ + .regex(r'v(?P<version>\d+)').repeater('?') \ + .regex(r'(?P<episodeSeparator>[x-])0(?P<episode>\d{1,2})', abbreviations=None).repeater('*') + + # 112, 113 + rebulk.chain(tags=['weak-episode'], + name='weak_episode', + disabled=lambda context: context.get('type') == 'movie' or is_disabled(context, 'episode')) \ + .defaults(validator=None, tags=['weak-episode'], name='weak_episode') \ + .regex(r'(?P<episode>\d{3,4})') \ + .regex(r'v(?P<version>\d+)').repeater('?') \ + .regex(r'(?P<episodeSeparator>[x-])(?P<episode>\d{3,4})', abbreviations=None).repeater('*') + + # 1, 2, 3 + rebulk.chain(tags=['weak-episode'], + disabled=lambda context: context.get('type') != 'episode' or is_disabled(context, 'episode')) \ + .defaults(validator=None, tags=['weak-episode']) \ + .regex(r'(?P<episode>\d)') \ + .regex(r'v(?P<version>\d+)').repeater('?') \ + .regex(r'(?P<episodeSeparator>[x-])(?P<episode>\d{1,2})', abbreviations=None).repeater('*') + + # e112, e113, 1e18, 3e19 + rebulk.chain(disabled=lambda context: is_disabled(context, 'episode')) \ + .defaults(validator=None) \ + .regex(r'(?P<season>\d{1,2})?(?P<episodeMarker>e)(?P<episode>\d{1,4})') \ + .regex(r'v(?P<version>\d+)').repeater('?') \ + .regex(r'(?P<episodeSeparator>e|x|-)(?P<episode>\d{1,4})', abbreviations=None).repeater('*') + + # ep 112, ep113, ep112, ep113 + rebulk.chain(disabled=lambda context: is_disabled(context, 'episode')) \ + .defaults(validator=None) \ + .regex(r'ep-?(?P<episode>\d{1,4})') \ + .regex(r'v(?P<version>\d+)').repeater('?') \ + .regex(r'(?P<episodeSeparator>ep|e|x|-)(?P<episode>\d{1,4})', abbreviations=None).repeater('*') + + # cap 112, cap 112_114 + rebulk.chain(tags=['see-pattern'], + disabled=is_season_episode_disabled) \ + .defaults(validator=None, tags=['see-pattern']) \ + .regex(r'(?P<seasonMarker>cap)-?(?P<season>\d{1,2})(?P<episode>\d{2})') \ + .regex(r'(?P<episodeSeparator>-)(?P<season>\d{1,2})(?P<episode>\d{2})').repeater('?') + + # 102, 0102 + rebulk.chain(tags=['weak-episode', 'weak-duplicate'], + name='weak_duplicate', + conflict_solver=season_episode_conflict_solver, + disabled=lambda context: (context.get('episode_prefer_number', False) or + context.get('type') == 'movie') or is_season_episode_disabled(context)) \ + .defaults(tags=['weak-episode', 'weak-duplicate'], + name='weak_duplicate', + validator=None, + conflict_solver=season_episode_conflict_solver) \ + .regex(r'(?P<season>\d{1,2})(?P<episode>\d{2})') \ + .regex(r'v(?P<version>\d+)').repeater('?') \ + .regex(r'(?P<episodeSeparator>x|-)(?P<episode>\d{2})', abbreviations=None).repeater('*') + + rebulk.regex(r'v(?P<version>\d+)', + formatter=int, + disabled=lambda context: is_disabled(context, 'version')) + + rebulk.defaults(private_names=['episodeSeparator', 'seasonSeparator']) + + # TODO: List of words + # detached of X count (season/episode) + rebulk.regex(r'(?P<episode>\d+)-?' + build_or_pattern(of_words) + + r'-?(?P<count>\d+)-?' + build_or_pattern(episode_words) + '?', + formatter=int, + pre_match_processor=match_processors.strip, + disabled=lambda context: is_disabled(context, 'episode')) + + rebulk.regex(r'Minisodes?', + children=False, + private_parent=False, + name='episode_format', + value="Minisode", + disabled=lambda context: is_disabled(context, 'episode_format')) + + rebulk.rules(WeakConflictSolver, RemoveInvalidSeason, RemoveInvalidEpisode, + SeePatternRange(range_separators + ['_']), + EpisodeNumberSeparatorRange(range_separators), + SeasonSeparatorRange(range_separators), RemoveWeakIfMovie, RemoveWeakIfSxxExx, RemoveWeakDuplicate, + EpisodeDetailValidator, RemoveDetachedEpisodeNumber, VersionValidator, RemoveWeak(episode_words), + RenameToAbsoluteEpisode, CountValidator, EpisodeSingleDigitValidator, RenameToDiscMatch) + + return rebulk + + +class WeakConflictSolver(Rule): + """ + Rule to decide whether weak-episode or weak-duplicate matches should be kept. + + If an anime is detected: + - weak-duplicate matches should be removed + - weak-episode matches should be tagged as anime + Otherwise: + - weak-episode matches are removed unless they're part of an episode range match. + """ + priority = 128 + consequence = [RemoveMatch, AppendMatch] + + def enabled(self, context): + return context.get('type') != 'movie' + + @classmethod + def is_anime(cls, matches): + """Return True if it seems to be an anime. + + Anime characteristics: + - version, crc32 matches + - screen_size inside brackets + - release_group at start and inside brackets + """ + if matches.named('version') or matches.named('crc32'): + return True + + for group in matches.markers.named('group'): + if matches.range(group.start, group.end, predicate=lambda m: m.name == 'screen_size'): + return True + if matches.markers.starting(group.start, predicate=lambda m: m.name == 'path'): + hole = matches.holes(group.start, group.end, index=0) + if hole and hole.raw == group.raw: + return True + + return False + + def when(self, matches, context): + to_remove = [] + to_append = [] + anime_detected = self.is_anime(matches) + for filepart in matches.markers.named('path'): + weak_matches = matches.range(filepart.start, filepart.end, predicate=( + lambda m: m.initiator.name == 'weak_episode')) + weak_dup_matches = matches.range(filepart.start, filepart.end, predicate=( + lambda m: m.initiator.name == 'weak_duplicate')) + if anime_detected: + if weak_matches: + to_remove.extend(weak_dup_matches) + for match in matches.range(filepart.start, filepart.end, predicate=( + lambda m: m.name == 'episode' and m.initiator.name != 'weak_duplicate')): + episode = copy.copy(match) + episode.tags = episode.tags + ['anime'] + to_append.append(episode) + to_remove.append(match) + elif weak_dup_matches: + episodes_in_range = matches.range(filepart.start, filepart.end, predicate=( + lambda m: + m.name == 'episode' and m.initiator.name == 'weak_episode' + and m.initiator.children.named('episodeSeparator') + )) + if not episodes_in_range and not matches.range(filepart.start, filepart.end, + predicate=lambda m: 'SxxExx' in m.tags): + to_remove.extend(weak_matches) + else: + for match in episodes_in_range: + episode = copy.copy(match) + episode.tags = [] + to_append.append(episode) + to_remove.append(match) + + if to_append: + to_remove.extend(weak_dup_matches) + + if to_remove or to_append: + return to_remove, to_append + return False + + +class CountValidator(Rule): + """ + Validate count property and rename it + """ + priority = 64 + consequence = [RemoveMatch, RenameMatch('episode_count'), RenameMatch('season_count')] + + properties = {'episode_count': [None], 'season_count': [None]} + + def when(self, matches, context): + to_remove = [] + episode_count = [] + season_count = [] + + for count in matches.named('count'): + previous = matches.previous(count, lambda match: match.name in ['episode', 'season'], 0) + if previous: + if previous.name == 'episode': + episode_count.append(count) + elif previous.name == 'season': + season_count.append(count) + else: + to_remove.append(count) + if to_remove or episode_count or season_count: + return to_remove, episode_count, season_count + return False + + +class SeePatternRange(Rule): + """ + Create matches for episode range for SEE pattern. E.g.: Cap.102_104 + """ + priority = 128 + consequence = [RemoveMatch, AppendMatch] + + def __init__(self, range_separators): + super(SeePatternRange, self).__init__() + self.range_separators = range_separators + + def when(self, matches, context): + to_remove = [] + to_append = [] + + for separator in matches.tagged('see-pattern', lambda m: m.name == 'episodeSeparator'): + previous_match = matches.previous(separator, lambda m: m.name == 'episode' and 'see-pattern' in m.tags, 0) + next_match = matches.next(separator, lambda m: m.name == 'season' and 'see-pattern' in m.tags, 0) + if not next_match: + continue + + next_match = matches.next(next_match, lambda m: m.name == 'episode' and 'see-pattern' in m.tags, 0) + if previous_match and next_match and separator.value in self.range_separators: + to_remove.append(next_match) + + for episode_number in range(previous_match.value + 1, next_match.value + 1): + match = copy.copy(next_match) + match.value = episode_number + to_append.append(match) + + to_remove.append(separator) + + if to_remove or to_append: + return to_remove, to_append + return False + + +class AbstractSeparatorRange(Rule): + """ + Remove separator matches and create matches for season range. + """ + priority = 128 + consequence = [RemoveMatch, AppendMatch] + + def __init__(self, range_separators, property_name): + super(AbstractSeparatorRange, self).__init__() + self.range_separators = range_separators + self.property_name = property_name + + def when(self, matches, context): + to_remove = [] + to_append = [] + + for separator in matches.named(self.property_name + 'Separator'): + previous_match = matches.previous(separator, lambda m: m.name == self.property_name, 0) + next_match = matches.next(separator, lambda m: m.name == self.property_name, 0) + initiator = separator.initiator + + if previous_match and next_match and separator.value in self.range_separators: + to_remove.append(next_match) + for episode_number in range(previous_match.value + 1, next_match.value): + match = copy.copy(next_match) + match.value = episode_number + initiator.children.append(match) + to_append.append(match) + to_append.append(next_match) + to_remove.append(separator) + + previous_match = None + for next_match in matches.named(self.property_name): + if previous_match: + separator = matches.input_string[previous_match.initiator.end:next_match.initiator.start] + if separator not in self.range_separators: + separator = strip(separator) + if separator in self.range_separators: + initiator = previous_match.initiator + for episode_number in range(previous_match.value + 1, next_match.value): + match = copy.copy(next_match) + match.value = episode_number + initiator.children.append(match) + to_append.append(match) + to_append.append(Match(previous_match.end, next_match.start - 1, + name=self.property_name + 'Separator', + private=True, + input_string=matches.input_string)) + to_remove.append(next_match) # Remove and append match to support proper ordering + to_append.append(next_match) + + previous_match = next_match + + if to_remove or to_append: + return to_remove, to_append + return False + + +class RenameToAbsoluteEpisode(Rule): + """ + Rename episode to absolute_episodes. + + Absolute episodes are only used if two groups of episodes are detected: + S02E04-06 25-27 + 25-27 S02E04-06 + 2x04-06 25-27 + 28. Anime Name S02E05 + The matches in the group with higher episode values are renamed to absolute_episode. + """ + + consequence = RenameMatch('absolute_episode') + + def when(self, matches, context): # pylint:disable=inconsistent-return-statements + initiators = {match.initiator for match in matches.named('episode') + if len(match.initiator.children.named('episode')) > 1} + if len(initiators) != 2: + ret = [] + for filepart in matches.markers.named('path'): + if matches.range(filepart.start + 1, filepart.end, predicate=lambda m: m.name == 'episode'): + ret.extend( + matches.starting(filepart.start, predicate=lambda m: m.initiator.name == 'weak_episode')) + return ret + + initiators = sorted(initiators, key=lambda item: item.end) + if not matches.holes(initiators[0].end, initiators[1].start, predicate=lambda m: m.raw.strip(seps)): + first_range = matches.named('episode', predicate=lambda m: m.initiator == initiators[0]) + second_range = matches.named('episode', predicate=lambda m: m.initiator == initiators[1]) + if len(first_range) == len(second_range): + if second_range[0].value > first_range[0].value: + return second_range + if first_range[0].value > second_range[0].value: + return first_range + + +class EpisodeNumberSeparatorRange(AbstractSeparatorRange): + """ + Remove separator matches and create matches for episoderNumber range. + """ + + def __init__(self, range_separators): + super(EpisodeNumberSeparatorRange, self).__init__(range_separators, "episode") + + +class SeasonSeparatorRange(AbstractSeparatorRange): + """ + Remove separator matches and create matches for season range. + """ + + def __init__(self, range_separators): + super(SeasonSeparatorRange, self).__init__(range_separators, "season") + + +class RemoveWeakIfMovie(Rule): + """ + Remove weak-episode tagged matches if it seems to be a movie. + """ + priority = 64 + consequence = RemoveMatch + + def enabled(self, context): + return context.get('type') != 'episode' + + def when(self, matches, context): + to_remove = [] + to_ignore = set() + remove = False + for filepart in matches.markers.named('path'): + year = matches.range(filepart.start, filepart.end, predicate=lambda m: m.name == 'year', index=0) + if year: + remove = True + next_match = matches.range(year.end, filepart.end, predicate=lambda m: m.private, index=0) + if (next_match and not matches.holes(year.end, next_match.start, predicate=lambda m: m.raw.strip(seps)) + and not matches.at_match(next_match, predicate=lambda m: m.name == 'year')): + to_ignore.add(next_match.initiator) + + to_ignore.update(matches.range(filepart.start, filepart.end, + predicate=lambda m: len(m.children.named('episode')) > 1)) + + to_remove.extend(matches.conflicting(year)) + if remove: + to_remove.extend(matches.tagged('weak-episode', predicate=( + lambda m: m.initiator not in to_ignore and 'anime' not in m.tags))) + + return to_remove + + +class RemoveWeak(Rule): + """ + Remove weak-episode matches which appears after video, source, and audio matches. + """ + priority = 16 + consequence = RemoveMatch, AppendMatch + + def __init__(self, episode_words): + super(RemoveWeak, self).__init__() + self.episode_words = episode_words + + def when(self, matches, context): + to_remove = [] + to_append = [] + for filepart in matches.markers.named('path'): + weaks = matches.range(filepart.start, filepart.end, predicate=lambda m: 'weak-episode' in m.tags) + if weaks: + weak = weaks[0] + previous = matches.previous(weak, predicate=lambda m: m.name in ( + 'audio_codec', 'screen_size', 'streaming_service', 'source', 'video_profile', + 'audio_channels', 'audio_profile'), index=0) + if previous and not matches.holes( + previous.end, weak.start, predicate=lambda m: m.raw.strip(seps)): + if previous.raw.lower() in self.episode_words: + try: + episode = copy.copy(weak) + episode.name = 'episode' + episode.value = int(weak.value) + episode.start = previous.start + episode.private = False + episode.tags = [] + + to_append.append(episode) + except ValueError: + pass + + to_remove.extend(weaks) + if to_remove or to_append: + return to_remove, to_append + return False + + +class RemoveWeakIfSxxExx(Rule): + """ + Remove weak-episode tagged matches if SxxExx pattern is matched. + + Weak episodes at beginning of filepart are kept. + """ + priority = 64 + consequence = RemoveMatch + + def when(self, matches, context): + to_remove = [] + for filepart in matches.markers.named('path'): + if matches.range(filepart.start, filepart.end, + predicate=lambda m: not m.private and 'SxxExx' in m.tags): + for match in matches.range(filepart.start, filepart.end, predicate=lambda m: 'weak-episode' in m.tags): + if match.start != filepart.start or match.initiator.name != 'weak_episode': + to_remove.append(match) + return to_remove + + +class RemoveInvalidSeason(Rule): + """ + Remove invalid season matches. + """ + priority = 64 + consequence = RemoveMatch + + def when(self, matches, context): + to_remove = [] + for filepart in matches.markers.named('path'): + strong_season = matches.range(filepart.start, filepart.end, index=0, + predicate=lambda m: m.name == 'season' + and not m.private and 'SxxExx' in m.tags) + if strong_season: + if strong_season.initiator.children.named('episode'): + for season in matches.range(strong_season.end, filepart.end, + predicate=lambda m: m.name == 'season' and not m.private): + # remove weak season or seasons without episode matches + if 'SxxExx' not in season.tags or not season.initiator.children.named('episode'): + if season.initiator: + to_remove.append(season.initiator) + to_remove.extend(season.initiator.children) + else: + to_remove.append(season) + + return to_remove + + +class RemoveInvalidEpisode(Rule): + """ + Remove invalid episode matches. + """ + priority = 64 + consequence = RemoveMatch + + def when(self, matches, context): + to_remove = [] + for filepart in matches.markers.named('path'): + strong_episode = matches.range(filepart.start, filepart.end, index=0, + predicate=lambda m: m.name == 'episode' + and not m.private and 'SxxExx' in m.tags) + if strong_episode: + strong_ep_marker = RemoveInvalidEpisode.get_episode_prefix(matches, strong_episode) + for episode in matches.range(strong_episode.end, filepart.end, + predicate=lambda m: m.name == 'episode' and not m.private): + ep_marker = RemoveInvalidEpisode.get_episode_prefix(matches, episode) + if strong_ep_marker and ep_marker and strong_ep_marker.value.lower() != ep_marker.value.lower(): + if episode.initiator: + to_remove.append(episode.initiator) + to_remove.extend(episode.initiator.children) + else: + to_remove.append(ep_marker) + to_remove.append(episode) + + return to_remove + + @staticmethod + def get_episode_prefix(matches, episode): + """ + Return episode prefix: episodeMarker or episodeSeparator + """ + return matches.previous(episode, index=0, + predicate=lambda m: m.name in ('episodeMarker', 'episodeSeparator')) + + +class RemoveWeakDuplicate(Rule): + """ + Remove weak-duplicate tagged matches if duplicate patterns, for example The 100.109 + """ + priority = 64 + consequence = RemoveMatch + + def when(self, matches, context): + to_remove = [] + for filepart in matches.markers.named('path'): + patterns = defaultdict(list) + for match in reversed(matches.range(filepart.start, filepart.end, + predicate=lambda m: 'weak-duplicate' in m.tags)): + if match.pattern in patterns[match.name]: + to_remove.append(match) + else: + patterns[match.name].append(match.pattern) + return to_remove + + +class EpisodeDetailValidator(Rule): + """ + Validate episode_details if they are detached or next to season or episode. + """ + priority = 64 + consequence = RemoveMatch + + def when(self, matches, context): + ret = [] + for detail in matches.named('episode_details'): + if not seps_surround(detail) \ + and not matches.previous(detail, lambda match: match.name in ['season', 'episode']) \ + and not matches.next(detail, lambda match: match.name in ['season', 'episode']): + ret.append(detail) + return ret + + +class RemoveDetachedEpisodeNumber(Rule): + """ + If multiple episode are found, remove those that are not detached from a range and less than 10. + + Fairy Tail 2 - 16-20, 2 should be removed. + """ + priority = 64 + consequence = RemoveMatch + dependency = [RemoveWeakIfSxxExx, RemoveWeakDuplicate] + + def when(self, matches, context): + ret = [] + + episode_numbers = [] + episode_values = set() + for match in matches.named('episode', lambda m: not m.private and 'weak-episode' in m.tags): + if match.value not in episode_values: + episode_numbers.append(match) + episode_values.add(match.value) + + episode_numbers = list(sorted(episode_numbers, key=lambda m: m.value)) + if len(episode_numbers) > 1 and \ + episode_numbers[0].value < 10 and \ + episode_numbers[1].value - episode_numbers[0].value != 1: + parent = episode_numbers[0] + while parent: # TODO: Add a feature in rebulk to avoid this ... + ret.append(parent) + parent = parent.parent + return ret + + +class VersionValidator(Rule): + """ + Validate version if previous match is episode or if surrounded by separators. + """ + priority = 64 + dependency = [RemoveWeakIfMovie, RemoveWeakIfSxxExx] + consequence = RemoveMatch + + def when(self, matches, context): + ret = [] + for version in matches.named('version'): + episode_number = matches.previous(version, lambda match: match.name == 'episode', 0) + if not episode_number and not seps_surround(version.initiator): + ret.append(version) + return ret + + +class EpisodeSingleDigitValidator(Rule): + """ + Remove single digit episode when inside a group that doesn't own title. + """ + dependency = [TitleFromPosition] + + consequence = RemoveMatch + + def when(self, matches, context): + ret = [] + for episode in matches.named('episode', lambda match: len(match.initiator) == 1): + group = matches.markers.at_match(episode, lambda marker: marker.name == 'group', index=0) + if group: + if not matches.range(*group.span, predicate=lambda match: match.name == 'title'): + ret.append(episode) + return ret + + +class RenameToDiscMatch(Rule): + """ + Rename episodes detected with `d` episodeMarkers to `disc`. + """ + + consequence = [RenameMatch('disc'), RenameMatch('discMarker'), RemoveMatch] + + def when(self, matches, context): + discs = [] + markers = [] + to_remove = [] + + disc_disabled = is_disabled(context, 'disc') + + for marker in matches.named('episodeMarker', predicate=lambda m: m.value.lower() == 'd'): + if disc_disabled: + to_remove.append(marker) + to_remove.extend(marker.initiator.children) + continue + + markers.append(marker) + discs.extend(sorted(marker.initiator.children.named('episode'), key=lambda m: m.value)) + + if discs or markers or to_remove: + return discs, markers, to_remove + return False diff --git a/lib/guessit/rules/properties/film.py b/lib/guessit/rules/properties/film.py new file mode 100644 index 00000000..3c7e6c0f --- /dev/null +++ b/lib/guessit/rules/properties/film.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +film property +""" +from rebulk import Rebulk, AppendMatch, Rule +from rebulk.remodule import re + +from ..common.formatters import cleanup +from ..common.pattern import is_disabled +from ..common.validators import seps_surround + + +def film(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk().regex_defaults(flags=re.IGNORECASE, validate_all=True, validator={'__parent__': seps_surround}) + + rebulk.regex(r'f(\d{1,2})', name='film', private_parent=True, children=True, formatter=int, + disabled=lambda context: is_disabled(context, 'film')) + + rebulk.rules(FilmTitleRule) + + return rebulk + + +class FilmTitleRule(Rule): + """ + Rule to find out film_title (hole after film property + """ + consequence = AppendMatch + + properties = {'film_title': [None]} + + def enabled(self, context): + return not is_disabled(context, 'film_title') + + def when(self, matches, context): # pylint:disable=inconsistent-return-statements + bonus_number = matches.named('film', lambda match: not match.private, index=0) + if bonus_number: + filepath = matches.markers.at_match(bonus_number, lambda marker: marker.name == 'path', 0) + hole = matches.holes(filepath.start, bonus_number.start + 1, formatter=cleanup, index=0) + if hole and hole.value: + hole.name = 'film_title' + return hole diff --git a/lib/guessit/rules/properties/language.py b/lib/guessit/rules/properties/language.py new file mode 100644 index 00000000..3f83bc34 --- /dev/null +++ b/lib/guessit/rules/properties/language.py @@ -0,0 +1,510 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +language and subtitle_language properties +""" +# pylint: disable=no-member +import copy +from collections import defaultdict, namedtuple + +import babelfish +from rebulk import Rebulk, Rule, RemoveMatch, RenameMatch +from rebulk.remodule import re + +from ..common import seps +from ..common.pattern import is_disabled +from ..common.words import iter_words +from ..common.validators import seps_surround + + +def language(config, common_words): + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :param common_words: common words + :type common_words: set + :return: Created Rebulk object + :rtype: Rebulk + """ + subtitle_both = config['subtitle_affixes'] + subtitle_prefixes = sorted(subtitle_both + config['subtitle_prefixes'], key=length_comparator) + subtitle_suffixes = sorted(subtitle_both + config['subtitle_suffixes'], key=length_comparator) + lang_both = config['language_affixes'] + lang_prefixes = sorted(lang_both + config['language_prefixes'], key=length_comparator) + lang_suffixes = sorted(lang_both + config['language_suffixes'], key=length_comparator) + weak_affixes = frozenset(config['weak_affixes']) + + rebulk = Rebulk(disabled=lambda context: (is_disabled(context, 'language') and + is_disabled(context, 'subtitle_language'))) + + rebulk.string(*subtitle_prefixes, name="subtitle_language.prefix", ignore_case=True, private=True, + validator=seps_surround, tags=['release-group-prefix'], + disabled=lambda context: is_disabled(context, 'subtitle_language')) + rebulk.string(*subtitle_suffixes, name="subtitle_language.suffix", ignore_case=True, private=True, + validator=seps_surround, + disabled=lambda context: is_disabled(context, 'subtitle_language')) + rebulk.string(*lang_suffixes, name="language.suffix", ignore_case=True, private=True, + validator=seps_surround, tags=['source-suffix'], + disabled=lambda context: is_disabled(context, 'language')) + + def find_languages(string, context=None): + """Find languages in the string + + :return: list of tuple (property, Language, lang_word, word) + """ + return LanguageFinder(context, subtitle_prefixes, subtitle_suffixes, + lang_prefixes, lang_suffixes, weak_affixes).find(string) + + rebulk.functional(find_languages, + properties={'language': [None]}, + disabled=lambda context: not context.get('allowed_languages')) + rebulk.rules(SubtitleExtensionRule, + SubtitlePrefixLanguageRule, + SubtitleSuffixLanguageRule, + RemoveLanguage, + RemoveInvalidLanguages(common_words)) + + babelfish.language_converters['guessit'] = GuessitConverter(config['synonyms']) + + return rebulk + + +UNDETERMINED = babelfish.Language('und') +MULTIPLE = babelfish.Language('mul') +NON_SPECIFIC_LANGUAGES = frozenset([UNDETERMINED, MULTIPLE]) + + +class GuessitConverter(babelfish.LanguageReverseConverter): # pylint: disable=missing-docstring + _with_country_regexp = re.compile(r'(.*)\((.*)\)') + _with_country_regexp2 = re.compile(r'(.*)-(.*)') + + def __init__(self, synonyms): + self.guessit_exceptions = {} + for code, synlist in synonyms.items(): + if '_' in code: + (alpha3, country) = code.split('_') + else: + (alpha3, country) = (code, None) + for syn in synlist: + self.guessit_exceptions[syn.lower()] = (alpha3, country, None) + + @property + def codes(self): # pylint: disable=missing-docstring + return (babelfish.language_converters['alpha3b'].codes | + babelfish.language_converters['alpha2'].codes | + babelfish.language_converters['name'].codes | + babelfish.language_converters['opensubtitles'].codes | + babelfish.country_converters['name'].codes | + frozenset(self.guessit_exceptions.keys())) + + def convert(self, alpha3, country=None, script=None): + return str(babelfish.Language(alpha3, country, script)) + + def reverse(self, name): # pylint:disable=arguments-differ + name = name.lower() + # exceptions come first, as they need to override a potential match + # with any of the other guessers + try: + return self.guessit_exceptions[name] + except KeyError: + pass + + for conv in [babelfish.Language, + babelfish.Language.fromalpha3b, + babelfish.Language.fromalpha2, + babelfish.Language.fromname, + babelfish.Language.fromopensubtitles, + babelfish.Language.fromietf]: + try: + reverse = conv(name) + return reverse.alpha3, reverse.country, reverse.script + except (ValueError, babelfish.LanguageReverseError): + pass + + raise babelfish.LanguageReverseError(name) + + +def length_comparator(value): + """ + Return value length. + """ + return len(value) + + +_LanguageMatch = namedtuple('_LanguageMatch', ['property_name', 'word', 'lang']) + + +class LanguageWord(object): + """ + Extension to the Word namedtuple in order to create compound words. + + E.g.: pt-BR, soft subtitles, custom subs + """ + + def __init__(self, start, end, value, input_string, next_word=None): + self.start = start + self.end = end + self.value = value + self.input_string = input_string + self.next_word = next_word + + @property + def extended_word(self): # pylint:disable=inconsistent-return-statements + """ + Return the extended word for this instance, if any. + """ + if self.next_word: + separator = self.input_string[self.end:self.next_word.start] + next_separator = self.input_string[self.next_word.end:self.next_word.end + 1] + + if (separator == '-' and separator != next_separator) or separator in (' ', '.'): + value = self.input_string[self.start:self.next_word.end].replace('.', ' ') + + return LanguageWord(self.start, self.next_word.end, value, self.input_string, self.next_word.next_word) + + def __repr__(self): + return '<({start},{end}): {value}'.format(start=self.start, end=self.end, value=self.value) + + +def to_rebulk_match(language_match): + """ + Convert language match to rebulk Match: start, end, dict + """ + word = language_match.word + start = word.start + end = word.end + name = language_match.property_name + if language_match.lang == UNDETERMINED: + return start, end, { + 'name': name, + 'value': word.value.lower(), + 'formatter': babelfish.Language, + 'tags': ['weak-language'] + } + + return start, end, { + 'name': name, + 'value': language_match.lang + } + + +class LanguageFinder(object): + """ + Helper class to search and return language matches: 'language' and 'subtitle_language' properties + """ + + def __init__(self, context, + subtitle_prefixes, subtitle_suffixes, + lang_prefixes, lang_suffixes, weak_affixes): + allowed_languages = context.get('allowed_languages') if context else None + self.allowed_languages = {l.lower() for l in allowed_languages or []} + self.weak_affixes = weak_affixes + self.prefixes_map = {} + self.suffixes_map = {} + + if not is_disabled(context, 'subtitle_language'): + self.prefixes_map['subtitle_language'] = subtitle_prefixes + self.suffixes_map['subtitle_language'] = subtitle_suffixes + + self.prefixes_map['language'] = lang_prefixes + self.suffixes_map['language'] = lang_suffixes + + def find(self, string): + """ + Return all matches for language and subtitle_language. + + Undetermined language matches are removed if a regular language is found. + Multi language matches are removed if there are only undetermined language matches + """ + regular_lang_map = defaultdict(set) + undetermined_map = defaultdict(set) + multi_map = defaultdict(set) + + for match in self.iter_language_matches(string): + key = match.property_name + if match.lang == UNDETERMINED: + undetermined_map[key].add(match) + elif match.lang == 'mul': + multi_map[key].add(match) + else: + regular_lang_map[key].add(match) + + for key, values in multi_map.items(): + if key in regular_lang_map or key not in undetermined_map: + for value in values: + yield to_rebulk_match(value) + + for key, values in undetermined_map.items(): + if key not in regular_lang_map: + for value in values: + yield to_rebulk_match(value) + + for values in regular_lang_map.values(): + for value in values: + yield to_rebulk_match(value) + + def iter_language_matches(self, string): + """ + Return language matches for the given string. + """ + candidates = [] + previous = None + for word in iter_words(string): + language_word = LanguageWord(start=word.span[0], end=word.span[1], value=word.value, input_string=string) + if previous: + previous.next_word = language_word + candidates.append(previous) + previous = language_word + if previous: + candidates.append(previous) + + for candidate in candidates: + for match in self.iter_matches_for_candidate(candidate): + yield match + + def iter_matches_for_candidate(self, language_word): + """ + Return language matches for the given candidate word. + """ + tuples = [ + (language_word, language_word.next_word, + self.prefixes_map, + lambda string, prefix: string.startswith(prefix), + lambda string, prefix: string[len(prefix):]), + (language_word.next_word, language_word, + self.suffixes_map, + lambda string, suffix: string.endswith(suffix), + lambda string, suffix: string[:len(string) - len(suffix)]) + ] + + for word, fallback_word, affixes, is_affix, strip_affix in tuples: + if not word: + continue + + match = self.find_match_for_word(word, fallback_word, affixes, is_affix, strip_affix) + if match: + yield match + + match = self.find_language_match_for_word(language_word) + if match: + yield match + + def find_match_for_word(self, word, fallback_word, affixes, is_affix, strip_affix): # pylint:disable=inconsistent-return-statements + """ + Return the language match for the given word and affixes. + """ + for current_word in (word.extended_word, word): + if not current_word: + continue + + word_lang = current_word.value.lower() + + for key, parts in affixes.items(): + for part in parts: + if not is_affix(word_lang, part): + continue + + match = None + value = strip_affix(word_lang, part) + if not value: + if fallback_word and ( + abs(fallback_word.start - word.end) <= 1 or abs(word.start - fallback_word.end) <= 1): + match = self.find_language_match_for_word(fallback_word, key=key) + + if not match and part not in self.weak_affixes: + match = self.create_language_match(key, LanguageWord(current_word.start, current_word.end, + 'und', current_word.input_string)) + else: + match = self.create_language_match(key, LanguageWord(current_word.start, current_word.end, + value, current_word.input_string)) + + if match: + return match + + def find_language_match_for_word(self, word, key='language'): # pylint:disable=inconsistent-return-statements + """ + Return the language match for the given word. + """ + for current_word in (word.extended_word, word): + if current_word: + match = self.create_language_match(key, current_word) + if match: + return match + + def create_language_match(self, key, word): # pylint:disable=inconsistent-return-statements + """ + Create a LanguageMatch for a given word + """ + lang = self.parse_language(word.value.lower()) + + if lang is not None: + return _LanguageMatch(property_name=key, word=word, lang=lang) + + def parse_language(self, lang_word): # pylint:disable=inconsistent-return-statements + """ + Parse the lang_word into a valid Language. + + Multi and Undetermined languages are also valid languages. + """ + try: + lang = babelfish.Language.fromguessit(lang_word) + if ((hasattr(lang, 'name') and lang.name.lower() in self.allowed_languages) or + (hasattr(lang, 'alpha2') and lang.alpha2.lower() in self.allowed_languages) or + lang.alpha3.lower() in self.allowed_languages): + return lang + + except babelfish.Error: + pass + + +class SubtitlePrefixLanguageRule(Rule): + """ + Convert language guess as subtitle_language if previous match is a subtitle language prefix + """ + consequence = RemoveMatch + + properties = {'subtitle_language': [None]} + + def enabled(self, context): + return not is_disabled(context, 'subtitle_language') + + def when(self, matches, context): + to_rename = [] + to_remove = matches.named('subtitle_language.prefix') + for lang in matches.named('language'): + prefix = matches.previous(lang, lambda match: match.name == 'subtitle_language.prefix', 0) + if not prefix: + group_marker = matches.markers.at_match(lang, lambda marker: marker.name == 'group', 0) + if group_marker: + # Find prefix if placed just before the group + prefix = matches.previous(group_marker, lambda match: match.name == 'subtitle_language.prefix', + 0) + if not prefix: + # Find prefix if placed before in the group + prefix = matches.range(group_marker.start, lang.start, + lambda match: match.name == 'subtitle_language.prefix', 0) + if prefix: + to_rename.append((prefix, lang)) + to_remove.extend(matches.conflicting(lang)) + if prefix in to_remove: + to_remove.remove(prefix) + if to_rename or to_remove: + return to_rename, to_remove + return False + + def then(self, matches, when_response, context): + to_rename, to_remove = when_response + super(SubtitlePrefixLanguageRule, self).then(matches, to_remove, context) + for prefix, match in to_rename: + # Remove suffix equivalent of prefix. + suffix = copy.copy(prefix) + suffix.name = 'subtitle_language.suffix' + if suffix in matches: + matches.remove(suffix) + matches.remove(match) + match.name = 'subtitle_language' + matches.append(match) + + +class SubtitleSuffixLanguageRule(Rule): + """ + Convert language guess as subtitle_language if next match is a subtitle language suffix + """ + dependency = SubtitlePrefixLanguageRule + consequence = RemoveMatch + + properties = {'subtitle_language': [None]} + + def enabled(self, context): + return not is_disabled(context, 'subtitle_language') + + def when(self, matches, context): + to_append = [] + to_remove = matches.named('subtitle_language.suffix') + for lang in matches.named('language'): + suffix = matches.next(lang, lambda match: match.name == 'subtitle_language.suffix', 0) + if suffix: + to_append.append(lang) + if suffix in to_remove: + to_remove.remove(suffix) + if to_append or to_remove: + return to_append, to_remove + return False + + def then(self, matches, when_response, context): + to_rename, to_remove = when_response + super(SubtitleSuffixLanguageRule, self).then(matches, to_remove, context) + for match in to_rename: + matches.remove(match) + match.name = 'subtitle_language' + matches.append(match) + + +class SubtitleExtensionRule(Rule): + """ + Convert language guess as subtitle_language if next match is a subtitle extension. + + Since it's a strong match, it also removes any conflicting source with it. + """ + consequence = [RemoveMatch, RenameMatch('subtitle_language')] + + properties = {'subtitle_language': [None]} + + def enabled(self, context): + return not is_disabled(context, 'subtitle_language') + + def when(self, matches, context): # pylint:disable=inconsistent-return-statements + subtitle_extension = matches.named('container', + lambda match: 'extension' in match.tags and 'subtitle' in match.tags, + 0) + if subtitle_extension: + subtitle_lang = matches.previous(subtitle_extension, lambda match: match.name == 'language', 0) + if subtitle_lang: + for weak in matches.named('subtitle_language', predicate=lambda m: 'weak-language' in m.tags): + weak.private = True + + return matches.conflicting(subtitle_lang, lambda m: m.name == 'source'), subtitle_lang + + +class RemoveLanguage(Rule): + """Remove language matches that were not converted to subtitle_language when language is disabled.""" + + consequence = RemoveMatch + + def enabled(self, context): + return is_disabled(context, 'language') + + def when(self, matches, context): + return matches.named('language') + + +class RemoveInvalidLanguages(Rule): + """Remove language matches that matches the blacklisted common words.""" + + consequence = RemoveMatch + priority = 32 + + def __init__(self, common_words): + """Constructor.""" + super(RemoveInvalidLanguages, self).__init__() + self.common_words = common_words + + def when(self, matches, context): + to_remove = [] + for match in matches.range(0, len(matches.input_string), + predicate=lambda m: m.name in ('language', 'subtitle_language')): + if match.raw.lower() not in self.common_words: + continue + + group = matches.markers.at_match(match, index=0, predicate=lambda m: m.name == 'group') + if group and ( + not matches.range( + group.start, group.end, predicate=lambda m: m.name not in ('language', 'subtitle_language') + ) and (not matches.holes(group.start, group.end, predicate=lambda m: m.value.strip(seps)))): + continue + + to_remove.append(match) + + return to_remove diff --git a/lib/guessit/rules/properties/mimetype.py b/lib/guessit/rules/properties/mimetype.py new file mode 100644 index 00000000..f9e642ff --- /dev/null +++ b/lib/guessit/rules/properties/mimetype.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +mimetype property +""" +import mimetypes + +from rebulk import Rebulk, CustomRule, POST_PROCESS +from rebulk.match import Match + +from ..common.pattern import is_disabled +from ...rules.processors import Processors + + +def mimetype(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'mimetype')) + rebulk.rules(Mimetype) + + return rebulk + + +class Mimetype(CustomRule): + """ + Mimetype post processor + :param matches: + :type matches: + :return: + :rtype: + """ + priority = POST_PROCESS + + dependency = Processors + + def when(self, matches, context): + mime, _ = mimetypes.guess_type(matches.input_string, strict=False) + return mime + + def then(self, matches, when_response, context): + mime = when_response + matches.append(Match(len(matches.input_string), len(matches.input_string), name='mimetype', value=mime)) + + @property + def properties(self): + """ + Properties for this rule. + """ + return {'mimetype': [None]} diff --git a/lib/guessit/rules/properties/other.py b/lib/guessit/rules/properties/other.py new file mode 100644 index 00000000..c7dc9a88 --- /dev/null +++ b/lib/guessit/rules/properties/other.py @@ -0,0 +1,383 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +other property +""" +import copy + +from rebulk import Rebulk, Rule, RemoveMatch, RenameMatch, POST_PROCESS, AppendMatch +from rebulk.remodule import re + +from ..common import dash +from ..common import seps +from ..common.pattern import is_disabled +from ..common.validators import seps_after, seps_before, seps_surround, and_ +from ...reutils import build_or_pattern +from ...rules.common.formatters import raw_cleanup + + +def other(config): # pylint:disable=unused-argument,too-many-statements + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'other')) + rebulk = rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]).string_defaults(ignore_case=True) + rebulk.defaults(name="other", validator=seps_surround) + + rebulk.regex('Audio-?Fix', 'Audio-?Fixed', value='Audio Fixed') + rebulk.regex('Sync-?Fix', 'Sync-?Fixed', value='Sync Fixed') + rebulk.regex('Dual', 'Dual-?Audio', value='Dual Audio') + rebulk.regex('ws', 'wide-?screen', value='Widescreen') + rebulk.regex('Re-?Enc(?:oded)?', value='Reencoded') + + rebulk.string('Repack', 'Rerip', value='Proper', + tags=['streaming_service.prefix', 'streaming_service.suffix']) + rebulk.string('Proper', value='Proper', + tags=['has-neighbor', 'streaming_service.prefix', 'streaming_service.suffix']) + + rebulk.regex('Real-Proper', 'Real-Repack', 'Real-Rerip', value='Proper', + tags=['streaming_service.prefix', 'streaming_service.suffix', 'real']) + rebulk.regex('Real', value='Proper', + tags=['has-neighbor', 'streaming_service.prefix', 'streaming_service.suffix', 'real']) + + rebulk.string('Fix', 'Fixed', value='Fix', tags=['has-neighbor-before', 'has-neighbor-after', + 'streaming_service.prefix', 'streaming_service.suffix']) + rebulk.string('Dirfix', 'Nfofix', 'Prooffix', value='Fix', + tags=['streaming_service.prefix', 'streaming_service.suffix']) + rebulk.regex('(?:Proof-?)?Sample-?Fix', value='Fix', + tags=['streaming_service.prefix', 'streaming_service.suffix']) + + rebulk.string('Fansub', value='Fan Subtitled', tags='has-neighbor') + rebulk.string('Fastsub', value='Fast Subtitled', tags='has-neighbor') + + season_words = build_or_pattern(["seasons?", "series?"]) + complete_articles = build_or_pattern(["The"]) + + def validate_complete(match): + """ + Make sure season word is are defined. + :param match: + :type match: + :return: + :rtype: + """ + children = match.children + if not children.named('completeWordsBefore') and not children.named('completeWordsAfter'): + return False + return True + + rebulk.regex('(?P<completeArticle>' + complete_articles + '-)?' + + '(?P<completeWordsBefore>' + season_words + '-)?' + + 'Complete' + '(?P<completeWordsAfter>-' + season_words + ')?', + private_names=['completeArticle', 'completeWordsBefore', 'completeWordsAfter'], + value={'other': 'Complete'}, + tags=['release-group-prefix'], + validator={'__parent__': and_(seps_surround, validate_complete)}) + rebulk.string('R5', value='Region 5') + rebulk.string('RC', value='Region C') + rebulk.regex('Pre-?Air', value='Preair') + rebulk.regex('(?:PS-?)Vita', value='PS Vita') + rebulk.regex('Vita', value='PS Vita', tags='has-neighbor') + rebulk.regex('(HD)(?P<another>Rip)', value={'other': 'HD', 'another': 'Rip'}, + private_parent=True, children=True, validator={'__parent__': seps_surround}, validate_all=True) + + for value in ('Screener', 'Remux', 'PAL', 'SECAM', 'NTSC', 'XXX'): + rebulk.string(value, value=value) + rebulk.string('3D', value='3D', tags='has-neighbor') + + rebulk.string('HQ', value='High Quality', tags='uhdbluray-neighbor') + rebulk.string('HR', value='High Resolution') + rebulk.string('LD', value='Line Dubbed') + rebulk.string('MD', value='Mic Dubbed') + rebulk.string('mHD', 'HDLight', value='Micro HD') + rebulk.string('LDTV', value='Low Definition') + rebulk.string('HFR', value='High Frame Rate') + rebulk.string('VFR', value='Variable Frame Rate') + rebulk.string('HD', value='HD', validator=None, + tags=['streaming_service.prefix', 'streaming_service.suffix']) + rebulk.regex('Full-?HD', 'FHD', value='Full HD', validator=None, + tags=['streaming_service.prefix', 'streaming_service.suffix']) + rebulk.regex('Ultra-?(?:HD)?', 'UHD', value='Ultra HD', validator=None, + tags=['streaming_service.prefix', 'streaming_service.suffix']) + rebulk.regex('Upscaled?', value='Upscaled') + + for value in ('Complete', 'Classic', 'Bonus', 'Trailer', 'Retail', + 'Colorized', 'Internal'): + rebulk.string(value, value=value, tags=['has-neighbor', 'release-group-prefix']) + rebulk.regex('LiNE', value='Line Audio', tags=['has-neighbor-before', 'has-neighbor-after', 'release-group-prefix']) + rebulk.regex('Read-?NFO', value='Read NFO') + rebulk.string('CONVERT', value='Converted', tags='has-neighbor') + rebulk.string('DOCU', 'DOKU', value='Documentary', tags='has-neighbor') + rebulk.string('OM', value='Open Matte', tags='has-neighbor') + rebulk.string('STV', value='Straight to Video', tags='has-neighbor') + rebulk.string('OAR', value='Original Aspect Ratio', tags='has-neighbor') + rebulk.string('Complet', value='Complete', tags=['has-neighbor', 'release-group-prefix']) + + for coast in ('East', 'West'): + rebulk.regex(r'(?:Live-)?(?:Episode-)?' + coast + '-?(?:Coast-)?Feed', value=coast + ' Coast Feed') + + rebulk.string('VO', 'OV', value='Original Video', tags='has-neighbor') + rebulk.string('Ova', 'Oav', value='Original Animated Video') + + rebulk.regex('Scr(?:eener)?', value='Screener', validator=None, + tags=['other.validate.screener', 'source-prefix', 'source-suffix']) + rebulk.string('Mux', value='Mux', validator=seps_after, + tags=['other.validate.mux', 'video-codec-prefix', 'source-suffix']) + rebulk.string('HC', 'vost', value='Hardcoded Subtitles') + + rebulk.string('SDR', value='Standard Dynamic Range', tags='uhdbluray-neighbor') + rebulk.regex('HDR(?:10)?', value='HDR10', tags='uhdbluray-neighbor') + rebulk.regex('Dolby-?Vision', value='Dolby Vision', tags='uhdbluray-neighbor') + rebulk.regex('BT-?2020', value='BT.2020', tags='uhdbluray-neighbor') + + rebulk.string('Sample', value='Sample', tags=['at-end', 'not-a-release-group']) + rebulk.string('Extras', value='Extras', tags='has-neighbor') + rebulk.regex('Digital-?Extras?', value='Extras') + rebulk.string('Proof', value='Proof', tags=['at-end', 'not-a-release-group']) + rebulk.string('Obfuscated', 'Scrambled', value='Obfuscated', tags=['at-end', 'not-a-release-group']) + rebulk.string('xpost', 'postbot', 'asrequested', value='Repost', tags='not-a-release-group') + + rebulk.rules(RenameAnotherToOther, ValidateHasNeighbor, ValidateHasNeighborAfter, ValidateHasNeighborBefore, + ValidateScreenerRule, ValidateMuxRule, ValidateHardcodedSubs, ValidateStreamingServiceNeighbor, + ValidateAtEnd, ValidateReal, ProperCountRule) + + return rebulk + + +class ProperCountRule(Rule): + """ + Add proper_count property + """ + priority = POST_PROCESS + + consequence = AppendMatch + + properties = {'proper_count': [None]} + + def when(self, matches, context): # pylint:disable=inconsistent-return-statements + propers = matches.named('other', lambda match: match.value == 'Proper') + if propers: + raws = {} # Count distinct raw values + for proper in propers: + raws[raw_cleanup(proper.raw)] = proper + proper_count_match = copy.copy(propers[-1]) + proper_count_match.name = 'proper_count' + + value = 0 + for raw in raws.values(): + value += 2 if 'real' in raw.tags else 1 + + proper_count_match.value = value + return proper_count_match + + +class RenameAnotherToOther(Rule): + """ + Rename `another` properties to `other` + """ + priority = 32 + consequence = RenameMatch('other') + + def when(self, matches, context): + return matches.named('another') + + +class ValidateHasNeighbor(Rule): + """ + Validate tag has-neighbor + """ + consequence = RemoveMatch + priority = 64 + + def when(self, matches, context): + ret = [] + for to_check in matches.range(predicate=lambda match: 'has-neighbor' in match.tags): + previous_match = matches.previous(to_check, index=0) + previous_group = matches.markers.previous(to_check, lambda marker: marker.name == 'group', 0) + if previous_group and (not previous_match or previous_group.end > previous_match.end): + previous_match = previous_group + if previous_match and not matches.input_string[previous_match.end:to_check.start].strip(seps): + break + next_match = matches.next(to_check, index=0) + next_group = matches.markers.next(to_check, lambda marker: marker.name == 'group', 0) + if next_group and (not next_match or next_group.start < next_match.start): + next_match = next_group + if next_match and not matches.input_string[to_check.end:next_match.start].strip(seps): + break + ret.append(to_check) + return ret + + +class ValidateHasNeighborBefore(Rule): + """ + Validate tag has-neighbor-before that previous match exists. + """ + consequence = RemoveMatch + priority = 64 + + def when(self, matches, context): + ret = [] + for to_check in matches.range(predicate=lambda match: 'has-neighbor-before' in match.tags): + next_match = matches.next(to_check, index=0) + next_group = matches.markers.next(to_check, lambda marker: marker.name == 'group', 0) + if next_group and (not next_match or next_group.start < next_match.start): + next_match = next_group + if next_match and not matches.input_string[to_check.end:next_match.start].strip(seps): + break + ret.append(to_check) + return ret + + +class ValidateHasNeighborAfter(Rule): + """ + Validate tag has-neighbor-after that next match exists. + """ + consequence = RemoveMatch + priority = 64 + + def when(self, matches, context): + ret = [] + for to_check in matches.range(predicate=lambda match: 'has-neighbor-after' in match.tags): + previous_match = matches.previous(to_check, index=0) + previous_group = matches.markers.previous(to_check, lambda marker: marker.name == 'group', 0) + if previous_group and (not previous_match or previous_group.end > previous_match.end): + previous_match = previous_group + if previous_match and not matches.input_string[previous_match.end:to_check.start].strip(seps): + break + ret.append(to_check) + return ret + + +class ValidateScreenerRule(Rule): + """ + Validate tag other.validate.screener + """ + consequence = RemoveMatch + priority = 64 + + def when(self, matches, context): + ret = [] + for screener in matches.named('other', lambda match: 'other.validate.screener' in match.tags): + source_match = matches.previous(screener, lambda match: match.initiator.name == 'source', 0) + if not source_match or matches.input_string[source_match.end:screener.start].strip(seps): + ret.append(screener) + return ret + + +class ValidateMuxRule(Rule): + """ + Validate tag other.validate.mux + """ + consequence = RemoveMatch + priority = 64 + + def when(self, matches, context): + ret = [] + for mux in matches.named('other', lambda match: 'other.validate.mux' in match.tags): + source_match = matches.previous(mux, lambda match: match.initiator.name == 'source', 0) + if not source_match: + ret.append(mux) + return ret + + +class ValidateHardcodedSubs(Rule): + """Validate HC matches.""" + + priority = 32 + consequence = RemoveMatch + + def when(self, matches, context): + to_remove = [] + for hc_match in matches.named('other', predicate=lambda match: match.value == 'Hardcoded Subtitles'): + next_match = matches.next(hc_match, predicate=lambda match: match.name == 'subtitle_language', index=0) + if next_match and not matches.holes(hc_match.end, next_match.start, + predicate=lambda match: match.value.strip(seps)): + continue + + previous_match = matches.previous(hc_match, + predicate=lambda match: match.name == 'subtitle_language', index=0) + if previous_match and not matches.holes(previous_match.end, hc_match.start, + predicate=lambda match: match.value.strip(seps)): + continue + + to_remove.append(hc_match) + + return to_remove + + +class ValidateStreamingServiceNeighbor(Rule): + """Validate streaming service's neighbors.""" + + priority = 32 + consequence = RemoveMatch + + def when(self, matches, context): + to_remove = [] + for match in matches.named('other', + predicate=lambda m: (m.initiator.name != 'source' + and ('streaming_service.prefix' in m.tags + or 'streaming_service.suffix' in m.tags))): + match = match.initiator + if not seps_after(match): + if 'streaming_service.prefix' in match.tags: + next_match = matches.next(match, lambda m: m.name == 'streaming_service', 0) + if next_match and not matches.holes(match.end, next_match.start, + predicate=lambda m: m.value.strip(seps)): + continue + if match.children: + to_remove.extend(match.children) + to_remove.append(match) + + elif not seps_before(match): + if 'streaming_service.suffix' in match.tags: + previous_match = matches.previous(match, lambda m: m.name == 'streaming_service', 0) + if previous_match and not matches.holes(previous_match.end, match.start, + predicate=lambda m: m.value.strip(seps)): + continue + + if match.children: + to_remove.extend(match.children) + to_remove.append(match) + + return to_remove + + +class ValidateAtEnd(Rule): + """Validate other which should occur at the end of a filepart.""" + + priority = 32 + consequence = RemoveMatch + + def when(self, matches, context): + to_remove = [] + for filepart in matches.markers.named('path'): + for match in matches.range(filepart.start, filepart.end, + predicate=lambda m: m.name == 'other' and 'at-end' in m.tags): + if (matches.holes(match.end, filepart.end, predicate=lambda m: m.value.strip(seps)) or + matches.range(match.end, filepart.end, predicate=lambda m: m.name not in ( + 'other', 'container'))): + to_remove.append(match) + + return to_remove + + +class ValidateReal(Rule): + """ + Validate Real + """ + consequence = RemoveMatch + priority = 64 + + def when(self, matches, context): + ret = [] + for filepart in matches.markers.named('path'): + for match in matches.range(filepart.start, filepart.end, lambda m: m.name == 'other' and 'real' in m.tags): + if not matches.range(filepart.start, match.start): + ret.append(match) + + return ret diff --git a/lib/guessit/rules/properties/part.py b/lib/guessit/rules/properties/part.py new file mode 100644 index 00000000..c1123394 --- /dev/null +++ b/lib/guessit/rules/properties/part.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +part property +""" +from rebulk.remodule import re + +from rebulk import Rebulk +from ..common import dash +from ..common.pattern import is_disabled +from ..common.validators import seps_surround, int_coercable, and_ +from ..common.numeral import numeral, parse_numeral +from ...reutils import build_or_pattern + + +def part(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'part')) + rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash], validator={'__parent__': seps_surround}) + + prefixes = config['prefixes'] + + def validate_roman(match): + """ + Validate a roman match if surrounded by separators + :param match: + :type match: + :return: + :rtype: + """ + if int_coercable(match.raw): + return True + return seps_surround(match) + + rebulk.regex(build_or_pattern(prefixes) + r'-?(?P<part>' + numeral + r')', + prefixes=prefixes, validate_all=True, private_parent=True, children=True, formatter=parse_numeral, + validator={'part': and_(validate_roman, lambda m: 0 < m.value < 100)}) + + return rebulk diff --git a/lib/guessit/rules/properties/release_group.py b/lib/guessit/rules/properties/release_group.py new file mode 100644 index 00000000..ecff808b --- /dev/null +++ b/lib/guessit/rules/properties/release_group.py @@ -0,0 +1,347 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +release_group property +""" +import copy + +from rebulk import Rebulk, Rule, AppendMatch, RemoveMatch +from rebulk.match import Match + +from ..common import seps +from ..common.comparators import marker_sorted +from ..common.expected import build_expected_function +from ..common.formatters import cleanup +from ..common.pattern import is_disabled +from ..common.validators import int_coercable, seps_surround +from ..properties.title import TitleFromPosition + + +def release_group(config): + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + forbidden_groupnames = config['forbidden_names'] + + groupname_ignore_seps = config['ignored_seps'] + groupname_seps = ''.join([c for c in seps if c not in groupname_ignore_seps]) + + def clean_groupname(string): + """ + Removes and strip separators from input_string + :param string: + :type string: + :return: + :rtype: + """ + string = string.strip(groupname_seps) + if not (string.endswith(tuple(groupname_ignore_seps)) and string.startswith(tuple(groupname_ignore_seps))) \ + and not any(i in string.strip(groupname_ignore_seps) for i in groupname_ignore_seps): + string = string.strip(groupname_ignore_seps) + for forbidden in forbidden_groupnames: + if string.lower().startswith(forbidden) and string[len(forbidden):len(forbidden) + 1] in seps: + string = string[len(forbidden):] + string = string.strip(groupname_seps) + if string.lower().endswith(forbidden) and string[-len(forbidden) - 1:-len(forbidden)] in seps: + string = string[:len(forbidden)] + string = string.strip(groupname_seps) + return string.strip() + + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'release_group')) + + expected_group = build_expected_function('expected_group') + + rebulk.functional(expected_group, name='release_group', tags=['expected'], + validator=seps_surround, + conflict_solver=lambda match, other: other, + disabled=lambda context: not context.get('expected_group')) + + return rebulk.rules( + DashSeparatedReleaseGroup(clean_groupname), + SceneReleaseGroup(clean_groupname), + AnimeReleaseGroup + ) + + +_scene_previous_names = ('video_codec', 'source', 'video_api', 'audio_codec', 'audio_profile', 'video_profile', + 'audio_channels', 'screen_size', 'other', 'container', 'language', 'subtitle_language', + 'subtitle_language.suffix', 'subtitle_language.prefix', 'language.suffix') + +_scene_previous_tags = ('release-group-prefix',) + +_scene_no_previous_tags = ('no-release-group-prefix',) + + +class DashSeparatedReleaseGroup(Rule): + """ + Detect dash separated release groups that might appear at the end or at the beginning of a release name. + + Series.S01E02.Pilot.DVDRip.x264-CS.mkv + release_group: CS + abc-the.title.name.1983.1080p.bluray.x264.mkv + release_group: abc + + At the end: Release groups should be dash-separated and shouldn't contain spaces nor + appear in a group with other matches. The preceding matches should be separated by dot. + If a release group is found, the conflicting matches are removed. + + At the beginning: Release groups should be dash-separated and shouldn't contain spaces nor appear in a group. + It should be followed by a hole with dot-separated words. + Detection only happens if no matches exist at the beginning. + """ + consequence = [RemoveMatch, AppendMatch] + + def __init__(self, value_formatter): + """Default constructor.""" + super(DashSeparatedReleaseGroup, self).__init__() + self.value_formatter = value_formatter + + @classmethod + def is_valid(cls, matches, candidate, start, end, at_end): # pylint:disable=inconsistent-return-statements + """ + Whether a candidate is a valid release group. + """ + if not at_end: + if len(candidate.value) <= 1: + return False + + if matches.markers.at_match(candidate, predicate=lambda m: m.name == 'group'): + return False + + first_hole = matches.holes(candidate.end, end, predicate=lambda m: m.start == candidate.end, index=0) + if not first_hole: + return False + + raw_value = first_hole.raw + return raw_value[0] == '-' and '-' not in raw_value[1:] and '.' in raw_value and ' ' not in raw_value + + group = matches.markers.at_match(candidate, predicate=lambda m: m.name == 'group', index=0) + if group and matches.at_match(group, predicate=lambda m: not m.private and m.span != candidate.span): + return False + + count = 0 + match = candidate + while match: + current = matches.range(start, + match.start, + index=-1, + predicate=lambda m: not m.private and not 'expected' in m.tags) + if not current: + break + + separator = match.input_string[current.end:match.start] + if not separator and match.raw[0] == '-': + separator = '-' + + match = current + + if count == 0: + if separator != '-': + break + + count += 1 + continue + + if separator == '.': + return True + + def detect(self, matches, start, end, at_end): # pylint:disable=inconsistent-return-statements + """ + Detect release group at the end or at the beginning of a filepart. + """ + candidate = None + if at_end: + container = matches.ending(end, lambda m: m.name == 'container', index=0) + if container: + end = container.start + + candidate = matches.ending(end, index=0, predicate=( + lambda m: not m.private and not ( + m.name == 'other' and 'not-a-release-group' in m.tags + ) and '-' not in m.raw and m.raw.strip() == m.raw)) + + if not candidate: + if at_end: + candidate = matches.holes(start, end, seps=seps, index=-1, + predicate=lambda m: m.end == end and m.raw.strip(seps) and m.raw[0] == '-') + else: + candidate = matches.holes(start, end, seps=seps, index=0, + predicate=lambda m: m.start == start and m.raw.strip(seps)) + + if candidate and self.is_valid(matches, candidate, start, end, at_end): + return candidate + + def when(self, matches, context): # pylint:disable=inconsistent-return-statements + if matches.named('release_group'): + return + + to_remove = [] + to_append = [] + for filepart in matches.markers.named('path'): + candidate = self.detect(matches, filepart.start, filepart.end, True) + if candidate: + to_remove.extend(matches.at_match(candidate)) + else: + candidate = self.detect(matches, filepart.start, filepart.end, False) + + if candidate: + releasegroup = Match(candidate.start, candidate.end, name='release_group', + formatter=self.value_formatter, input_string=candidate.input_string) + + if releasegroup.value: + to_append.append(releasegroup) + if to_remove or to_append: + return to_remove, to_append + + +class SceneReleaseGroup(Rule): + """ + Add release_group match in existing matches (scene format). + + Something.XViD-ReleaseGroup.mkv + """ + dependency = [TitleFromPosition] + consequence = AppendMatch + + properties = {'release_group': [None]} + + def __init__(self, value_formatter): + """Default constructor.""" + super(SceneReleaseGroup, self).__init__() + self.value_formatter = value_formatter + + @staticmethod + def is_previous_match(match): + """ + Check if match can precede release_group + + :param match: + :return: + """ + return not match.tagged(*_scene_no_previous_tags) if match.name in _scene_previous_names else \ + match.tagged(*_scene_previous_tags) + + def when(self, matches, context): # pylint:disable=too-many-locals + # If a release_group is found before, ignore this kind of release_group rule. + + ret = [] + + for filepart in marker_sorted(matches.markers.named('path'), matches): + # pylint:disable=cell-var-from-loop + start, end = filepart.span + if matches.named('release_group', predicate=lambda m: m.start >= start and m.end <= end): + continue + + titles = matches.named('title', predicate=lambda m: m.start >= start and m.end <= end) + + def keep_only_first_title(match): + """ + Keep only first title from this filepart, as other ones are most likely release group. + + :param match: + :type match: + :return: + :rtype: + """ + return match in titles[1:] + + last_hole = matches.holes(start, end + 1, formatter=self.value_formatter, + ignore=keep_only_first_title, + predicate=lambda hole: cleanup(hole.value), index=-1) + + if last_hole: + def previous_match_filter(match): + """ + Filter to apply to find previous match + + :param match: + :type match: + :return: + :rtype: + """ + + if match.start < filepart.start: + return False + return not match.private or self.is_previous_match(match) + + previous_match = matches.previous(last_hole, + previous_match_filter, + index=0) + if previous_match and (self.is_previous_match(previous_match)) and \ + not matches.input_string[previous_match.end:last_hole.start].strip(seps) \ + and not int_coercable(last_hole.value.strip(seps)): + + last_hole.name = 'release_group' + last_hole.tags = ['scene'] + + # if hole is inside a group marker with same value, remove [](){} ... + group = matches.markers.at_match(last_hole, lambda marker: marker.name == 'group', 0) + if group: + group.formatter = self.value_formatter + if group.value == last_hole.value: + last_hole.start = group.start + 1 + last_hole.end = group.end - 1 + last_hole.tags = ['anime'] + + ignored_matches = matches.range(last_hole.start, last_hole.end, keep_only_first_title) + + for ignored_match in ignored_matches: + matches.remove(ignored_match) + + ret.append(last_hole) + return ret + + +class AnimeReleaseGroup(Rule): + """ + Add release_group match in existing matches (anime format) + ...[ReleaseGroup] Something.mkv + """ + dependency = [SceneReleaseGroup, TitleFromPosition] + consequence = [RemoveMatch, AppendMatch] + + properties = {'release_group': [None]} + + def when(self, matches, context): + to_remove = [] + to_append = [] + + # If a release_group is found before, ignore this kind of release_group rule. + if matches.named('release_group'): + return False + + if not matches.named('episode') and not matches.named('season') and matches.named('release_group'): + # This doesn't seems to be an anime, and we already found another release_group. + return False + + for filepart in marker_sorted(matches.markers.named('path'), matches): + + # pylint:disable=bad-continuation + empty_group = matches.markers.range(filepart.start, + filepart.end, + lambda marker: (marker.name == 'group' + and not matches.range(marker.start, marker.end, + lambda m: + 'weak-language' not in m.tags) + and marker.value.strip(seps) + and not int_coercable(marker.value.strip(seps))), 0) + + if empty_group: + group = copy.copy(empty_group) + group.marker = False + group.raw_start += 1 + group.raw_end -= 1 + group.tags = ['anime'] + group.name = 'release_group' + to_append.append(group) + to_remove.extend(matches.range(empty_group.start, empty_group.end, + lambda m: 'weak-language' in m.tags)) + + if to_remove or to_append: + return to_remove, to_append + return False diff --git a/lib/guessit/rules/properties/screen_size.py b/lib/guessit/rules/properties/screen_size.py new file mode 100644 index 00000000..77d5d052 --- /dev/null +++ b/lib/guessit/rules/properties/screen_size.py @@ -0,0 +1,163 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +screen_size property +""" +from rebulk.match import Match +from rebulk.remodule import re + +from rebulk import Rebulk, Rule, RemoveMatch, AppendMatch + +from ..common.pattern import is_disabled +from ..common.quantity import FrameRate +from ..common.validators import seps_surround +from ..common import dash, seps +from ...reutils import build_or_pattern + + +def screen_size(config): + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + interlaced = frozenset(config['interlaced']) + progressive = frozenset(config['progressive']) + frame_rates = [re.escape(rate) for rate in config['frame_rates']] + min_ar = config['min_ar'] + max_ar = config['max_ar'] + + rebulk = Rebulk() + rebulk = rebulk.string_defaults(ignore_case=True).regex_defaults(flags=re.IGNORECASE) + + rebulk.defaults(name='screen_size', validator=seps_surround, abbreviations=[dash], + disabled=lambda context: is_disabled(context, 'screen_size')) + + frame_rate_pattern = build_or_pattern(frame_rates, name='frame_rate') + interlaced_pattern = build_or_pattern(interlaced, name='height') + progressive_pattern = build_or_pattern(progressive, name='height') + + res_pattern = r'(?:(?P<width>\d{3,4})(?:x|\*))?' + rebulk.regex(res_pattern + interlaced_pattern + r'(?P<scan_type>i)' + frame_rate_pattern + '?') + rebulk.regex(res_pattern + progressive_pattern + r'(?P<scan_type>p)' + frame_rate_pattern + '?') + rebulk.regex(res_pattern + progressive_pattern + r'(?P<scan_type>p)?(?:hd)') + rebulk.regex(res_pattern + progressive_pattern + r'(?P<scan_type>p)?x?') + rebulk.string('4k', value='2160p') + rebulk.regex(r'(?P<width>\d{3,4})-?(?:x|\*)-?(?P<height>\d{3,4})', + conflict_solver=lambda match, other: '__default__' if other.name == 'screen_size' else other) + + rebulk.regex(frame_rate_pattern + '(p|fps)', name='frame_rate', + formatter=FrameRate.fromstring, disabled=lambda context: is_disabled(context, 'frame_rate')) + + rebulk.rules(PostProcessScreenSize(progressive, min_ar, max_ar), ScreenSizeOnlyOne, ResolveScreenSizeConflicts) + + return rebulk + + +class PostProcessScreenSize(Rule): + """ + Process the screen size calculating the aspect ratio if available. + + Convert to a standard notation (720p, 1080p, etc) when it's a standard resolution and + aspect ratio is valid or not available. + + It also creates an aspect_ratio match when available. + """ + consequence = AppendMatch + + def __init__(self, standard_heights, min_ar, max_ar): + super(PostProcessScreenSize, self).__init__() + self.standard_heights = standard_heights + self.min_ar = min_ar + self.max_ar = max_ar + + def when(self, matches, context): + to_append = [] + for match in matches.named('screen_size'): + if not is_disabled(context, 'frame_rate'): + for frame_rate in match.children.named('frame_rate'): + frame_rate.formatter = FrameRate.fromstring + to_append.append(frame_rate) + + values = match.children.to_dict() + if 'height' not in values: + continue + + scan_type = (values.get('scan_type') or 'p').lower() + height = values['height'] + if 'width' not in values: + match.value = '{0}{1}'.format(height, scan_type) + continue + + width = values['width'] + calculated_ar = float(width) / float(height) + + aspect_ratio = Match(match.start, match.end, input_string=match.input_string, + name='aspect_ratio', value=round(calculated_ar, 3)) + + if not is_disabled(context, 'aspect_ratio'): + to_append.append(aspect_ratio) + + if height in self.standard_heights and self.min_ar < calculated_ar < self.max_ar: + match.value = '{0}{1}'.format(height, scan_type) + else: + match.value = '{0}x{1}'.format(width, height) + + return to_append + + +class ScreenSizeOnlyOne(Rule): + """ + Keep a single screen_size per filepath part. + """ + consequence = RemoveMatch + + def when(self, matches, context): + to_remove = [] + for filepart in matches.markers.named('path'): + screensize = list(reversed(matches.range(filepart.start, filepart.end, + lambda match: match.name == 'screen_size'))) + if len(screensize) > 1 and len(set((match.value for match in screensize))) > 1: + to_remove.extend(screensize[1:]) + + return to_remove + + +class ResolveScreenSizeConflicts(Rule): + """ + Resolve screen_size conflicts with season and episode matches. + """ + consequence = RemoveMatch + + def when(self, matches, context): + to_remove = [] + for filepart in matches.markers.named('path'): + screensize = matches.range(filepart.start, filepart.end, lambda match: match.name == 'screen_size', 0) + if not screensize: + continue + + conflicts = matches.conflicting(screensize, lambda match: match.name in ('season', 'episode')) + if not conflicts: + continue + + has_neighbor = False + video_profile = matches.range(screensize.end, filepart.end, lambda match: match.name == 'video_profile', 0) + if video_profile and not matches.holes(screensize.end, video_profile.start, + predicate=lambda h: h.value and h.value.strip(seps)): + to_remove.extend(conflicts) + has_neighbor = True + + previous = matches.previous(screensize, index=0, predicate=( + lambda m: m.name in ('date', 'source', 'other', 'streaming_service'))) + if previous and not matches.holes(previous.end, screensize.start, + predicate=lambda h: h.value and h.value.strip(seps)): + to_remove.extend(conflicts) + has_neighbor = True + + if not has_neighbor: + to_remove.append(screensize) + + return to_remove diff --git a/lib/guessit/rules/properties/size.py b/lib/guessit/rules/properties/size.py new file mode 100644 index 00000000..c61580c0 --- /dev/null +++ b/lib/guessit/rules/properties/size.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +size property +""" +import re + +from rebulk import Rebulk + +from ..common import dash +from ..common.quantity import Size +from ..common.pattern import is_disabled +from ..common.validators import seps_surround + + +def size(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'size')) + rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) + rebulk.defaults(name='size', validator=seps_surround) + rebulk.regex(r'\d+-?[mgt]b', r'\d+\.\d+-?[mgt]b', formatter=Size.fromstring, tags=['release-group-prefix']) + + return rebulk diff --git a/lib/guessit/rules/properties/source.py b/lib/guessit/rules/properties/source.py new file mode 100644 index 00000000..2fe55618 --- /dev/null +++ b/lib/guessit/rules/properties/source.py @@ -0,0 +1,235 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +source property +""" +import copy + +from rebulk.remodule import re + +from rebulk import AppendMatch, Rebulk, RemoveMatch, Rule + +from .audio_codec import HqConflictRule +from ..common import dash, seps +from ..common.pattern import is_disabled +from ..common.validators import seps_before, seps_after, or_ + + +def source(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'source')) + rebulk = rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash], private_parent=True, children=True) + rebulk = rebulk.defaults(name='source', + tags=['video-codec-prefix', 'streaming_service.suffix'], + validate_all=True, + validator={'__parent__': or_(seps_before, seps_after)}) + + rip_prefix = '(?P<other>Rip)-?' + rip_suffix = '-?(?P<other>Rip)' + rip_optional_suffix = '(?:' + rip_suffix + ')?' + + def build_source_pattern(*patterns, **kwargs): + """Helper pattern to build source pattern.""" + prefix_format = kwargs.get('prefix') or '' + suffix_format = kwargs.get('suffix') or '' + + string_format = prefix_format + '({0})' + suffix_format + return [string_format.format(pattern) for pattern in patterns] + + def demote_other(match, other): # pylint: disable=unused-argument + """Default conflict solver with 'other' property.""" + return other if other.name == 'other' or other.name == 'release_group' else '__default__' + + rebulk.regex(*build_source_pattern('VHS', suffix=rip_optional_suffix), + value={'source': 'VHS', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('CAM', suffix=rip_optional_suffix), + value={'source': 'Camera', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('HD-?CAM', suffix=rip_optional_suffix), + value={'source': 'HD Camera', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('TELESYNC', 'TS', suffix=rip_optional_suffix), + value={'source': 'Telesync', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('HD-?TELESYNC', 'HD-?TS', suffix=rip_optional_suffix), + value={'source': 'HD Telesync', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('WORKPRINT', 'WP'), value='Workprint') + rebulk.regex(*build_source_pattern('TELECINE', 'TC', suffix=rip_optional_suffix), + value={'source': 'Telecine', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('HD-?TELECINE', 'HD-?TC', suffix=rip_optional_suffix), + value={'source': 'HD Telecine', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('PPV', suffix=rip_optional_suffix), + value={'source': 'Pay-per-view', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('SD-?TV', suffix=rip_optional_suffix), + value={'source': 'TV', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('TV', suffix=rip_suffix), # TV is too common to allow matching + value={'source': 'TV', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('TV', 'SD-?TV', prefix=rip_prefix), + value={'source': 'TV', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('TV-?(?=Dub)'), value='TV') + rebulk.regex(*build_source_pattern('DVB', 'PD-?TV', suffix=rip_optional_suffix), + value={'source': 'Digital TV', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('DVD', suffix=rip_optional_suffix), + value={'source': 'DVD', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('DM', suffix=rip_optional_suffix), + value={'source': 'Digital Master', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('VIDEO-?TS', 'DVD-?R(?:$|(?!E))', # 'DVD-?R(?:$|^E)' => DVD-Real ... + 'DVD-?9', 'DVD-?5'), value='DVD') + + rebulk.regex(*build_source_pattern('HD-?TV', suffix=rip_optional_suffix), conflict_solver=demote_other, + value={'source': 'HDTV', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('TV-?HD', suffix=rip_suffix), conflict_solver=demote_other, + value={'source': 'HDTV', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('TV', suffix='-?(?P<other>Rip-?HD)'), conflict_solver=demote_other, + value={'source': 'HDTV', 'other': 'Rip'}) + + rebulk.regex(*build_source_pattern('VOD', suffix=rip_optional_suffix), + value={'source': 'Video on Demand', 'other': 'Rip'}) + + rebulk.regex(*build_source_pattern('WEB', 'WEB-?DL', suffix=rip_suffix), + value={'source': 'Web', 'other': 'Rip'}) + # WEBCap is a synonym to WEBRip, mostly used by non english + rebulk.regex(*build_source_pattern('WEB-?(?P<another>Cap)', suffix=rip_optional_suffix), + value={'source': 'Web', 'other': 'Rip', 'another': 'Rip'}) + rebulk.regex(*build_source_pattern('WEB-?DL', 'WEB-?U?HD', 'DL-?WEB', 'DL(?=-?Mux)'), + value={'source': 'Web'}) + rebulk.regex('(WEB)', value='Web', tags='weak.source') + + rebulk.regex(*build_source_pattern('HD-?DVD', suffix=rip_optional_suffix), + value={'source': 'HD-DVD', 'other': 'Rip'}) + + rebulk.regex(*build_source_pattern('Blu-?ray', 'BD', 'BD[59]', 'BD25', 'BD50', suffix=rip_optional_suffix), + value={'source': 'Blu-ray', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('(?P<another>BR)-?(?=Scr(?:eener)?)', '(?P<another>BR)-?(?=Mux)'), # BRRip + value={'source': 'Blu-ray', 'another': 'Reencoded'}) + rebulk.regex(*build_source_pattern('(?P<another>BR)', suffix=rip_suffix), # BRRip + value={'source': 'Blu-ray', 'other': 'Rip', 'another': 'Reencoded'}) + + rebulk.regex(*build_source_pattern('Ultra-?Blu-?ray', 'Blu-?ray-?Ultra'), value='Ultra HD Blu-ray') + + rebulk.regex(*build_source_pattern('AHDTV'), value='Analog HDTV') + rebulk.regex(*build_source_pattern('UHD-?TV', suffix=rip_optional_suffix), conflict_solver=demote_other, + value={'source': 'Ultra HDTV', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('UHD', suffix=rip_suffix), conflict_solver=demote_other, + value={'source': 'Ultra HDTV', 'other': 'Rip'}) + + rebulk.regex(*build_source_pattern('DSR', 'DTH', suffix=rip_optional_suffix), + value={'source': 'Satellite', 'other': 'Rip'}) + rebulk.regex(*build_source_pattern('DSR?', 'SAT', suffix=rip_suffix), + value={'source': 'Satellite', 'other': 'Rip'}) + + rebulk.rules(ValidateSourcePrefixSuffix, ValidateWeakSource, UltraHdBlurayRule) + + return rebulk + + +class UltraHdBlurayRule(Rule): + """ + Replace other:Ultra HD and source:Blu-ray with source:Ultra HD Blu-ray + """ + dependency = HqConflictRule + consequence = [RemoveMatch, AppendMatch] + + @classmethod + def find_ultrahd(cls, matches, start, end, index): + """Find Ultra HD match.""" + return matches.range(start, end, index=index, predicate=( + lambda m: not m.private and m.name == 'other' and m.value == 'Ultra HD' + )) + + @classmethod + def validate_range(cls, matches, start, end): + """Validate no holes or invalid matches exist in the specified range.""" + return ( + not matches.holes(start, end, predicate=lambda m: m.value.strip(seps)) and + not matches.range(start, end, predicate=( + lambda m: not m.private and ( + m.name not in ('screen_size', 'color_depth') and ( + m.name != 'other' or 'uhdbluray-neighbor' not in m.tags)))) + ) + + def when(self, matches, context): + to_remove = [] + to_append = [] + for filepart in matches.markers.named('path'): + for match in matches.range(filepart.start, filepart.end, predicate=( + lambda m: not m.private and m.name == 'source' and m.value == 'Blu-ray')): + other = self.find_ultrahd(matches, filepart.start, match.start, -1) + if not other or not self.validate_range(matches, other.end, match.start): + other = self.find_ultrahd(matches, match.end, filepart.end, 0) + if not other or not self.validate_range(matches, match.end, other.start): + if not matches.range(filepart.start, filepart.end, predicate=( + lambda m: m.name == 'screen_size' and m.value == '2160p')): + continue + + if other: + other.private = True + + new_source = copy.copy(match) + new_source.value = 'Ultra HD Blu-ray' + to_remove.append(match) + to_append.append(new_source) + + if to_remove or to_append: + return to_remove, to_append + return False + + +class ValidateSourcePrefixSuffix(Rule): + """ + Validate source with source prefix, source suffix. + """ + priority = 64 + consequence = RemoveMatch + + def when(self, matches, context): + ret = [] + for filepart in matches.markers.named('path'): + for match in matches.range(filepart.start, filepart.end, predicate=lambda m: m.name == 'source'): + match = match.initiator + if not seps_before(match) and \ + not matches.range(match.start - 1, match.start - 2, + lambda m: 'source-prefix' in m.tags): + if match.children: + ret.extend(match.children) + ret.append(match) + continue + if not seps_after(match) and \ + not matches.range(match.end, match.end + 1, + lambda m: 'source-suffix' in m.tags): + if match.children: + ret.extend(match.children) + ret.append(match) + continue + + return ret + + +class ValidateWeakSource(Rule): + """ + Validate weak source + """ + dependency = [ValidateSourcePrefixSuffix] + priority = 64 + consequence = RemoveMatch + + def when(self, matches, context): + ret = [] + for filepart in matches.markers.named('path'): + for match in matches.range(filepart.start, filepart.end, predicate=lambda m: m.name == 'source'): + # if there are more than 1 source in this filepart, just before the year and with holes for the title + # most likely the source is part of the title + if 'weak.source' in match.tags \ + and matches.range(match.end, filepart.end, predicate=lambda m: m.name == 'source') \ + and matches.holes(filepart.start, match.start, + predicate=lambda m: m.value.strip(seps), index=-1): + if match.children: + ret.extend(match.children) + ret.append(match) + continue + + return ret diff --git a/lib/guessit/rules/properties/streaming_service.py b/lib/guessit/rules/properties/streaming_service.py new file mode 100644 index 00000000..f467f20a --- /dev/null +++ b/lib/guessit/rules/properties/streaming_service.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +streaming_service property +""" +import re + +from rebulk import Rebulk +from rebulk.rules import Rule, RemoveMatch + +from ..common.pattern import is_disabled +from ...rules.common import seps, dash +from ...rules.common.validators import seps_before, seps_after + + +def streaming_service(config): # pylint: disable=too-many-statements,unused-argument + """Streaming service property. + + :param config: rule configuration + :type config: dict + :return: + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'streaming_service')) + rebulk = rebulk.string_defaults(ignore_case=True).regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]) + rebulk.defaults(name='streaming_service', tags=['source-prefix']) + + for value, items in config.items(): + patterns = items if isinstance(items, list) else [items] + for pattern in patterns: + if pattern.startswith('re:'): + rebulk.regex(pattern, value=value) + else: + rebulk.string(pattern, value=value) + + rebulk.rules(ValidateStreamingService) + + return rebulk + + +class ValidateStreamingService(Rule): + """Validate streaming service matches.""" + + priority = 128 + consequence = RemoveMatch + + def when(self, matches, context): + """Streaming service is always before source. + + :param matches: + :type matches: rebulk.match.Matches + :param context: + :type context: dict + :return: + """ + to_remove = [] + for service in matches.named('streaming_service'): + next_match = matches.next(service, lambda match: 'streaming_service.suffix' in match.tags, 0) + previous_match = matches.previous(service, lambda match: 'streaming_service.prefix' in match.tags, 0) + has_other = service.initiator and service.initiator.children.named('other') + + if not has_other: + if (not next_match or + matches.holes(service.end, next_match.start, + predicate=lambda match: match.value.strip(seps)) or + not seps_before(service)): + if (not previous_match or + matches.holes(previous_match.end, service.start, + predicate=lambda match: match.value.strip(seps)) or + not seps_after(service)): + to_remove.append(service) + continue + + if service.value == 'Comedy Central': + # Current match is a valid streaming service, removing invalid Criterion Collection (CC) matches + to_remove.extend(matches.named('edition', predicate=lambda match: match.value == 'Criterion')) + + return to_remove diff --git a/lib/guessit/rules/properties/title.py b/lib/guessit/rules/properties/title.py new file mode 100644 index 00000000..0d263016 --- /dev/null +++ b/lib/guessit/rules/properties/title.py @@ -0,0 +1,349 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +title property +""" + +from rebulk import Rebulk, Rule, AppendMatch, RemoveMatch, AppendTags +from rebulk.formatters import formatters + +from .film import FilmTitleRule +from .language import ( + SubtitlePrefixLanguageRule, + SubtitleSuffixLanguageRule, + SubtitleExtensionRule, + NON_SPECIFIC_LANGUAGES +) +from ..common import seps, title_seps +from ..common.comparators import marker_sorted +from ..common.expected import build_expected_function +from ..common.formatters import cleanup, reorder_title +from ..common.pattern import is_disabled +from ..common.validators import seps_surround + + +def title(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'title')) + rebulk.rules(TitleFromPosition, PreferTitleWithYear) + + expected_title = build_expected_function('expected_title') + + rebulk.functional(expected_title, name='title', tags=['expected', 'title'], + validator=seps_surround, + formatter=formatters(cleanup, reorder_title), + conflict_solver=lambda match, other: other, + disabled=lambda context: not context.get('expected_title')) + + return rebulk + + +class TitleBaseRule(Rule): + """ + Add title match in existing matches + """ + # pylint:disable=no-self-use,unused-argument + consequence = [AppendMatch, RemoveMatch] + + def __init__(self, match_name, match_tags=None, alternative_match_name=None): + super(TitleBaseRule, self).__init__() + self.match_name = match_name + self.match_tags = match_tags + self.alternative_match_name = alternative_match_name + + def hole_filter(self, hole, matches): + """ + Filter holes for titles. + :param hole: + :type hole: + :param matches: + :type matches: + :return: + :rtype: + """ + return True + + def filepart_filter(self, filepart, matches): + """ + Filter filepart for titles. + :param filepart: + :type filepart: + :param matches: + :type matches: + :return: + :rtype: + """ + return True + + def holes_process(self, holes, matches): + """ + process holes + :param holes: + :type holes: + :param matches: + :type matches: + :return: + :rtype: + """ + cropped_holes = [] + group_markers = matches.markers.named('group') + for group_marker in group_markers: + path_marker = matches.markers.at_match(group_marker, predicate=lambda m: m.name == 'path', index=0) + if path_marker and path_marker.span == group_marker.span: + group_markers.remove(group_marker) + + for hole in holes: + cropped_holes.extend(hole.crop(group_markers)) + + return cropped_holes + + @staticmethod + def is_ignored(match): + """ + Ignore matches when scanning for title (hole). + + Full word language and countries won't be ignored if they are uppercase. + """ + return not (len(match) > 3 and match.raw.isupper()) and match.name in ('language', 'country', 'episode_details') + + def should_keep(self, match, to_keep, matches, filepart, hole, starting): + """ + Check if this match should be accepted when ending or starting a hole. + :param match: + :type match: + :param to_keep: + :type to_keep: list[Match] + :param matches: + :type matches: Matches + :param hole: the filepart match + :type hole: Match + :param hole: the hole match + :type hole: Match + :param starting: true if match is starting the hole + :type starting: bool + :return: + :rtype: + """ + if match.name in ('language', 'country'): + # Keep language if exactly matching the hole. + if len(hole.value) == len(match.raw): + return True + + # Keep language if other languages exists in the filepart. + outside_matches = filepart.crop(hole) + other_languages = [] + for outside in outside_matches: + other_languages.extend(matches.range(outside.start, outside.end, + lambda c_match: c_match.name == match.name and + c_match not in to_keep and + c_match.value not in NON_SPECIFIC_LANGUAGES)) + + if not other_languages and (not starting or len(match.raw) <= 3): + return True + + return False + + def should_remove(self, match, matches, filepart, hole, context): + """ + Check if this match should be removed after beeing ignored. + :param match: + :param matches: + :param filepart: + :param hole: + :return: + """ + if context.get('type') == 'episode' and match.name == 'episode_details': + return match.start >= hole.start and match.end <= hole.end + return True + + def check_titles_in_filepart(self, filepart, matches, context): # pylint:disable=inconsistent-return-statements + """ + Find title in filepart (ignoring language) + """ + # pylint:disable=too-many-locals,too-many-branches,too-many-statements + start, end = filepart.span + + holes = matches.holes(start, end + 1, formatter=formatters(cleanup, reorder_title), + ignore=self.is_ignored, + predicate=lambda m: m.value) + + holes = self.holes_process(holes, matches) + + for hole in holes: + if not hole or (self.hole_filter and not self.hole_filter(hole, matches)): + continue + + to_remove = [] + to_keep = [] + + ignored_matches = matches.range(hole.start, hole.end, self.is_ignored) + + if ignored_matches: + for ignored_match in reversed(ignored_matches): + # pylint:disable=undefined-loop-variable, cell-var-from-loop + trailing = matches.chain_before(hole.end, seps, predicate=lambda m: m == ignored_match) + if trailing: + should_keep = self.should_keep(ignored_match, to_keep, matches, filepart, hole, False) + if should_keep: + # pylint:disable=unpacking-non-sequence + try: + append, crop = should_keep + except TypeError: + append, crop = should_keep, should_keep + if append: + to_keep.append(ignored_match) + if crop: + hole.end = ignored_match.start + + for ignored_match in ignored_matches: + if ignored_match not in to_keep: + starting = matches.chain_after(hole.start, seps, + predicate=lambda m: m == ignored_match) + if starting: + should_keep = self.should_keep(ignored_match, to_keep, matches, filepart, hole, True) + if should_keep: + # pylint:disable=unpacking-non-sequence + try: + append, crop = should_keep + except TypeError: + append, crop = should_keep, should_keep + if append: + to_keep.append(ignored_match) + if crop: + hole.start = ignored_match.end + + for match in ignored_matches: + if self.should_remove(match, matches, filepart, hole, context): + to_remove.append(match) + for keep_match in to_keep: + if keep_match in to_remove: + to_remove.remove(keep_match) + + if hole and hole.value: + hole.name = self.match_name + hole.tags = self.match_tags + if self.alternative_match_name: + # Split and keep values that can be a title + titles = hole.split(title_seps, lambda m: m.value) + for title_match in list(titles[1:]): + previous_title = titles[titles.index(title_match) - 1] + separator = matches.input_string[previous_title.end:title_match.start] + if len(separator) == 1 and separator == '-' \ + and previous_title.raw[-1] not in seps \ + and title_match.raw[0] not in seps: + titles[titles.index(title_match) - 1].end = title_match.end + titles.remove(title_match) + else: + title_match.name = self.alternative_match_name + + else: + titles = [hole] + return titles, to_remove + + def when(self, matches, context): + ret = [] + to_remove = [] + + if matches.named(self.match_name, lambda match: 'expected' in match.tags): + return False + + fileparts = [filepart for filepart in list(marker_sorted(matches.markers.named('path'), matches)) + if not self.filepart_filter or self.filepart_filter(filepart, matches)] + + # Priorize fileparts containing the year + years_fileparts = [] + for filepart in fileparts: + year_match = matches.range(filepart.start, filepart.end, lambda match: match.name == 'year', 0) + if year_match: + years_fileparts.append(filepart) + + for filepart in fileparts: + try: + years_fileparts.remove(filepart) + except ValueError: + pass + titles = self.check_titles_in_filepart(filepart, matches, context) + if titles: + titles, to_remove_c = titles + ret.extend(titles) + to_remove.extend(to_remove_c) + break + + # Add title match in all fileparts containing the year. + for filepart in years_fileparts: + titles = self.check_titles_in_filepart(filepart, matches, context) + if titles: + # pylint:disable=unbalanced-tuple-unpacking + titles, to_remove_c = titles + ret.extend(titles) + to_remove.extend(to_remove_c) + + if ret or to_remove: + return ret, to_remove + return False + + +class TitleFromPosition(TitleBaseRule): + """ + Add title match in existing matches + """ + dependency = [FilmTitleRule, SubtitlePrefixLanguageRule, SubtitleSuffixLanguageRule, SubtitleExtensionRule] + + properties = {'title': [None], 'alternative_title': [None]} + + def __init__(self): + super(TitleFromPosition, self).__init__('title', ['title'], 'alternative_title') + + def enabled(self, context): + return not is_disabled(context, 'alternative_title') + + +class PreferTitleWithYear(Rule): + """ + Prefer title where filepart contains year. + """ + dependency = TitleFromPosition + consequence = [RemoveMatch, AppendTags(['equivalent-ignore'])] + + properties = {'title': [None]} + + def when(self, matches, context): + with_year_in_group = [] + with_year = [] + titles = matches.named('title') + + for title_match in titles: + filepart = matches.markers.at_match(title_match, lambda marker: marker.name == 'path', 0) + if filepart: + year_match = matches.range(filepart.start, filepart.end, lambda match: match.name == 'year', 0) + if year_match: + group = matches.markers.at_match(year_match, lambda m: m.name == 'group') + if group: + with_year_in_group.append(title_match) + else: + with_year.append(title_match) + + to_tag = [] + if with_year_in_group: + title_values = {title_match.value for title_match in with_year_in_group} + to_tag.extend(with_year_in_group) + elif with_year: + title_values = {title_match.value for title_match in with_year} + to_tag.extend(with_year) + else: + title_values = {title_match.value for title_match in titles} + + to_remove = [] + for title_match in titles: + if title_match.value not in title_values: + to_remove.append(title_match) + if to_remove or to_tag: + return to_remove, to_tag + return False diff --git a/lib/guessit/rules/properties/type.py b/lib/guessit/rules/properties/type.py new file mode 100644 index 00000000..6a2877ef --- /dev/null +++ b/lib/guessit/rules/properties/type.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +type property +""" +from rebulk import CustomRule, Rebulk, POST_PROCESS +from rebulk.match import Match + +from ..common.pattern import is_disabled +from ...rules.processors import Processors + + +def _type(matches, value): + """ + Define type match with given value. + :param matches: + :param value: + :return: + """ + matches.append(Match(len(matches.input_string), len(matches.input_string), name='type', value=value)) + + +def type_(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'type')) + rebulk = rebulk.rules(TypeProcessor) + + return rebulk + + +class TypeProcessor(CustomRule): + """ + Post processor to find file type based on all others found matches. + """ + priority = POST_PROCESS + + dependency = Processors + + properties = {'type': ['episode', 'movie']} + + def when(self, matches, context): # pylint:disable=too-many-return-statements + option_type = context.get('type', None) + if option_type: + return option_type + + episode = matches.named('episode') + season = matches.named('season') + absolute_episode = matches.named('absolute_episode') + episode_details = matches.named('episode_details') + + if episode or season or episode_details or absolute_episode: + return 'episode' + + film = matches.named('film') + if film: + return 'movie' + + year = matches.named('year') + date = matches.named('date') + + if date and not year: + return 'episode' + + bonus = matches.named('bonus') + if bonus and not year: + return 'episode' + + crc32 = matches.named('crc32') + anime_release_group = matches.named('release_group', lambda match: 'anime' in match.tags) + if crc32 and anime_release_group: + return 'episode' + + return 'movie' + + def then(self, matches, when_response, context): + _type(matches, when_response) diff --git a/lib/guessit/rules/properties/video_codec.py b/lib/guessit/rules/properties/video_codec.py new file mode 100644 index 00000000..842a03c7 --- /dev/null +++ b/lib/guessit/rules/properties/video_codec.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +video_codec and video_profile property +""" +from rebulk import Rebulk, Rule, RemoveMatch +from rebulk.remodule import re + +from ..common import dash +from ..common.pattern import is_disabled +from ..common.validators import seps_after, seps_before, seps_surround + + +def video_codec(config): # pylint:disable=unused-argument + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk() + rebulk = rebulk.regex_defaults(flags=re.IGNORECASE, abbreviations=[dash]).string_defaults(ignore_case=True) + rebulk.defaults(name="video_codec", + tags=['source-suffix', 'streaming_service.suffix'], + disabled=lambda context: is_disabled(context, 'video_codec')) + + rebulk.regex(r'Rv\d{2}', value='RealVideo') + rebulk.regex('Mpe?g-?2', '[hx]-?262', value='MPEG-2') + rebulk.string("DVDivX", "DivX", value="DivX") + rebulk.string('XviD', value='Xvid') + rebulk.regex('VC-?1', value='VC-1') + rebulk.string('VP7', value='VP7') + rebulk.string('VP8', 'VP80', value='VP8') + rebulk.string('VP9', value='VP9') + rebulk.regex('[hx]-?263', value='H.263') + rebulk.regex('[hx]-?264', '(MPEG-?4)?AVC(?:HD)?', value='H.264') + rebulk.regex('[hx]-?265', 'HEVC', value='H.265') + rebulk.regex('(?P<video_codec>hevc)(?P<color_depth>10)', value={'video_codec': 'H.265', 'color_depth': '10-bit'}, + tags=['video-codec-suffix'], children=True) + + # http://blog.mediacoderhq.com/h264-profiles-and-levels/ + # https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC + rebulk.defaults(clear=True, + name="video_profile", + validator=seps_surround, + disabled=lambda context: is_disabled(context, 'video_profile')) + + rebulk.string('BP', value='Baseline', tags='video_profile.rule') + rebulk.string('XP', 'EP', value='Extended', tags='video_profile.rule') + rebulk.string('MP', value='Main', tags='video_profile.rule') + rebulk.string('HP', 'HiP', value='High', tags='video_profile.rule') + + # https://en.wikipedia.org/wiki/Scalable_Video_Coding + rebulk.string('SC', 'SVC', value='Scalable Video Coding', tags='video_profile.rule') + # https://en.wikipedia.org/wiki/AVCHD + rebulk.regex('AVC(?:HD)?', value='Advanced Video Codec High Definition', tags='video_profile.rule') + # https://en.wikipedia.org/wiki/H.265/HEVC + rebulk.string('HEVC', value='High Efficiency Video Coding', tags='video_profile.rule') + + rebulk.regex('Hi422P', value='High 4:2:2') + rebulk.regex('Hi444PP', value='High 4:4:4 Predictive') + rebulk.regex('Hi10P?', value='High 10') # no profile validation is required + + rebulk.string('DXVA', value='DXVA', name='video_api', + disabled=lambda context: is_disabled(context, 'video_api')) + + rebulk.defaults(clear=True, + name='color_depth', + validator=seps_surround, + disabled=lambda context: is_disabled(context, 'color_depth')) + rebulk.regex('12.?bits?', value='12-bit') + rebulk.regex('10.?bits?', 'YUV420P10', 'Hi10P?', value='10-bit') + rebulk.regex('8.?bits?', value='8-bit') + + rebulk.rules(ValidateVideoCodec, VideoProfileRule) + + return rebulk + + +class ValidateVideoCodec(Rule): + """ + Validate video_codec with source property or separated + """ + priority = 64 + consequence = RemoveMatch + + def enabled(self, context): + return not is_disabled(context, 'video_codec') + + def when(self, matches, context): + ret = [] + for codec in matches.named('video_codec'): + if not seps_before(codec) and \ + not matches.at_index(codec.start - 1, lambda match: 'video-codec-prefix' in match.tags): + ret.append(codec) + continue + if not seps_after(codec) and \ + not matches.at_index(codec.end + 1, lambda match: 'video-codec-suffix' in match.tags): + ret.append(codec) + continue + return ret + + +class VideoProfileRule(Rule): + """ + Rule to validate video_profile + """ + consequence = RemoveMatch + + def enabled(self, context): + return not is_disabled(context, 'video_profile') + + def when(self, matches, context): + profile_list = matches.named('video_profile', lambda match: 'video_profile.rule' in match.tags) + ret = [] + for profile in profile_list: + codec = matches.at_span(profile.span, lambda match: match.name == 'video_codec', 0) + if not codec: + codec = matches.previous(profile, lambda match: match.name == 'video_codec') + if not codec: + codec = matches.next(profile, lambda match: match.name == 'video_codec') + if not codec: + ret.append(profile) + return ret diff --git a/lib/guessit/rules/properties/website.py b/lib/guessit/rules/properties/website.py new file mode 100644 index 00000000..b01e86c8 --- /dev/null +++ b/lib/guessit/rules/properties/website.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Website property. +""" +# from pkg_resources import resource_stream # @UnresolvedImport +import os + +from rebulk.remodule import re + +from rebulk import Rebulk, Rule, RemoveMatch +from ..common import seps +from ..common.formatters import cleanup +from ..common.pattern import is_disabled +from ..common.validators import seps_surround +from ...reutils import build_or_pattern + + +def website(config): + """ + Builder for rebulk object. + + :param config: rule configuration + :type config: dict + :return: Created Rebulk object + :rtype: Rebulk + """ + rebulk = Rebulk(disabled=lambda context: is_disabled(context, 'website')) + rebulk = rebulk.regex_defaults(flags=re.IGNORECASE).string_defaults(ignore_case=True) + rebulk.defaults(name="website") + + with open(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'tlds-alpha-by-domain.txt')) as tld_file: + tlds = [ + tld.strip().decode('utf-8') + for tld in tld_file.readlines() + if b'--' not in tld + ][1:] # All registered domain extension + + safe_tlds = config['safe_tlds'] # For sure a website extension + safe_subdomains = config['safe_subdomains'] # For sure a website subdomain + safe_prefix = config['safe_prefixes'] # Those words before a tlds are sure + website_prefixes = config['prefixes'] + + rebulk.regex(r'(?:[^a-z0-9]|^)((?:'+build_or_pattern(safe_subdomains) + + r'\.)+(?:[a-z-]+\.)+(?:'+build_or_pattern(tlds) + + r'))(?:[^a-z0-9]|$)', + children=True) + rebulk.regex(r'(?:[^a-z0-9]|^)((?:'+build_or_pattern(safe_subdomains) + + r'\.)*[a-z-]+\.(?:'+build_or_pattern(safe_tlds) + + r'))(?:[^a-z0-9]|$)', + safe_subdomains=safe_subdomains, safe_tlds=safe_tlds, children=True) + rebulk.regex(r'(?:[^a-z0-9]|^)((?:'+build_or_pattern(safe_subdomains) + + r'\.)*[a-z-]+\.(?:'+build_or_pattern(safe_prefix) + + r'\.)+(?:'+build_or_pattern(tlds) + + r'))(?:[^a-z0-9]|$)', + safe_subdomains=safe_subdomains, safe_prefix=safe_prefix, tlds=tlds, children=True) + + rebulk.string(*website_prefixes, + validator=seps_surround, private=True, tags=['website.prefix']) + + class PreferTitleOverWebsite(Rule): + """ + If found match is more likely a title, remove website. + """ + consequence = RemoveMatch + + @staticmethod + def valid_followers(match): + """ + Validator for next website matches + """ + return match.named('season', 'episode', 'year') + + def when(self, matches, context): + to_remove = [] + for website_match in matches.named('website'): + safe = False + for safe_start in safe_subdomains + safe_prefix: + if website_match.value.lower().startswith(safe_start): + safe = True + break + if not safe: + suffix = matches.next(website_match, PreferTitleOverWebsite.valid_followers, 0) + if suffix: + group = matches.markers.at_match(website_match, lambda marker: marker.name == 'group', 0) + if not group: + to_remove.append(website_match) + return to_remove + + rebulk.rules(PreferTitleOverWebsite, ValidateWebsitePrefix) + + return rebulk + + +class ValidateWebsitePrefix(Rule): + """ + Validate website prefixes + """ + priority = 64 + consequence = RemoveMatch + + def when(self, matches, context): + to_remove = [] + for prefix in matches.tagged('website.prefix'): + website_match = matches.next(prefix, predicate=lambda match: match.name == 'website', index=0) + if (not website_match or + matches.holes(prefix.end, website_match.start, + formatter=cleanup, seps=seps, predicate=lambda match: match.value)): + to_remove.append(prefix) + return to_remove diff --git a/lib/guessit/test/__init__.py b/lib/guessit/test/__init__.py new file mode 100644 index 00000000..e5be370e --- /dev/null +++ b/lib/guessit/test/__init__.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# pylint: disable=no-self-use, pointless-statement, missing-docstring, invalid-name diff --git a/lib/guessit/test/config/dummy.txt b/lib/guessit/test/config/dummy.txt new file mode 100644 index 00000000..7d6ca31b --- /dev/null +++ b/lib/guessit/test/config/dummy.txt @@ -0,0 +1 @@ +Not a configuration file \ No newline at end of file diff --git a/lib/guessit/test/config/test.json b/lib/guessit/test/config/test.json new file mode 100644 index 00000000..22f45d2a --- /dev/null +++ b/lib/guessit/test/config/test.json @@ -0,0 +1,4 @@ +{ + "expected_title": ["The 100", "OSS 117"], + "yaml": false +} diff --git a/lib/guessit/test/config/test.yaml b/lib/guessit/test/config/test.yaml new file mode 100644 index 00000000..6a4dfe15 --- /dev/null +++ b/lib/guessit/test/config/test.yaml @@ -0,0 +1,4 @@ +expected_title: + - The 100 + - OSS 117 +yaml: True diff --git a/lib/guessit/test/config/test.yml b/lib/guessit/test/config/test.yml new file mode 100644 index 00000000..6a4dfe15 --- /dev/null +++ b/lib/guessit/test/config/test.yml @@ -0,0 +1,4 @@ +expected_title: + - The 100 + - OSS 117 +yaml: True diff --git a/lib/guessit/test/enable_disable_properties.yml b/lib/guessit/test/enable_disable_properties.yml new file mode 100644 index 00000000..ada9c347 --- /dev/null +++ b/lib/guessit/test/enable_disable_properties.yml @@ -0,0 +1,335 @@ +? vorbis +: options: --exclude audio_codec + -audio_codec: Vorbis + +? DTS-ES +: options: --exclude audio_profile + audio_codec: DTS + -audio_profile: Extended Surround + +? DTS.ES +: options: --include audio_codec + audio_codec: DTS + -audio_profile: Extended Surround + +? 5.1 +? 5ch +? 6ch +: options: --exclude audio_channels + -audio_channels: '5.1' + +? Movie Title-x01-Other Title.mkv +? Movie Title-x01-Other Title +? directory/Movie Title-x01-Other Title/file.mkv +: options: --exclude bonus + -bonus: 1 + -bonus_title: Other Title + +? Title-x02-Bonus Title.mkv +: options: --include bonus + bonus: 2 + -bonus_title: Other Title + +? cd 1of3 +: options: --exclude cd + -cd: 1 + -cd_count: 3 + +? This.is.Us +: options: --exclude country + title: This is Us + -country: US + +? 2015.01.31 +: options: --exclude date + year: 2015 + -date: 2015-01-31 + +? Something 2 mar 2013) +: options: --exclude date + -date: 2013-03-02 + +? 2012 2009 S01E02 2015 # If no year is marked, the second one is guessed. +: options: --exclude year + -year: 2009 + +? Director's cut +: options: --exclude edition + -edition: Director's Cut + +? 2x5 +? 2X5 +? 02x05 +? 2X05 +? 02x5 +? S02E05 +? s02e05 +? s02e5 +? s2e05 +? s02ep05 +? s2EP5 +: options: --exclude season + -season: 2 + -episode: 5 + +? 2x6 +? 2X6 +? 02x06 +? 2X06 +? 02x6 +? S02E06 +? s02e06 +? s02e6 +? s2e06 +? s02ep06 +? s2EP6 +: options: --exclude episode + -season: 2 + -episode: 6 + +? serie Season 2 other +: options: --exclude season + -season: 2 + +? Some Dummy Directory/S02 Some Series/E01-Episode title.mkv +: options: --exclude episode_title + -episode_title: Episode title + season: 2 + episode: 1 + +? Another Dummy Directory/S02 Some Series/E01-Episode title.mkv +: options: --include season --include episode + -episode_title: Episode title + season: 2 + episode: 1 + +# pattern contains season and episode: it wont work enabling only one +? Some Series S03E01E02 +: options: --include episode + -season: 3 + -episode: [1, 2] + +# pattern contains season and episode: it wont work enabling only one +? Another Series S04E01E02 +: options: --include season + -season: 4 + -episode: [1, 2] + +? Show.Name.Season.4.Episode.1 +: options: --include episode + -season: 4 + episode: 1 + +? Another.Show.Name.Season.4.Episode.1 +: options: --include season + season: 4 + -episode: 1 + +? Some Series S01 02 03 +: options: --exclude season + -season: [1, 2, 3] + +? Some Series E01 02 04 +: options: --exclude episode + -episode: [1, 2, 4] + +? A very special episode s06 special +: options: -t episode --exclude episode_details + season: 6 + -episode_details: Special + +? S01D02.3-5-GROUP +: options: --exclude disc + -season: 1 + -disc: [2, 3, 4, 5] + -episode: [2, 3, 4, 5] + +? S01D02&4-6&8 +: options: --exclude season + -season: 1 + -disc: [2, 4, 5, 6, 8] + -episode: [2, 4, 5, 6, 8] + +? Film Title-f01-Series Title.mkv +: options: --exclude film + -film: 1 + -film_title: Film Title + +? Another Film Title-f01-Series Title.mkv +: options: --exclude film_title + film: 1 + -film_title: Film Title + +? English +? .ENG. +: options: --exclude language + -language: English + +? SubFrench +? SubFr +? STFr +: options: --exclude subtitle_language + -language: French + -subtitle_language: French + +? ST.FR +: options: --exclude subtitle_language + language: French + -subtitle_language: French + +? ENG.-.sub.FR +? ENG.-.FR Sub +: options: --include language + language: [English, French] + -subtitle_language: French + +? ENG.-.SubFR +: options: --include language + language: English + -subtitle_language: French + +? ENG.-.FRSUB +? ENG.-.FRSUBS +? ENG.-.FR-SUBS +: options: --include subtitle_language + -language: English + subtitle_language: French + +? DVD.Real.XViD +? DVD.fix.XViD +: options: --exclude other + -other: Fix + -proper_count: 1 + +? Part 3 +? Part III +? Part Three +? Part Trois +? Part3 +: options: --exclude part + -part: 3 + +? Some.Title.XViD-by.Artik[SEDG].avi +: options: --exclude release_group + -release_group: Artik[SEDG] + +? "[ABC] Some.Title.avi" +? some/folder/[ABC]Some.Title.avi +: options: --exclude release_group + -release_group: ABC + +? 360p +? 360px +? "360" +? +500x360 +: options: --exclude screen_size + -screen_size: 360p + +? 640x360 +: options: --exclude aspect_ratio + screen_size: 360p + -aspect_ratio: 1.778 + +? 8196x4320 +: options: --exclude screen_size + -screen_size: 4320p + -aspect_ratio: 1.897 + +? 4.3gb +: options: --exclude size + -size: 4.3GB + +? VhS_rip +? VHS.RIP +: options: --exclude source + -source: VHS + -other: Rip + +? DVD.RIP +: options: --include other + -source: DVD + -other: Rip + +? Title Only.avi +: options: --exclude title + -title: Title Only + +? h265 +? x265 +? h.265 +? x.265 +? hevc +: options: --exclude video_codec + -video_codec: H.265 + +? hevc10 +: options: --include color_depth + -video_codec: H.265 + -color_depth: 10-bit + +? HEVC-YUV420P10 +: options: --include color_depth + -video_codec: H.265 + color_depth: 10-bit + +? h265-HP +: options: --exclude video_profile + video_codec: H.265 + -video_profile: High + +? House.of.Cards.2013.S02E03.1080p.NF.WEBRip.DD5.1.x264-NTb.mkv +? House.of.Cards.2013.S02E03.1080p.Netflix.WEBRip.DD5.1.x264-NTb.mkv +: options: --exclude streaming_service + -streaming_service: Netflix + +? wawa.co.uk +: options: --exclude website + -website: wawa.co.uk + +? movie.mp4 +: options: --exclude mimetype + -mimetype: video/mp4 + +? another movie.mkv +: options: --exclude container + -container: mkv + +? series s02e01 +: options: --exclude type + -type: episode + +? series s02e01 +: options: --exclude type + -type: episode + +? Hotel.Hell.S01E01.720p.DD5.1.448kbps-ALANiS +: options: --exclude audio_bit_rate + -audio_bit_rate: 448Kbps + +? Katy Perry - Pepsi & Billboard Summer Beats Concert Series 2012 1080i HDTV 20 Mbps DD2.0 MPEG2-TrollHD.ts +: options: --exclude video_bit_rate + -video_bit_rate: 20Mbps + +? "[Figmentos] Monster 34 - At the End of Darkness [781219F1].mkv" +: options: --exclude crc32 + -crc32: 781219F1 + +? 1080p25 +: options: --exclude frame_rate + screen_size: 1080p + -frame_rate: 25fps + +? 1080p25 +: options: --exclude screen_size + -screen_size: 1080p + -frame_rate: 25fps + +? 1080p25 +: options: --include frame_rate + -screen_size: 1080p + -frame_rate: 25fps + +? 1080p 30fps +: options: --exclude screen_size + -screen_size: 1080p + frame_rate: 30fps diff --git a/lib/guessit/test/episodes.yml b/lib/guessit/test/episodes.yml new file mode 100644 index 00000000..4bbbde4a --- /dev/null +++ b/lib/guessit/test/episodes.yml @@ -0,0 +1,4693 @@ +? __default__ +: type: episode + +? Series/Californication/Season 2/Californication.2x05.Vaginatown.HDTV.XviD-0TV.avi +: title: Californication + season: 2 + episode: 5 + episode_title: Vaginatown + source: HDTV + video_codec: Xvid + release_group: 0TV + container: avi + +? Series/dexter/Dexter.5x02.Hello,.Bandit.ENG.-.sub.FR.HDTV.XviD-AlFleNi-TeaM.[tvu.org.ru].avi +: title: Dexter + season: 5 + episode: 2 + episode_title: Hello, Bandit + language: English + subtitle_language: French + source: HDTV + video_codec: Xvid + release_group: AlFleNi-TeaM + website: tvu.org.ru + container: avi + +? Series/Treme/Treme.1x03.Right.Place,.Wrong.Time.HDTV.XviD-NoTV.avi +: title: Treme + season: 1 + episode: 3 + episode_title: Right Place, Wrong Time + source: HDTV + video_codec: Xvid + release_group: NoTV + +? Series/Duckman/Duckman - S1E13 Joking The Chicken (unedited).avi +: title: Duckman + season: 1 + episode: 13 + episode_title: Joking The Chicken + +? Series/Simpsons/Saison 12 Français/Simpsons,.The.12x08.A.Bas.Le.Sergent.Skinner.FR.avi +: title: The Simpsons + season: 12 + episode: 8 + episode_title: A Bas Le Sergent Skinner + language: French + +? Series/Duckman/Duckman - 101 (01) - 20021107 - I, Duckman.avi +: title: Duckman + season: 1 + episode: 1 + episode_title: I, Duckman + date: 2002-11-07 + +? Series/Simpsons/Saison 12 Français/Simpsons,.The.12x08.A.Bas.Le.Sergent.Skinner.FR.avi +: title: The Simpsons + season: 12 + episode: 8 + episode_title: A Bas Le Sergent Skinner + language: French + +? Series/Futurama/Season 3 (mkv)/[™] Futurama - S03E22 - Le chef de fer à 30% ( 30 Percent Iron Chef ).mkv +: title: Futurama + season: 3 + episode: 22 + episode_title: Le chef de fer à 30% + +? Series/The Office/Season 6/The Office - S06xE01.avi +: title: The Office + season: 6 + episode: 1 + +? series/The Office/Season 4/The Office [401] Fun Run.avi +: title: The Office + season: 4 + episode: 1 + episode_title: Fun Run + +? Series/Mad Men Season 1 Complete/Mad.Men.S01E01.avi +: title: Mad Men + season: 1 + episode: 1 + other: Complete + +? series/Psych/Psych S02 Season 2 Complete English DVD/Psych.S02E02.65.Million.Years.Off.avi +: title: Psych + season: 2 + episode: 2 + episode_title: 65 Million Years Off + language: english + source: DVD + other: Complete + +? series/Psych/Psych S02 Season 2 Complete English DVD/Psych.S02E03.Psy.Vs.Psy.Français.srt +: title: Psych + season: 2 + episode: 3 + episode_title: Psy Vs Psy + source: DVD + language: English + subtitle_language: French + other: Complete + +? Series/Pure Laine/Pure.Laine.1x01.Toutes.Couleurs.Unies.FR.(Québec).DVB-Kceb.[tvu.org.ru].avi +: title: Pure Laine + season: 1 + episode: 1 + episode_title: Toutes Couleurs Unies + source: Digital TV + release_group: Kceb + language: french + website: tvu.org.ru + +? Series/Pure Laine/2x05 - Pure Laine - Je Me Souviens.avi +: title: Pure Laine + season: 2 + episode: 5 + episode_title: Je Me Souviens + +? Series/Tout sur moi/Tout sur moi - S02E02 - Ménage à trois (14-01-2008) [Rip by Ampli].avi +: title: Tout sur moi + season: 2 + episode: 2 + episode_title: Ménage à trois + date: 2008-01-14 + +? The.Mentalist.2x21.18-5-4.ENG.-.sub.FR.HDTV.XviD-AlFleNi-TeaM.[tvu.org.ru].avi +: title: The Mentalist + season: 2 + episode: 21 + episode_title: 18-5-4 + language: english + subtitle_language: french + source: HDTV + video_codec: Xvid + release_group: AlFleNi-TeaM + website: tvu.org.ru + +? series/__ Incomplete __/Dr Slump (Catalan)/Dr._Slump_-_003_DVB-Rip_Catalan_by_kelf.avi +: title: Dr Slump + episode: 3 + source: Digital TV + other: Rip + language: catalan + +# Disabling this test because it just doesn't looks like a serie ... +#? series/Ren and Stimpy - Black_hole_[DivX].avi +#: title: Ren and Stimpy +# episode_title: Black hole +# video_codec: DivX + +# Disabling this test because it just doesn't looks like a serie ... +# ? Series/Walt Disney/Donald.Duck.-.Good.Scouts.[www.bigernie.jump.to].avi +#: title: Donald Duck +# episode_title: Good Scouts +# website: www.bigernie.jump.to + +? Series/Neverwhere/Neverwhere.05.Down.Street.[tvu.org.ru].avi +: title: Neverwhere + episode: 5 + episode_title: Down Street + website: tvu.org.ru + +? Series/South Park/Season 4/South.Park.4x07.Cherokee.Hair.Tampons.DVDRip.[tvu.org.ru].avi +: title: South Park + season: 4 + episode: 7 + episode_title: Cherokee Hair Tampons + source: DVD + other: Rip + website: tvu.org.ru + +? Series/Kaamelott/Kaamelott - Livre V - Ep 23 - Le Forfait.avi +: title: Kaamelott + alternative_title: Livre V + episode: 23 + episode_title: Le Forfait + +? Series/Duckman/Duckman - 110 (10) - 20021218 - Cellar Beware.avi +: title: Duckman + season: 1 + episode: 10 + date: 2002-12-18 + episode_title: Cellar Beware + +# Removing this test because it doesn't look like a series +# ? Series/Ren & Stimpy/Ren And Stimpy - Onward & Upward-Adult Party Cartoon.avi +# : title: Ren And Stimpy +# episode_title: Onward & Upward-Adult Party Cartoon + +? Series/Breaking Bad/Minisodes/Breaking.Bad.(Minisodes).01.Good.Cop.Bad.Cop.WEBRip.XviD.avi +: title: Breaking Bad + episode_format: Minisode + episode: 1 + episode_title: Good Cop Bad Cop + source: Web + other: Rip + video_codec: Xvid + +? Series/My Name Is Earl/My.Name.Is.Earl.S01Extras.-.Bad.Karma.DVDRip.XviD.avi +: title: My Name Is Earl + season: 1 + episode_title: Bad Karma + source: DVD + other: [Extras, Rip] + video_codec: Xvid + +? series/Freaks And Geeks/Season 1/Episode 4 - Kim Kelly Is My Friend-eng(1).srt +: title: Freaks And Geeks + season: 1 + episode: 4 + episode_title: Kim Kelly Is My Friend + subtitle_language: English # This is really a subtitle_language, despite guessit 1.x assert for language. + +? /mnt/series/The Big Bang Theory/S01/The.Big.Bang.Theory.S01E01.mkv +: title: The Big Bang Theory + season: 1 + episode: 1 + +? /media/Parks_and_Recreation-s03-e01.mkv +: title: Parks and Recreation + season: 3 + episode: 1 + +? /media/Parks_and_Recreation-s03-e02-Flu_Season.mkv +: title: Parks and Recreation + season: 3 + episode_title: Flu Season + episode: 2 + +? /media/Parks_and_Recreation-s03-x01.mkv +: title: Parks and Recreation + season: 3 + episode: 1 + +? /media/Parks_and_Recreation-s03-x02-Gag_Reel.mkv +: title: Parks and Recreation + season: 3 + episode: 2 + episode_title: Gag Reel + +? /media/Band_of_Brothers-e01-Currahee.mkv +: title: Band of Brothers + episode: 1 + episode_title: Currahee + +? /media/Band_of_Brothers-x02-We_Stand_Alone_Together.mkv +: title: Band of Brothers + bonus: 2 + bonus_title: We Stand Alone Together + +? /TV Shows/Mad.M-5x9.mkv +: title: Mad M + season: 5 + episode: 9 + +? /TV Shows/new.girl.117.hdtv-lol.mp4 +: title: new girl + season: 1 + episode: 17 + source: HDTV + release_group: lol + +? Kaamelott - 5x44x45x46x47x48x49x50.avi +: title: Kaamelott + season: 5 + episode: [44, 45, 46, 47, 48, 49, 50] + +? Example S01E01-02.avi +? Example S01E01E02.avi +: title: Example + season: 1 + episode: [1, 2] + +? Series/Baccano!/Baccano!_-_T1_-_Trailer_-_[Ayu](dae8173e).mkv +: title: Baccano! + other: Trailer + release_group: Ayu + episode_title: T1 + crc32: dae8173e + +? Series/Doctor Who (2005)/Season 06/Doctor Who (2005) - S06E01 - The Impossible Astronaut (1).avi +: title: Doctor Who + year: 2005 + season: 6 + episode: 1 + episode_title: The Impossible Astronaut + +? The Sopranos - [05x07] - In Camelot.mp4 +: title: The Sopranos + season: 5 + episode: 7 + episode_title: In Camelot + +? The.Office.(US).1x03.Health.Care.HDTV.XviD-LOL.avi +: title: The Office + country: US + season: 1 + episode: 3 + episode_title: Health Care + source: HDTV + video_codec: Xvid + release_group: LOL + +? /Volumes/data-1/Series/Futurama/Season 3/Futurama_-_S03_DVD_Bonus_-_Deleted_Scenes_Part_3.ogm +: title: Futurama + season: 3 + part: 3 + source: DVD + other: Bonus + +? Ben.and.Kate.S01E02.720p.HDTV.X264-DIMENSION.mkv +: title: Ben and Kate + season: 1 + episode: 2 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: DIMENSION + +? /volume1/TV Series/Drawn Together/Season 1/Drawn Together 1x04 Requiem for a Reality Show.avi +: title: Drawn Together + season: 1 + episode: 4 + episode_title: Requiem for a Reality Show + +? Sons.of.Anarchy.S05E06.720p.WEB.DL.DD5.1.H.264-CtrlHD.mkv +: title: Sons of Anarchy + season: 5 + episode: 6 + screen_size: 720p + source: Web + audio_channels: "5.1" + audio_codec: Dolby Digital + video_codec: H.264 + release_group: CtrlHD + +? /media/bdc64bfe-e36f-4af8-b550-e6fd2dfaa507/TV_Shows/Doctor Who (2005)/Saison 6/Doctor Who (2005) - S06E13 - The Wedding of River Song.mkv +: title: Doctor Who + season: 6 + episode: 13 + year: 2005 + episode_title: The Wedding of River Song + uuid: bdc64bfe-e36f-4af8-b550-e6fd2dfaa507 + +? /mnt/videos/tvshows/Doctor Who/Season 06/E13 - The Wedding of River Song.mkv +: title: Doctor Who + season: 6 + episode: 13 + episode_title: The Wedding of River Song + +? The.Simpsons.S24E03.Adventures.in.Baby-Getting.720p.WEB-DL.DD5.1.H.264-CtrlHD.mkv +: title: The Simpsons + season: 24 + episode: 3 + episode_title: Adventures in Baby-Getting + screen_size: 720p + source: Web + audio_channels: "5.1" + audio_codec: Dolby Digital + video_codec: H.264 + release_group: CtrlHD + +? /home/disaster/Videos/TV/Merlin/merlin_2008.5x02.arthurs_bane_part_two.repack.720p_hdtv_x264-fov.mkv +: title: merlin + season: 5 + episode: 2 + part: 2 + episode_title: arthurs bane + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: fov + year: 2008 + other: Proper + proper_count: 1 + +? "Da Vinci's Demons - 1x04 - The Magician.mkv" +: title: "Da Vinci's Demons" + season: 1 + episode: 4 + episode_title: The Magician + +? CSI.S013E18.Sheltered.720p.WEB-DL.DD5.1.H.264.mkv +: title: CSI + season: 13 + episode: 18 + episode_title: Sheltered + screen_size: 720p + source: Web + audio_channels: "5.1" + audio_codec: Dolby Digital + video_codec: H.264 + +? Game of Thrones S03E06 1080i HDTV DD5.1 MPEG2-TrollHD.ts +: title: Game of Thrones + season: 3 + episode: 6 + screen_size: 1080i + source: HDTV + audio_channels: "5.1" + audio_codec: Dolby Digital + video_codec: MPEG-2 + release_group: TrollHD + +? gossip.girl.s01e18.hdtv.xvid-2hd.eng.srt +: title: gossip girl + season: 1 + episode: 18 + source: HDTV + video_codec: Xvid + release_group: 2hd + subtitle_language: english + +? Wheels.S03E01E02.720p.HDTV.x264-IMMERSE.mkv +: title: Wheels + season: 3 + episode: [1, 2] + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: IMMERSE + +? Wheels.S03E01-02.720p.HDTV.x264-IMMERSE.mkv +: title: Wheels + season: 3 + episode: [1, 2] + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: IMMERSE + +? Wheels.S03E01-E02.720p.HDTV.x264-IMMERSE.mkv +: title: Wheels + season: 3 + episode: [1, 2] + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: IMMERSE + +? Wheels.S03E01-04.720p.HDTV.x264-IMMERSE.mkv +: title: Wheels + season: 3 + episode: [1, 2, 3, 4] + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: IMMERSE + +? Marvels.Agents.of.S.H.I.E.L.D-S01E06.720p.HDTV.X264-DIMENSION.mkv +: title: Marvels Agents of S.H.I.E.L.D + season: 1 + episode: 6 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: DIMENSION + +? Marvels.Agents.of.S.H.I.E.L.D.S01E06.720p.HDTV.X264-DIMENSION.mkv +: title: Marvels Agents of S.H.I.E.L.D. + season: 1 + episode: 6 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: DIMENSION + +? Marvels.Agents.of.S.H.I.E.L.D..S01E06.720p.HDTV.X264-DIMENSION.mkv +: title: Marvels Agents of S.H.I.E.L.D. + season: 1 + episode: 6 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: DIMENSION + +? Series/Friday Night Lights/Season 1/Friday Night Lights S01E19 - Ch-Ch-Ch-Ch-Changes.avi +: title: Friday Night Lights + season: 1 + episode: 19 + episode_title: Ch-Ch-Ch-Ch-Changes + +? Dexter Saison VII FRENCH.BDRip.XviD-MiND.nfo +: title: Dexter + season: 7 + video_codec: Xvid + language: French + source: Blu-ray + other: Rip + release_group: MiND + +? Dexter Saison sept FRENCH.BDRip.XviD-MiND.nfo +: title: Dexter + season: 7 + video_codec: Xvid + language: French + source: Blu-ray + other: Rip + release_group: MiND + +? "Pokémon S16 - E29 - 1280*720 HDTV VF.mkv" +: title: Pokémon + source: HDTV + language: French + season: 16 + episode: 29 + screen_size: 720p + +? One.Piece.E576.VOSTFR.720p.HDTV.x264-MARINE-FORD.mkv +: episode: 576 + video_codec: H.264 + source: HDTV + title: One Piece + release_group: MARINE-FORD + subtitle_language: French + screen_size: 720p + +? Dexter.S08E12.FINAL.MULTi.1080p.BluRay.x264-MiND.mkv +: video_codec: H.264 + episode: 12 + season: 8 + source: Blu-ray + title: Dexter + episode_details: Final + language: Multiple languages + release_group: MiND + screen_size: 1080p + +? One Piece - E623 VOSTFR HD [www.manga-ddl-free.com].mkv +: website: www.manga-ddl-free.com + episode: 623 + subtitle_language: French + title: One Piece + other: HD + +? Falling Skies Saison 1.HDLight.720p.x264.VFF.mkv +: language: French + screen_size: 720p + season: 1 + title: Falling Skies + video_codec: H.264 + other: Micro HD + +? Sleepy.Hollow.S01E09.720p.WEB-DL.DD5.1.H.264-BP.mkv +: episode: 9 + video_codec: H.264 + source: Web + title: Sleepy Hollow + audio_channels: "5.1" + screen_size: 720p + season: 1 +# video_profile: BP # TODO: related to https://github.com/guessit-io/guessit/issues/458#issuecomment-305719715 + audio_codec: Dolby Digital + +? Sleepy.Hollow.S01E09.720p.WEB-DL.DD5.1.H.264-BS.mkv +: episode: 9 + video_codec: H.264 + source: Web + title: Sleepy Hollow + audio_channels: "5.1" + screen_size: 720p + season: 1 + release_group: BS + audio_codec: Dolby Digital + +? Battlestar.Galactica.S00.Pilot.FRENCH.DVDRip.XviD-NOTAG.avi +: title: Battlestar Galactica + season: 0 + episode_details: Pilot + episode_title: Pilot + language: French + source: DVD + other: Rip + video_codec: Xvid + release_group: NOTAG + +? The Big Bang Theory S00E00 Unaired Pilot VOSTFR TVRip XviD-VioCs +: title: The Big Bang Theory + season: 0 + episode: 0 + subtitle_language: French + source: TV + other: Rip + video_codec: Xvid + release_group: VioCs + episode_details: [Unaired, Pilot] + +? The Big Bang Theory S01E00 PROPER Unaired Pilot TVRip XviD-GIGGITY +: title: The Big Bang Theory + season: 1 + episode: 0 + source: TV + video_codec: Xvid + release_group: GIGGITY + other: [Proper, Rip] + proper_count: 1 + episode_details: [Unaired, Pilot] + +? Pawn.Stars.S2014E18.720p.HDTV.x264-KILLERS +: title: Pawn Stars + season: 2014 + year: 2014 + episode: 18 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: KILLERS + +? 2.Broke.Girls.S03E10.480p.HDTV.x264-mSD.mkv +: title: 2 Broke Girls + season: 3 + episode: 10 + screen_size: 480p + source: HDTV + video_codec: H.264 + release_group: mSD + +? the.100.109.hdtv-lol.mp4 +: title: the 100 + season: 1 + episode: 9 + source: HDTV + release_group: lol + +? Criminal.Minds.5x03.Reckoner.ENG.-.sub.FR.HDTV.XviD-STi.[tvu.org.ru].avi +: title: Criminal Minds + language: English + subtitle_language: French + season: 5 + episode: 3 + video_codec: Xvid + source: HDTV + website: tvu.org.ru + release_group: STi + episode_title: Reckoner + +? 03-Criminal.Minds.avi +: title: Criminal Minds + episode: 3 + +? '[Evil-Saizen]_Laughing_Salesman_14_[DVD][1C98686A].mkv' +: crc32: 1C98686A + episode: 14 + source: DVD + release_group: Evil-Saizen + title: Laughing Salesman + +? '[Kaylith] Zankyou no Terror - 04 [480p][B4D4514E].mp4' +: crc32: B4D4514E + episode: 4 + release_group: Kaylith + screen_size: 480p + title: Zankyou no Terror + +? '[PuyaSubs!] Seirei Tsukai no Blade Dance - 05 [720p][32DD560E].mkv' +: crc32: 32DD560E + episode: 5 + release_group: PuyaSubs! + screen_size: 720p + title: Seirei Tsukai no Blade Dance + +? '[Doremi].Happiness.Charge.Precure.27.[1280x720].[DC91581A].mkv' +: crc32: DC91581A + episode: 27 + release_group: Doremi + screen_size: 720p + title: Happiness Charge Precure + +? "[Daisei] Free!:Iwatobi Swim Club - 01 ~ (BD 720p 10-bit AAC) [99E8E009].mkv" +: audio_codec: AAC + crc32: 99E8E009 + episode: 1 + source: Blu-ray + release_group: Daisei + screen_size: 720p + title: Free!:Iwatobi Swim Club + color_depth: 10-bit + +? '[Tsundere] Boku wa Tomodachi ga Sukunai - 03 [BDRip h264 1920x1080 10bit FLAC][AF0C22CC].mkv' +: audio_codec: FLAC + crc32: AF0C22CC + episode: 3 + source: Blu-ray + release_group: Tsundere + screen_size: 1080p + title: Boku wa Tomodachi ga Sukunai + video_codec: H.264 + color_depth: 10-bit + +? '[t.3.3.d]_Mikakunin_de_Shinkoukei_-_12_[720p][5DDC1352].mkv' +: crc32: 5DDC1352 + episode: 12 + screen_size: 720p + title: Mikakunin de Shinkoukei + release_group: t.3.3.d + +? '[Anime-Koi] Sabagebu! - 06 [h264-720p][ABB3728A].mkv' +: crc32: ABB3728A + episode: 6 + release_group: Anime-Koi + screen_size: 720p + title: Sabagebu! + video_codec: H.264 + +? '[aprm-Diogo4D] [BD][1080p] Nagi no Asukara 08 [4D102B7C].mkv' +: crc32: 4D102B7C + episode: 8 + source: Blu-ray + release_group: aprm-Diogo4D + screen_size: 1080p + title: Nagi no Asukara + +? '[Akindo-SSK] Zankyou no Terror - 05 [720P][Sub_ITA][F5CCE87C].mkv' +: crc32: F5CCE87C + episode: 5 + release_group: Akindo-SSK + screen_size: 720p + title: Zankyou no Terror + subtitle_language: it + +? Naruto Shippuden Episode 366 VOSTFR.avi +: episode: 366 + title: Naruto Shippuden + subtitle_language: fr + +? Naruto Shippuden Episode 366v2 VOSTFR.avi +: episode: 366 + version: 2 + title: Naruto Shippuden + subtitle_language: fr + +? '[HorribleSubs] Ao Haru Ride - 06 [480p].mkv' +: episode: 6 + release_group: HorribleSubs + screen_size: 480p + title: Ao Haru Ride + +? '[DeadFish] Tari Tari - 01 [BD][720p][AAC].mp4' +: audio_codec: AAC + episode: 1 + source: Blu-ray + release_group: DeadFish + screen_size: 720p + title: Tari Tari + +? '[NoobSubs] Sword Art Online II 06 (720p 8bit AAC).mp4' +: audio_codec: AAC + episode: 6 + release_group: NoobSubs + screen_size: 720p + title: Sword Art Online II + color_depth: 8-bit + +? '[DeadFish] 01 - Tari Tari [BD][720p][AAC].mp4' +: audio_codec: AAC + episode: 1 + source: Blu-ray + release_group: DeadFish + screen_size: 720p + title: Tari Tari + +? '[NoobSubs] 06 Sword Art Online II (720p 8bit AAC).mp4' +: audio_codec: AAC + episode: 6 + release_group: NoobSubs + screen_size: 720p + title: Sword Art Online II + color_depth: 8-bit + +? '[DeadFish] 12 - Tari Tari [BD][720p][AAC].mp4' +: audio_codec: AAC + episode: 12 + source: Blu-ray + release_group: DeadFish + screen_size: 720p + title: Tari Tari + +? Something.Season.2.1of4.Ep.Title.HDTV.torrent +: episode_count: 4 + episode: 1 + source: HDTV + season: 2 + title: Something + episode_title: Title + container: torrent + +? Something.Season.2of5.3of9.Ep.Title.HDTV.torrent +: episode_count: 9 + episode: 3 + source: HDTV + season: 2 + season_count: 5 + title: Something + episode_title: Title + container: torrent + +? Something.Other.Season.3of5.Complete.HDTV.torrent +: source: HDTV + other: Complete + season: 3 + season_count: 5 + title: Something Other + container: torrent + +? Something.Other.Season.1-3.avi +: season: [1, 2, 3] + title: Something Other + +? Something.Other.Season.1&3.avi +: season: [1, 3] + title: Something Other + +? Something.Other.Season.1&3-1to12ep.avi +: season: [1, 3] + title: Something Other + +? W2Test.123.HDTV.XViD-FlexGet +: episode: 23 + season: 1 + source: HDTV + release_group: FlexGet + title: W2Test + video_codec: Xvid + +? W2Test.123.HDTV.XViD-FlexGet +: options: --episode-prefer-number + episode: 123 + source: HDTV + release_group: FlexGet + title: W2Test + video_codec: Xvid + +? FooBar.0307.PDTV-FlexGet +: episode: 7 + source: Digital TV + release_group: FlexGet + season: 3 + title: FooBar + +? FooBar.0307.PDTV-FlexGet +? FooBar.307.PDTV-FlexGet +: options: --episode-prefer-number + episode: 307 + source: Digital TV + release_group: FlexGet + title: FooBar + +? FooBar.07.PDTV-FlexGet +: episode: 7 + source: Digital TV + release_group: FlexGet + title: FooBar + +? FooBar.7.PDTV-FlexGet +: episode: 7 + source: Digital TV + release_group: FlexGet + title: FooBar + +? FooBar.0307.PDTV-FlexGet +: episode: 7 + source: Digital TV + release_group: FlexGet + season: 3 + title: FooBar + +? FooBar.307.PDTV-FlexGet +: episode: 7 + source: Digital TV + release_group: FlexGet + season: 3 + title: FooBar + +? FooBar.07.PDTV-FlexGet +: episode: 7 + source: Digital TV + release_group: FlexGet + title: FooBar + +? FooBar.07v4.PDTV-FlexGet +: episode: 7 + version: 4 + source: Digital TV + release_group: FlexGet + title: FooBar + +? FooBar.7.PDTV-FlexGet +: source: Digital TV + release_group: FlexGet + title: FooBar 7 + type: movie + +? FooBar.7.PDTV-FlexGet +: options: -t episode + episode: 7 + source: Digital TV + release_group: FlexGet + title: FooBar + +? FooBar.7v3.PDTV-FlexGet +: options: -t episode + episode: 7 + version: 3 + source: Digital TV + release_group: FlexGet + title: FooBar + +? Test.S02E01.hdtv.real.proper +: episode: 1 + source: HDTV + other: Proper + proper_count: 2 + season: 2 + title: Test + +? Real.Test.S02E01.hdtv.proper +: episode: 1 + source: HDTV + other: Proper + proper_count: 1 + season: 2 + title: Real Test + +? Test.Real.S02E01.hdtv.proper +: episode: 1 + source: HDTV + other: Proper + proper_count: 1 + season: 2 + title: Test Real + +? Test.S02E01.hdtv.proper +: episode: 1 + source: HDTV + other: Proper + proper_count: 1 + season: 2 + title: Test + +? Test.S02E01.hdtv.real.repack.proper +: episode: 1 + source: HDTV + other: Proper + proper_count: 3 + season: 2 + title: Test + +? Date.Show.03-29-2012.HDTV.XViD-FlexGet +: date: 2012-03-29 + source: HDTV + release_group: FlexGet + title: Date Show + video_codec: Xvid + +? Something.1x5.Season.Complete-FlexGet +: episode: 5 + other: Complete + season: 1 + title: Something + release_group: FlexGet + +? Something Seasons 1 & 2 - Complete +: other: Complete + season: + - 1 + - 2 + title: Something + +? Something Seasons 4 Complete +: other: Complete + season: 4 + title: Something + +? Something.1xAll.Season.Complete-FlexGet +: other: Complete + season: 1 + title: Something + release_group: FlexGet + +? Something.1xAll-FlexGet +: other: Complete + season: 1 + title: Something + release_group: FlexGet + +? FlexGet.US.S2013E14.Title.Here.720p.HDTV.AAC5.1.x264-NOGRP +: audio_channels: '5.1' + audio_codec: AAC + country: US + episode: 14 + source: HDTV + release_group: NOGRP + screen_size: 720p + season: 2013 + title: FlexGet + episode_title: Title Here + video_codec: H.264 + year: 2013 + +? FlexGet.14.of.21.Title.Here.720p.HDTV.AAC5.1.x264-NOGRP +: audio_channels: '5.1' + audio_codec: AAC + episode_count: 21 + episode: 14 + source: HDTV + release_group: NOGRP + screen_size: 720p + title: FlexGet + episode_title: Title Here + video_codec: H.264 + +? FlexGet.Series.2013.14.of.21.Title.Here.720p.HDTV.AAC5.1.x264-NOGRP +: audio_channels: '5.1' + audio_codec: AAC + episode_count: 21 + episode: 14 + source: HDTV + release_group: NOGRP + screen_size: 720p + season: 2013 + title: FlexGet Series + episode_title: Title Here + video_codec: H.264 + year: 2013 + +? Something.S04E05E09 +: episode: # 1.x guessit this as a range from 5 to 9. But not sure if it should ... + - 5 + - 9 + season: 4 + title: Something + +? FooBar 360 1080i +: options: --episode-prefer-number + episode: 360 + screen_size: 1080i + title: FooBar + +? FooBar 360 1080i +: episode: 60 + season: 3 + screen_size: 1080i + title: FooBar + +? FooBar 360 +: season: 3 + episode: 60 + title: FooBar + -screen_size: 360p + +? BarFood christmas special HDTV +: options: --expected-title BarFood + source: HDTV + title: BarFood + episode_title: christmas special + episode_details: Special + +? Something.2008x12.13-FlexGet +: title: Something + date: 2008-12-13 + episode_title: FlexGet + +? '[Ignored] Test 12' +: episode: 12 + release_group: Ignored + title: Test + +? '[FlexGet] Test 12' +: episode: 12 + release_group: FlexGet + title: Test + +? Test.13.HDTV-Ignored +: episode: 13 + source: HDTV + release_group: Ignored + title: Test + +? Test.13.HDTV-Ignored +: options: --expected-series test + episode: 13 + source: HDTV + release_group: Ignored + title: Test + +? Test.13.HDTV-Ignored +: title: Test + episode: 13 + source: HDTV + release_group: Ignored + +? Test.13.HDTV-Ignored +: episode: 13 + source: HDTV + release_group: Ignored + title: Test + +? Test.13.HDTV-FlexGet +: episode: 13 + source: HDTV + release_group: FlexGet + title: Test + +? Test.14.HDTV-Name +: episode: 14 + source: HDTV + release_group: Name + title: Test + +? Real.Time.With.Bill.Maher.2014.10.31.HDTV.XviD-AFG.avi +: date: 2014-10-31 + source: HDTV + release_group: AFG + title: Real Time With Bill Maher + video_codec: Xvid + +? Arrow.S03E21.Al.Sah-Him.1080p.WEB-DL.DD5.1.H.264-BS.mkv +: title: Arrow + season: 3 + episode: 21 + episode_title: Al Sah-Him + screen_size: 1080p + audio_codec: Dolby Digital + audio_channels: "5.1" + video_codec: H.264 + release_group: BS + source: Web + +? How to Make It in America - S02E06 - I'm Sorry, Who's Yosi?.mkv +: title: How to Make It in America + season: 2 + episode: 6 + episode_title: I'm Sorry, Who's Yosi? + +? 24.S05E07.FRENCH.DVDRip.XviD-FiXi0N.avi +: episode: 7 + source: DVD + other: Rip + language: fr + season: 5 + title: '24' + video_codec: Xvid + release_group: FiXi0N + +? 12.Monkeys.S01E12.FRENCH.BDRip.x264-VENUE.mkv +: episode: 12 + source: Blu-ray + other: Rip + language: fr + release_group: VENUE + season: 1 + title: 12 Monkeys + video_codec: H.264 + +? 90.Day.Fiance.S02E07.I.Have.To.Tell.You.Something.720p.HDTV.x264-W4F +: episode: 7 + source: HDTV + screen_size: 720p + season: 2 + title: 90 Day Fiance + episode_title: I Have To Tell You Something + release_group: W4F + +? Doctor.Who.2005.S04E06.FRENCH.LD.DVDRip.XviD-TRACKS.avi +: episode: 6 + source: DVD + language: fr + release_group: TRACKS + season: 4 + title: Doctor Who + other: [Line Dubbed, Rip] + video_codec: Xvid + year: 2005 + +? Astro.Le.Petit.Robot.S01E01+02.FRENCH.DVDRiP.X264.INT-BOOLZ.mkv +: episode: [1, 2] + source: DVD + other: Rip + language: fr + release_group: INT-BOOLZ + season: 1 + title: Astro Le Petit Robot + video_codec: H.264 + +? Annika.Bengtzon.2012.E01.Le.Testament.De.Nobel.FRENCH.DVDRiP.XViD-STVFRV.avi +: episode: 1 + source: DVD + other: Rip + language: fr + release_group: STVFRV + title: Annika Bengtzon + episode_title: Le Testament De Nobel + video_codec: Xvid + year: 2012 + +? Dead.Set.02.FRENCH.LD.DVDRip.XviD-EPZ.avi +: episode: 2 + source: DVD + language: fr + other: [Line Dubbed, Rip] + release_group: EPZ + title: Dead Set + video_codec: Xvid + +? Phineas and Ferb S01E00 & S01E01 & S01E02 +: episode: [0, 1, 2] + season: 1 + title: Phineas and Ferb + +? Show.Name.S01E02.S01E03.HDTV.XViD.Etc-Group +: episode: [2, 3] + source: HDTV + release_group: Etc-Group + season: 1 + title: Show Name + video_codec: Xvid + +? Show Name - S01E02 - S01E03 - S01E04 - Ep Name +: episode: [2, 3, 4] + season: 1 + title: Show Name + episode_title: Ep Name + +? Show.Name.1x02.1x03.HDTV.XViD.Etc-Group +: episode: [2, 3] + source: HDTV + release_group: Etc-Group + season: 1 + title: Show Name + video_codec: Xvid + +? Show Name - 1x02 - 1x03 - 1x04 - Ep Name +: episode: [2, 3, 4] + season: 1 + title: Show Name + episode_title: Ep Name + +? Show.Name.S01E02.HDTV.XViD.Etc-Group +: episode: 2 + source: HDTV + release_group: Etc-Group + season: 1 + title: Show Name + video_codec: Xvid + +? Show Name - S01E02 - My Ep Name +: episode: 2 + season: 1 + title: Show Name + episode_title: My Ep Name + +? Show Name - S01.E03 - My Ep Name +: episode: 3 + season: 1 + title: Show Name + episode_title: My Ep Name + +? Show.Name.S01E02E03.HDTV.XViD.Etc-Group +: episode: [2, 3] + source: HDTV + release_group: Etc-Group + season: 1 + title: Show Name + video_codec: Xvid + +? Show Name - S01E02-03 - My Ep Name +: episode: [2, 3] + season: 1 + title: Show Name + episode_title: My Ep Name + +? Show.Name.S01.E02.E03 +: episode: [2, 3] + season: 1 + title: Show Name + +? Show_Name.1x02.HDTV_XViD_Etc-Group +: episode: 2 + source: HDTV + release_group: Etc-Group + season: 1 + title: Show Name + video_codec: Xvid + +? Show Name - 1x02 - My Ep Name +: episode: 2 + season: 1 + title: Show Name + episode_title: My Ep Name + +? Show_Name.1x02x03x04.HDTV_XViD_Etc-Group +: episode: [2, 3, 4] + source: HDTV + release_group: Etc-Group + season: 1 + title: Show Name + video_codec: Xvid + +? Show Name - 1x02-03-04 - My Ep Name +: episode: [2, 3, 4] + season: 1 + title: Show Name + episode_title: My Ep Name + +# 1x guess this as episode 100 but 101 as episode 1 season 1. +? Show.Name.100.Event.2010.11.23.HDTV.XViD.Etc-Group +: date: 2010-11-23 + season: 1 + episode: 0 + source: HDTV + release_group: Etc-Group + title: Show Name + episode_title: Event + video_codec: Xvid + +? Show.Name.101.Event.2010.11.23.HDTV.XViD.Etc-Group +: date: 2010-11-23 + season: 1 + episode: 1 + source: HDTV + release_group: Etc-Group + title: Show Name + episode_title: Event + video_codec: Xvid + +? Show.Name.2010.11.23.HDTV.XViD.Etc-Group +: date: 2010-11-23 + source: HDTV + release_group: Etc-Group + title: Show Name + +? Show Name - 2010-11-23 - Ep Name +: date: 2010-11-23 + title: Show Name + episode_title: Ep Name + +? Show Name Season 1 Episode 2 Ep Name +: episode: 2 + season: 1 + title: Show Name + episode_title: Ep Name + +? Show.Name.S01.HDTV.XViD.Etc-Group +: source: HDTV + release_group: Etc-Group + season: 1 + title: Show Name + video_codec: Xvid + +? Show.Name.E02-03 +: episode: [2, 3] + title: Show Name + +? Show.Name.E02.2010 +: episode: 2 + year: 2010 + title: Show Name + +? Show.Name.E23.Test +: episode: 23 + title: Show Name + episode_title: Test + +? Show.Name.Part.3.HDTV.XViD.Etc-Group +: part: 3 + title: Show Name + source: HDTV + video_codec: Xvid + release_group: Etc-Group + type: movie + # Fallback to movie type because we can't tell it's a series ... + +? Show.Name.Part.1.and.Part.2.Blah-Group +: part: [1, 2] + title: Show Name + type: movie + # Fallback to movie type because we can't tell it's a series ... + +? Show Name - 01 - Ep Name +: episode: 1 + title: Show Name + episode_title: Ep Name + +? 01 - Ep Name +: episode: 1 + title: Ep Name + +? Show.Name.102.HDTV.XViD.Etc-Group +: episode: 2 + source: HDTV + release_group: Etc-Group + season: 1 + title: Show Name + video_codec: Xvid + +? '[HorribleSubs] Maria the Virgin Witch - 01 [720p].mkv' +: episode: 1 + release_group: HorribleSubs + screen_size: 720p + title: Maria the Virgin Witch + +? '[ISLAND]One_Piece_679_[VOSTFR]_[V1]_[8bit]_[720p]_[EB7838FC].mp4' +: crc32: EB7838FC + episode: 679 + release_group: ISLAND + screen_size: 720p + title: One Piece + subtitle_language: fr + color_depth: 8-bit + version: 1 + +? '[ISLAND]One_Piece_679_[VOSTFR]_[8bit]_[720p]_[EB7838FC].mp4' +: crc32: EB7838FC + episode: 679 + release_group: ISLAND + screen_size: 720p + title: One Piece + subtitle_language: fr + color_depth: 8-bit + +? '[Kaerizaki-Fansub]_One_Piece_679_[VOSTFR][HD_1280x720].mp4' +: episode: 679 + other: HD + release_group: Kaerizaki-Fansub + screen_size: 720p + title: One Piece + subtitle_language: fr + +? '[Kaerizaki-Fansub]_One_Piece_679_[VOSTFR][FANSUB][HD_1280x720].mp4' +: episode: 679 + other: [Fan Subtitled, HD] + release_group: Kaerizaki-Fansub + screen_size: 720p + title: One Piece + subtitle_language: fr + +? '[Kaerizaki-Fansub]_One_Piece_681_[VOSTFR][HD_1280x720]_V2.mp4' +: episode: 681 + other: HD + release_group: Kaerizaki-Fansub + screen_size: 720p + title: One Piece + subtitle_language: fr + version: 2 + +? '[Kaerizaki-Fansub] High School DxD New 04 VOSTFR HD (1280x720) V2.mp4' +: episode: 4 + other: HD + release_group: Kaerizaki-Fansub + screen_size: 720p + title: High School DxD New + subtitle_language: fr + version: 2 + +? '[Kaerizaki-Fansub] One Piece 603 VOSTFR PS VITA (960x544) V2.mp4' +: episode: 603 + release_group: Kaerizaki-Fansub + other: PS Vita + screen_size: 960x544 + title: One Piece + subtitle_language: fr + version: 2 + +? '[Group Name] Show Name.13' +: episode: 13 + release_group: Group Name + title: Show Name + +? '[Group Name] Show Name - 13' +: episode: 13 + release_group: Group Name + title: Show Name + +? '[Group Name] Show Name 13' +: episode: 13 + release_group: Group Name + title: Show Name + +# [Group Name] Show Name.13-14 +# [Group Name] Show Name - 13-14 +# Show Name 13-14 + +? '[Stratos-Subs]_Infinite_Stratos_-_12_(1280x720_H.264_AAC)_[379759DB]' +: audio_codec: AAC + crc32: 379759DB + episode: 12 + release_group: Stratos-Subs + screen_size: 720p + title: Infinite Stratos + video_codec: H.264 + +# [ShinBunBu-Subs] Bleach - 02-03 (CX 1280x720 x264 AAC) + +? '[SGKK] Bleach 312v1 [720p/MKV]' +: episode: 312 + release_group: SGKK + screen_size: 720p + title: Bleach + version: 1 + +? '[Ayako]_Infinite_Stratos_-_IS_-_07_[H264][720p][EB7838FC]' +: crc32: EB7838FC + episode: 7 + release_group: Ayako + screen_size: 720p + title: Infinite Stratos + video_codec: H.264 + +? '[Ayako] Infinite Stratos - IS - 07v2 [H264][720p][44419534]' +: crc32: '44419534' + episode: 7 + release_group: Ayako + screen_size: 720p + title: Infinite Stratos + video_codec: H.264 + version: 2 + +? '[Ayako-Shikkaku] Oniichan no Koto Nanka Zenzen Suki Janain Dakara ne - 10 [LQ][h264][720p] [8853B21C]' +: crc32: 8853B21C + episode: 10 + release_group: Ayako-Shikkaku + screen_size: 720p + title: Oniichan no Koto Nanka Zenzen Suki Janain Dakara ne + video_codec: H.264 + +? Bleach - s16e03-04 - 313-314 +? Bleach.s16e03-04.313-314-GROUP +? Bleach s16e03e04 313-314 +: title: Bleach + season: 16 + episode: [3, 4] + absolute_episode: [313, 314] + +? Bleach - 313-314 +: options: -E + episode: [313, 314] + title: Bleach + +? '[ShinBunBu-Subs] Bleach - 02-03 (CX 1280x720 x264 AAC)' +: audio_codec: AAC + episode: [2, 3] + release_group: ShinBunBu-Subs + screen_size: 720p + title: Bleach + video_codec: H.264 + +? 003. Show Name - Ep Name.avi +: episode: 3 + title: Show Name + episode_title: Ep Name + +? 003-004. Show Name - Ep Name.avi +: episode: [3, 4] + title: Show Name + episode_title: Ep Name + +? One Piece - 102 +: episode: 2 + season: 1 + title: One Piece + +? "[ACX]_Wolf's_Spirit_001.mkv" +: episode: 1 + release_group: ACX + title: "Wolf's Spirit" + +? Project.Runway.S14E00.and.S14E01.(Eng.Subs).SDTV.x264-[2Maverick].mp4 +: episode: [0, 1] + source: TV + release_group: 2Maverick + season: 14 + title: Project Runway + subtitle_language: en + video_codec: H.264 + +? '[Hatsuyuki-Kaitou]_Fairy_Tail_2_-_16-20_[720p][10bit].torrent' +: episode: [16, 17, 18, 19, 20] + release_group: Hatsuyuki-Kaitou + screen_size: 720p + title: Fairy Tail 2 + color_depth: 10-bit + +? '[Hatsuyuki-Kaitou]_Fairy_Tail_2_-_16-20_(191-195)_[720p][10bit].torrent' +: episode: [16, 17, 18, 19, 20] + absolute_episode: [191, 192, 193, 194, 195] + release_group: Hatsuyuki-Kaitou + screen_size: 720p + title: Fairy Tail 2 + +? "Looney Tunes 1940x01 Porky's Last Stand.mkv" +: episode: 1 + season: 1940 + title: Looney Tunes + episode_title: Porky's Last Stand + year: 1940 + +? The.Good.Wife.S06E01.E10.720p.WEB-DL.DD5.1.H.264-CtrlHD/The.Good.Wife.S06E09.Trust.Issues.720p.WEB-DL.DD5.1.H.264-CtrlHD.mkv +: audio_channels: '5.1' + audio_codec: Dolby Digital + episode: 9 + source: Web + release_group: CtrlHD + screen_size: 720p + season: 6 + title: The Good Wife + episode_title: Trust Issues + video_codec: H.264 + +? Fear the Walking Dead - 01x02 - So Close, Yet So Far.REPACK-KILLERS.French.C.updated.Addic7ed.com.mkv +: episode: 2 + language: fr + other: Proper + proper_count: 1 + season: 1 + title: Fear the Walking Dead + episode_title: So Close, Yet So Far + +? Fear the Walking Dead - 01x02 - En Close, Yet En Far.REPACK-KILLERS.French.C.updated.Addic7ed.com.mkv +: episode: 2 + language: fr + other: Proper + proper_count: 1 + season: 1 + title: Fear the Walking Dead + episode_title: En Close, Yet En Far + +? /av/unsorted/The.Daily.Show.2015.07.22.Jake.Gyllenhaal.720p.HDTV.x264-BATV.mkv +: date: 2015-07-22 + source: HDTV + release_group: BATV + screen_size: 720p + title: The Daily Show + episode_title: Jake Gyllenhaal + video_codec: H.264 + +? "[7.1.7.8.5] Foo Bar - 11 (H.264) [5235532D].mkv" +: episode: 11 + +? my 720p show S01E02 +: options: -T "my 720p show" + title: my 720p show + season: 1 + episode: 2 + +? my 720p show S01E02 720p +: options: -T "my 720p show" + title: my 720p show + season: 1 + episode: 2 + screen_size: 720p + +? -my 720p show S01E02 +: options: -T "re:my \d+p show" + screen_size: 720p + +? Show S01E02 +: options: -T "The Show" + title: Show + season: 1 + episode: 2 + +? Foo's & Bars (2009) S01E01 720p XviD-2HD[AOEU] +: episode: 1 + release_group: 2HD[AOEU] + screen_size: 720p + season: 1 + title: Foo's & Bars + video_codec: Xvid + year: 2009 + +? Date.Series.10-11-2008.XViD +: date: 2008-11-10 + title: Date Series + video_codec: Xvid + +? Scrubs/SEASON-06/Scrubs.S06E09.My.Perspective.DVDRip.XviD-WAT/scrubs.s06e09.dvdrip.xvid-wat.avi +: container: avi + episode: 9 + episode_title: My Perspective + source: DVD + other: Rip + release_group: WAT + season: 6 + title: Scrubs + video_codec: Xvid + +? '[PuyaSubs!] Digimon Adventure tri - 01 [720p][F9967949].mkv' +: container: mkv + crc32: F9967949 + episode: 1 + release_group: PuyaSubs! + screen_size: 720p + title: Digimon Adventure tri + +? Sherlock.S01.720p.BluRay.x264-AVCHD +: source: Blu-ray + screen_size: 720p + season: 1 + title: Sherlock + video_codec: H.264 + +? Running.Wild.With.Bear.Grylls.S02E07.Michael.B.Jordan.PROPER.HDTV.x264-W4F.avi +: container: avi + episode: 7 + episode_title: Michael B Jordan + source: HDTV + other: Proper + proper_count: 1 + release_group: W4F + season: 2 + title: Running Wild With Bear Grylls + video_codec: H.264 + +? Homeland.S05E11.Our.Man.in.Damascus.German.Sub.720p.HDTV.x264.iNTERNAL-BaCKToRG +: episode: 11 + episode_title: Our Man in Damascus + source: HDTV + other: Internal + release_group: BaCKToRG + screen_size: 720p + season: 5 + subtitle_language: de + title: Homeland + type: episode + video_codec: H.264 + +? Breaking.Bad.S01E01.2008.BluRay.VC1.1080P.5.1.WMV-NOVO +: title: Breaking Bad + season: 1 + episode: 1 + year: 2008 + source: Blu-ray + screen_size: 1080p + audio_channels: '5.1' + container: WMV + release_group: NOVO + type: episode + +? Cosmos.A.Space.Time.Odyssey.S01E02.HDTV.x264.PROPER-LOL +: title: Cosmos A Space Time Odyssey + season: 1 + episode: 2 + source: HDTV + video_codec: H.264 + other: Proper + proper_count: 1 + release_group: LOL + type: episode + +? Fear.The.Walking.Dead.S02E01.HDTV.x264.AAC.MP4-k3n +: title: Fear The Walking Dead + season: 2 + episode: 1 + source: HDTV + video_codec: H.264 + audio_codec: AAC + container: mp4 + release_group: k3n + type: episode + +? Elementary.S01E01.Pilot.DVDSCR.x264.PREAiR-NoGRP +: title: Elementary + season: 1 + episode: 1 + episode_details: Pilot + episode_title: Pilot + source: DVD + video_codec: H.264 + other: [Screener, Preair] + release_group: NoGRP + type: episode + +? Once.Upon.a.Time.S05E19.HDTV.x264.REPACK-LOL[ettv] +: title: Once Upon a Time + season: 5 + episode: 19 + source: HDTV + video_codec: H.264 + other: Proper + proper_count: 1 + release_group: LOL[ettv] + type: episode + +? Show.Name.S01E03.WEB-DL.x264.HUN-nIk +: title: Show Name + season: 1 + episode: 3 + source: Web + video_codec: H.264 + language: hu + release_group: nIk + type: episode + +? Game.of.Thrones.S6.Ep5.X265.Dolby.2.0.KTM3.mp4 +: audio_channels: '2.0' + audio_codec: Dolby Digital + container: mp4 + episode: 5 + release_group: KTM3 + season: 6 + title: Game of Thrones + type: episode + video_codec: H.265 + +? Fargo.-.Season.1.-.720p.BluRay.-.x264.-.ShAaNiG +: source: Blu-ray + release_group: ShAaNiG + screen_size: 720p + season: 1 + title: Fargo + type: episode + video_codec: H.264 + +? Show.Name.S02E02.Episode.Title.1080p.WEB-DL.x264.5.1Ch.-.Group +: audio_channels: '5.1' + episode: 2 + episode_title: Episode Title + source: Web + release_group: Group + screen_size: 1080p + season: 2 + title: Show Name + type: episode + video_codec: H.264 + +? Breaking.Bad.S01E01.2008.BluRay.VC1.1080P.5.1.WMV-NOVO +: audio_channels: '5.1' + container: wmv + episode: 1 + source: Blu-ray + release_group: NOVO + screen_size: 1080p + season: 1 + title: Breaking Bad + type: episode + year: 2008 + +? Cosmos.A.Space.Time.Odyssey.S01E02.HDTV.x264.PROPER-LOL +: episode: 2 + source: HDTV + other: Proper + proper_count: 1 + release_group: LOL + season: 1 + title: Cosmos A Space Time Odyssey + type: episode + video_codec: H.264 + +? Elementary.S01E01.Pilot.DVDSCR.x264.PREAiR-NoGRP +: episode: 1 + episode_details: Pilot + episode_title: Pilot + source: DVD + other: + - Screener + - Preair + release_group: NoGRP + season: 1 + title: Elementary + type: episode + video_codec: H.264 + +? Fear.The.Walking.Dead.S02E01.HDTV.x264.AAC.MP4-k3n.mp4 +: audio_codec: AAC + container: mp4 + episode: 1 + source: HDTV + release_group: k3n + season: 2 + title: Fear The Walking Dead + type: episode + video_codec: H.264 + +? Game.of.Thrones.S03.1080p.BluRay.DTS-HD.MA.5.1.AVC.REMUX-FraMeSToR +: audio_channels: '5.1' + audio_codec: DTS-HD + audio_profile: Master Audio + source: Blu-ray + other: Remux + release_group: FraMeSToR + screen_size: 1080p + season: 3 + title: Game of Thrones + type: episode + +? Show.Name.S01E02.HDTV.x264.NL-subs-ABC +: episode: 2 + source: HDTV + release_group: ABC + season: 1 + subtitle_language: nl + title: Show Name + type: episode + video_codec: H.264 + +? Friends.S01-S10.COMPLETE.720p.BluRay.x264-PtM +: source: Blu-ray + other: Complete + release_group: PtM + screen_size: 720p + season: # Should it be [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ? + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + title: Friends + type: episode + video_codec: H.264 + +? Duck.Dynasty.S02E07.Streik.German.DOKU.DL.WS.DVDRiP.x264-CDP +: episode: 7 + episode_title: Streik + source: DVD + language: + - German + - Multi + other: [Documentary, Widescreen, Rip] + release_group: CDP + season: 2 + title: Duck Dynasty + type: episode + video_codec: H.264 + +? Family.Guy.S13E14.JOLO.German.AC3D.DL.720p.WebHD.x264-CDD +: audio_codec: Dolby Digital + episode: 14 + episode_title: JOLO + source: Web + language: + - German + - Multi + release_group: CDD + screen_size: 720p + season: 13 + title: Family Guy + type: episode + video_codec: H.264 + +? How.I.Met.Your.Mother.COMPLETE.SERIES.DVDRip.XviD-AR +: options: -L en -C us + source: DVD + other: [Complete, Rip] + release_group: AR + title: How I Met Your Mother + type: movie # Should be episode + video_codec: Xvid + +? Show Name The Complete Seasons 1 to 5 720p BluRay x265 HEVC-SUJAIDR[UTR] +: source: Blu-ray + other: Complete + release_group: SUJAIDR[UTR] + screen_size: 720p + season: + - 1 + - 2 + - 3 + - 4 + - 5 + title: Show Name + type: episode + video_codec: H.265 + +? Fear.the.Walking.Dead.-.Season.2.epi.02.XviD.Eng.Ac3-5.1.sub.ita.eng.iCV-MIRCrew +: options: -t episode + audio_channels: '5.1' + audio_codec: Dolby Digital + episode: 2 + episode_title: epi + language: en + release_group: iCV-MIRCrew + season: 2 + subtitle_language: it + title: Fear the Walking Dead + type: episode + video_codec: Xvid + +? Game.Of.Thrones.S06E04.720p.PROPER.HDTV.x264-HDD +: episode: 4 + source: HDTV + other: Proper + proper_count: 1 + release_group: HDD + screen_size: 720p + season: 6 + title: Game Of Thrones + type: episode + video_codec: H.264 + +? Marvels.Daredevil.S02E04.WEBRip.x264-NF69.mkv +: container: mkv + episode: 4 + source: Web + other: Rip + release_group: NF69 + season: 2 + title: Marvels Daredevil + type: episode + video_codec: H.264 + +? The.Walking.Dead.S06E01.FRENCH.1080p.WEB-DL.DD5.1.HEVC.x265-GOLF68 +: audio_channels: '5.1' + audio_codec: Dolby Digital + episode: 1 + source: Web + language: fr + release_group: GOLF68 + screen_size: 1080p + season: 6 + title: The Walking Dead + type: episode + video_codec: H.265 + +? American.Crime.S01E03.FASTSUB.VOSTFR.720p.HDTV.x264-F4ST +: episode: 3 + source: HDTV + other: Fast Subtitled + release_group: F4ST + screen_size: 720p + season: 1 + subtitle_language: fr + title: American Crime + type: episode + video_codec: H.264 + +? Gotham.S02E12.FASTSUB.VOSTFR.HDTV.X264-F4ST3R +: episode: 12 + source: HDTV + other: Fast Subtitled + release_group: F4ST3R + season: 2 + subtitle_language: fr + title: Gotham + type: episode + video_codec: H.264 + +# WEBRip + LD +? Australian.Story.2016.05.23.Into.The.Fog.of.War.Part.1.360p.LDTV.WEBRIP.[MPup] +: title: Australian Story + date: 2016-05-23 + episode_title: Into The Fog of War + part: 1 + screen_size: 360p + other: [Low Definition, Rip] + source: Web + release_group: MPup + type: episode + +# AHDTV +? Show.Name.S04E06.FRENCH.AHDTV.XviD +: title: Show Name + season: 4 + episode: 6 + language: fr + source: Analog HDTV + video_codec: Xvid + type: episode + +# WEBDLRip +? Show.Name.s06e14.WEBDLRip.-qqss44.avi +: title: Show Name + season: 6 + episode: 14 + source: Web + other: Rip + release_group: qqss44 + container: avi + type: episode + +# WEBCap +? Steven.Universe.S03E06.Steven.Floats.720p.WEBCap.x264-SRS +: title: Steven Universe + season: 3 + episode: 6 + episode_title: Steven Floats + screen_size: 720p + source: Web + other: Rip + video_codec: H.264 + release_group: SRS + type: episode + +# DSR +? Show.Name.S05E09.Some.Episode.Title.WS.DSR.x264-[NY2] +: title: Show Name + season: 5 + episode: 9 + episode_title: Some Episode Title + other: Widescreen + source: Satellite + video_codec: H.264 + release_group: NY2 + type: episode + +# DSRip +? Squidbillies.S04E05.WS.DSRip.XviD-aAF +: title: Squidbillies + season: 4 + episode: 5 + other: [Widescreen, Rip] + source: Satellite + video_codec: Xvid + release_group: aAF + type: episode + + +? /series/The.B*.B*.T*.S10E01.1080p.HDTV.X264-DIMENSION[rarbg]/The.B*.B*.T*.S10E01.1080p.HDTV.X264-DIMENSION.mkv +: container: mkv + episode: 1 + source: HDTV + release_group: DIMENSION + screen_size: 1080p + season: 10 + title: The B B T + type: episode + video_codec: H.264 + +? '[Y-F] Very long Show Name Here - 03 Vostfr HD 8bits' +: release_group: Y-F + title: Very long Show Name Here + episode: 3 + subtitle_language: fr + other: HD + color_depth: 8-bit + type: episode + +? '[.www.site.com.].-.Snooze.and.Go.Sleep.S03E02.1080p.HEVC.x265-MeGusta' +: episode: 2 + release_group: MeGusta + screen_size: 1080p + season: 3 + title: Snooze and Go Sleep + type: episode + video_codec: H.265 + website: www.site.com + +? Show.Name.S01.720p.HDTV.DD5.1.x264-Group/show.name.0106.720p-group.mkv +: title: Show Name + season: 1 + screen_size: 720p + source: HDTV + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: Group + episode: 6 + container: mkv + type: episode + + +? Coupling Season 1 - 4 Complete DVDRip/Coupling Season 4/Coupling - (4x03) - Bed Time.mkv +: title: Coupling + other: [Complete, Rip] + source: DVD + season: 4 + episode: 3 + episode_title: Bed Time + container: mkv + type: episode + + +? Vice.News.Tonight.2016.10.10.1080p.HBO.WEBRip.AAC2.0.H.264-monkee +: title: Vice News Tonight + date: 2016-10-10 + screen_size: 1080p + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +? frasier.s8e6-768660.srt +: container: srt + episode: 6 + episode_title: '768660' + season: 8 + title: frasier + type: episode + +? Show.Name.S03E15.480p.177mb.Proper.HDTV.x264 +: title: Show Name + season: 3 + episode: 15 + screen_size: 480p + size: 177MB + other: Proper + proper_count: 1 + source: HDTV + video_codec: H.264 + type: episode + +? Show.Name.S03E15.480p.4.8GB.Proper.HDTV.x264 +: title: Show Name + season: 3 + episode: 15 + screen_size: 480p + size: 4.8GB + other: Proper + proper_count: 1 + source: HDTV + video_codec: H.264 + type: episode + +? Show.Name.S03.1.1TB.Proper.HDTV.x264 +: title: Show Name + season: 3 + size: 1.1TB + other: Proper + proper_count: 1 + source: HDTV + video_codec: H.264 + type: episode + +? Some.Show.S02E14.1080p.HDTV.X264-reenc.GROUP +? Some.Show.S02E14.1080p.HDTV.X264-re-enc.GROUP +? Some.Show.S02E14.1080p.HDTV.X264-re-encoded.GROUP +? Some.Show.S02E14.1080p.HDTV.X264-reencoded.GROUP +: title: Some Show + season: 2 + episode: 14 + screen_size: 1080p + source: HDTV + video_codec: H.264 + other: Reencoded + release_group: GROUP + type: episode + +# DDP is DD+ +? Show.Name.2016.S01E01.2160p.AMZN.WEBRip.DDP5.1.x264-Group +: title: Show Name + year: 2016 + season: 1 + episode: 1 + screen_size: 2160p + streaming_service: Amazon Prime + source: Web + other: Rip + audio_codec: Dolby Digital Plus + audio_channels: '5.1' + video_codec: H.264 + release_group: Group + type: episode + +? Show Name S02e19 [Mux - H264 - Ita Aac] DLMux by UBi +: title: Show Name + season: 2 + episode: 19 + video_codec: H.264 + language: it + audio_codec: AAC + source: Web + other: Mux + release_group: UBi + type: episode + +? Show Name S01e10[Mux - 1080p - H264 - Ita Eng Ac3 - Sub Ita Eng]DLMux By GiuseppeTnT Littlelinx +: title: Show Name + season: 1 + episode: 10 + screen_size: 1080p + video_codec: H.264 + language: [it, en] + source: Web + other: Mux + audio_codec: Dolby Digital + subtitle_language: [it, en] + release_group: GiuseppeTnT Littlelinx + type: episode + +? Show Name S04e07-08 [H264 - Ita Aac] HDTVMux by Group +: title: Show Name + season: 4 + episode: [7, 8] + video_codec: H.264 + language: it + audio_codec: AAC + source: HDTV + other: Mux + release_group: Group + type: episode + +? Show Name 3x18 Un Tuffo Nel Passato ITA HDTVMux x264 Group +: title: Show Name + season: 3 + episode: 18 + episode_title: Un Tuffo Nel Passato + language: it + source: HDTV + other: Mux + video_codec: H.264 + release_group: Group + type: episode + +? Show.Name.S03.1080p.BlurayMUX.AVC.DTS-HD.MA +: title: Show Name + season: 3 + screen_size: 1080p + source: Blu-ray + other: Mux + video_codec: H.264 + audio_codec: DTS-HD + audio_profile: Master Audio + type: episode + +? Show.Name.-.07.(2016).[RH].[English.Dubbed][WEBRip]..[HD.1080p] +: options: -t episode + episode: 7 + source: Web + other: Rip + language: en + other: [HD, Rip] + screen_size: 1080p + title: Show Name + type: episode + year: 2016 + +? Show.Name.-.476-479.(2007).[HorribleSubs][WEBRip]..[HD.720p] +: options: -t episode + episode: + - 476 + - 477 + - 478 + - 479 + source: Web + other: [Rip, HD] + release_group: HorribleSubs + screen_size: 720p + title: Show Name + type: episode + year: 2007 + +? /11.22.63/Season 1/11.22.63.106.hdtv-abc +: options: -T 11.22.63 + title: 11.22.63 + season: 1 + episode: 6 + source: HDTV + release_group: abc + type: episode + +? Proof.2015.S01E10.1080p.WEB-DL.DD5.1.H.264-KINGS.mkv +: title: Proof + season: 1 + episode: 10 + screen_size: 1080p + source: Web + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: KINGS + container: mkv + type: episode + +# Hardcoded subtitles +? Show.Name.S06E16.HC.SWESUB.HDTV.x264 +: title: Show Name + season: 6 + episode: 16 + other: Hardcoded Subtitles + source: HDTV + video_codec: H.264 + subtitle_language: sv + type: episode + +? From [ WWW.TORRENTING.COM ] - White.Rabbit.Project.S01E08.1080p.NF.WEBRip.DD5.1.x264-ViSUM/White.Rabbit.Project.S01E08.1080p.NF.WEBRip.DD5.1.x264-ViSUM.mkv +: title: White Rabbit Project + website: WWW.TORRENTING.COM + season: 1 + episode: 8 + screen_size: 1080p + streaming_service: Netflix + source: Web + other: Rip + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: ViSUM + container: mkv + type: episode + +? /tv/Daniel Tiger's Neighborhood/S02E06 - Playtime Is Different.mp4 +: season: 2 + episode: 6 + title: Daniel Tiger's Neighborhood + episode_title: Playtime Is Different + container: mp4 + type: episode + +? Zoo.S02E05.1080p.WEB-DL.DD5.1.H.264.HKD/160725_02.mkv +: title: Zoo + season: 2 + episode: 5 + screen_size: 1080p + source: Web + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: HKD + container: mkv + type: episode + +? We.Bare.Bears.S01E14.Brother.Up.1080p.WEB-DL.AAC2.0.H.264-TVSmash/mxNMuJWeO7PUWCMEwqKSsS6D8Vs9S6V3PHD.mkv +: title: We Bare Bears + season: 1 + episode: 14 + episode_title: Brother Up + screen_size: 1080p + source: Web + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: TVSmash + container: mkv + type: episode + +? Beyond.S01E02.Tempus.Fugit.720p.FREE.WEBRip.AAC2.0.x264-BTW/gNWDXow11s7E0X7GTDrZ.mkv +: title: Beyond + season: 1 + episode: 2 + episode_title: Tempus Fugit + screen_size: 720p + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: BTW + container: mkv + type: episode + +? Bones.S12E02.The.Brain.In.The.Bot.1080p.WEB-DL.DD5.1.H.264-R2D2/161219_06.mkv +: title: Bones + season: 12 + episode: 2 + episode_title: The Brain In The Bot + screen_size: 1080p + source: Web + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: R2D2 + container: mkv + type: episode + +? The.Messengers.2015.S01E07.1080p.WEB-DL.DD5.1.H264.Nlsubs-Q/QoQ-sbuSLN.462.H.1.5DD.LD-BEW.p0801.70E10S.5102.sregnesseM.ehT.mkv +: title: The Messengers + year: 2015 + season: 1 + episode: 7 + screen_size: 1080p + source: Web + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + subtitle_language: nl + release_group: Q + container: mkv + type: episode + +? /Finding.Carter.S02E01.Love.the.Way.You.Lie.1080p.WEB-DL.AAC2.0.H.264-NL/LN-462.H.0.2CAA.LD-BEW.p0801.eiL.uoY.yaW.eht.evoL.10E20S.retraC.gnidniF.mkv +: title: Finding Carter + season: 2 + episode: 1 + episode_title: Love the Way You Lie + screen_size: 1080p + source: Web + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: NL + container: mkv + type: episode + +? Mr.Robot.S02E12.1080p.WEB-DL.DD5.1-NL.Subs-Het.Robot.Team.OYM/sbuS LN-1.5DD LD-BEW p0801 21E20S toboR .rM.mkv +: title: Mr Robot + season: 2 + episode: 12 + screen_size: 1080p + source: Web + audio_codec: Dolby Digital + audio_channels: '5.1' + release_group: Het.Robot.Team.OYM + type: episode + +? Show.Name.-.Temporada.1.720p.HDTV.x264[Cap.102]SPANISH.AUDIO-NEWPCT +? /Show Name/Season 01/Show.Name.-.Temporada.1.720p.HDTV.x264[Cap.102]SPANISH.AUDIO-NEWPCT +? /Show Name/Temporada 01/Show.Name.-.Temporada.1.720p.HDTV.x264[Cap.102]SPANISH.AUDIO-NEWPCT +: title: Show Name + season: 1 + episode: 2 + screen_size: 720p + source: HDTV + video_codec: H.264 + language: es + release_group: NEWPCT + type: episode + +# newpct +? Show Name - Temporada 4 [HDTV][Cap.408][Espanol Castellano] +? Show Name - Temporada 4 [HDTV][Cap.408][Español Castellano] +: title: Show Name + season: 4 + episode: 8 + source: HDTV + language: ca + type: episode + +# newpct +? -Show Name - Temporada 4 [HDTV][Cap.408][Espanol Castellano] +? -Show Name - Temporada 4 [HDTV][Cap.408][Español Castellano] +: release_group: Castellano + +# newpct +? Show.Name.-.Temporada1.[HDTV][Cap.105][Español.Castellano] +: title: Show Name + source: HDTV + season: 1 + episode: 5 + language: ca + type: episode + +# newpct +? Show.Name.-.Temporada1.[HDTV][Cap.105][Español] +: title: Show Name + source: HDTV + season: 1 + episode: 5 + language: es + type: episode + +# newpct - season and episode with range: +? Show.Name.-.Temporada.1.720p.HDTV.x264[Cap.102_104]SPANISH.AUDIO-NEWPCT +: title: Show Name + season: 1 + episode: [2, 3, 4] + screen_size: 720p + source: HDTV + video_codec: H.264 + language: es + release_group: NEWPCT + type: episode + +# newpct - season and episode (2 digit season) +? Show.Name.-.Temporada.15.720p.HDTV.x264[Cap.1503]SPANISH.AUDIO-NEWPCT +: title: Show Name + season: 15 + episode: 3 + screen_size: 720p + source: HDTV + video_codec: H.264 + language: es + release_group: NEWPCT + type: episode + +# newpct - season and episode (2 digit season with range) +? Show.Name.-.Temporada.15.720p.HDTV.x264[Cap.1503_1506]SPANISH.AUDIO-NEWPCT +: title: Show Name + season: 15 + episode: [3, 4, 5, 6] + screen_size: 720p + source: HDTV + video_codec: H.264 + language: es + release_group: NEWPCT + type: episode + +# newpct - season and episode: +? Show.Name.-.Temp.1.720p.HDTV.x264[Cap.102]SPANISH.AUDIO-NEWPCT +: title: Show Name + season: 1 + episode: 2 + screen_size: 720p + source: HDTV + video_codec: H.264 + language: es + release_group: NEWPCT + type: episode + +# newpct - season and episode: +? Show.Name.-.Tem.1.720p.HDTV.x264[Cap.102]SPANISH.AUDIO-NEWPCT +: title: Show Name + season: 1 + episode: 2 + screen_size: 720p + source: HDTV + video_codec: H.264 + language: es + release_group: NEWPCT + type: episode + +# newpct - season and episode: +? Show.Name.-.Tem.1.720p.HDTV.x264[Cap.112_114.Final]SPANISH.AUDIO-NEWPCT +: title: Show Name + season: 1 + episode: [12, 13, 14] + screen_size: 720p + source: HDTV + video_codec: H.264 + language: es + release_group: NEWPCT + episode_details: Final + type: episode + +? Mastercook Italia - Stagione 6 (2016) 720p ep13 spyro.mkv +: title: Mastercook Italia + season: 6 + episode: 13 + year: 2016 + screen_size: 720p + episode_title: spyro + container: mkv + type: episode + +? Mastercook Italia - Stagione 6 (2016) 720p Episodio 13 spyro.mkv +: title: Mastercook Italia + season: 6 + year: 2016 + screen_size: 720p + episode: 13 + episode_title: spyro + container: mkv + type: episode + +# Italian releases +? Show Name 3x18 Un Tuffo Nel Passato ITA HDTVMux x264 NovaRip +: title: Show Name + season: 3 + episode: 18 + episode_title: Un Tuffo Nel Passato + language: it + source: HDTV + other: Mux + video_codec: H.264 + release_group: NovaRip + type: episode + +# Italian releases +? Show Name 3x18 Un Tuffo Nel Passato ITA HDTVMux x264 NovaRip +: title: Show Name + season: 3 + episode: 18 + episode_title: Un Tuffo Nel Passato + language: it + source: HDTV + other: Mux + video_codec: H.264 + release_group: NovaRip + type: episode + +# Subbed: No language hint +? Show.Name.S06E03.1080p.HDTV.Legendado +: subtitle_language: und + +# Subbed: No language hint +? Show.Name.S01E09.Subbed.1080p.BluRay.x264-RRH +: title: Show Name + season: 1 + episode: 9 + subtitle_language: und + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + release_group: RRH + type: episode + +# Legendado PT-BR +? Show.Name.S06E05.1080p.WEBRip.Legendado.PT-BR +? Show.Name.S06E05.1080p.WEBRip.Legendas.PT-BR +? Show.Name.S06E05.1080p.WEBRip.Legenda.PT-BR +: title: Show Name + season: 6 + episode: 5 + screen_size: 1080p + source: Web + other: Rip + subtitle_language: pt-BR + type: episode + +? Show.Name.S01E07.Super, Title.WEB-DL 720p.br.srt +: title: Show Name + season: 1 + episode: 7 + episode_title: Super, Title + source: Web + screen_size: 720p + subtitle_language: pt-BR + container: srt + type: episode + +? -Show.Name.S01E07.Super, Title.WEB-DL 720p.br.srt +: language: pt-BR + +# Legendado PT +? Show.Name.S06E05.1080p.WEBRip.Legendado.PT +: title: Show Name + season: 6 + episode: 5 + screen_size: 1080p + source: Web + other: Rip + subtitle_language: pt + type: episode + +? Show.Name.S05E01.SPANISH.SUBBED.720p.HDTV.x264-sPHD +: title: Show Name + season: 5 + episode: 1 + subtitle_language: spa + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: sPHD + type: episode + +? Show.Name.S01E01.German.Subbed.HDTV.XviD-ASAP +: title: Show Name + season: 1 + episode: 1 + subtitle_language: deu + source: HDTV + video_codec: Xvid + release_group: ASAP + type: episode + +? Show.Name.S04E21.Aint.Nothing.Like.the.Real.Thing.German.Custom.Subbed.720p.HDTV.x264.iNTERNAL-BaCKToRG +: title: Show Name + season: 4 + episode: 21 + episode_title: Aint Nothing Like the Real Thing + subtitle_language: deu + screen_size: 720p + source: HDTV + video_codec: H.264 + type: episode + +? Show.Name.S01.Season.Complet.WEBRiP.Ro.Subbed.TM +: title: Show Name + season: 1 + other: [Complete, Rip] + source: Web + subtitle_language: ro + type: episode + +? Show.Name.(2013).Season.3.-.Eng.Soft.Subtitles.720p.WEBRip.x264.[MKV,AC3,5.1].Ehhhh +: title: Show Name + year: 2013 + season: 3 + subtitle_language: en + screen_size: 720p + source: Web + other: Rip + video_codec: H.264 + container: mkv + audio_codec: Dolby Digital + audio_channels: '5.1' + release_group: Ehhhh + type: episode + +# Dublado +? Show.Name.S02E03.720p.HDTV.x264-Belex.-.Dual.Audio.-.Dublado +: title: Show Name + season: 2 + episode: 3 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: Belex + other: Dual Audio + language: und + type: episode + +? Show.Name.S06E10.1080p.WEB-DL.DUAL.[Dublado].RK +: title: Show Name + season: 6 + episode: 10 + screen_size: 1080p + source: Web + other: Dual Audio + language: und + release_group: RK + type: episode + +? Show.Name.S06E12.720p.WEB-DL.Dual.Audio.Dublado +: title: Show Name + season: 6 + episode: 12 + screen_size: 720p + source: Web + other: Dual Audio + language: und + type: episode + +? Show.Name.S05E07.720p.DUBLADO.HDTV.x264-0SEC-pia.mkv +: title: Show Name + season: 5 + episode: 7 + screen_size: 720p + language: und + source: HDTV + video_codec: H.264 + release_group: 0SEC-pia + container: mkv + type: episode + +? Show.Name.S02E07.Shiva.AC3.Dubbed.WEBRip.x264 +: title: Show Name + season: 2 + episode: 7 + episode_title: Shiva + audio_codec: Dolby Digital + language: und + source: Web + other: Rip + video_codec: H.264 + type: episode + +# Legendas +? Show.Name.S05.1080p.BluRay.x264-Belex.-.Dual.Audio.+.Legendas +: title: Show Name + season: 5 + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + release_group: Belex + other: Dual Audio + subtitle_language: und + type: episode + +# Legendas +? Show.Name.S05.1080p.BluRay.x264-Belex.-.Dual.Audio.+.Legendas +: title: Show Name + season: 5 + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + release_group: Belex + other: Dual Audio + subtitle_language: und + type: episode + +# Subtitulado +? Show.Name.S01E03.HDTV.Subtitulado.Esp.SC +? Show.Name.S01E03.HDTV.Subtitulado.Espanol.SC +? Show.Name.S01E03.HDTV.Subtitulado.Español.SC +: title: Show Name + season: 1 + episode: 3 + source: HDTV + subtitle_language: es + release_group: SC + type: episode + +# Subtitles/Subbed +? Show.Name.S02E08.720p.WEB-DL.Subtitles +? Show.Name.S02E08.Subbed.720p.WEB-DL +: title: Show Name + season: 2 + episode: 8 + screen_size: 720p + source: Web + subtitle_language: und + type: episode + +# Dubbed +? Show.Name.s01e01.german.Dubbed +: title: Show Name + season: 1 + episode: 1 + language: de + type: episode + +? Show.Name.S06E05.Das.Toor.German.AC3.Dubbed.HDTV.German +: title: Show Name + season: 6 + episode: 5 + language: de + audio_codec: Dolby Digital + source: HDTV + type: episode + +? Show.Name.S01E01.Savage.Season.GERMAN.DUBBED.WS.HDTVRip.x264-TVP +: title: Show Name + season: 1 + episode: 1 + episode_title: Savage Season + language: de + other: [Widescreen, Rip] + source: HDTV + video_codec: H.264 + release_group: TVP + type: episode + +# Dubbed +? "[AnimeRG].Show.Name.-.03.[Eng.Dubbed].[720p].[WEB-DL].[JRR]" +: title: Show Name + episode: 3 + language: en + screen_size: 720p + source: Web + release_group: JRR + type: episode + +# Dubbed +? "[RH].Show.Name.-.03.[English.Dubbed].[1080p]" +: title: Show Name + episode: 3 + language: en + screen_size: 1080p + release_group: RH + type: episode + +# Hebsubs +? Show.Name.S05E05.HDTV.XviD-AFG.HebSubs +: title: Show Name + season: 5 + episode: 5 + source: HDTV + video_codec: Xvid + release_group: AFG + subtitle_language: he + type: episode + +? Show Name - S02E31 - Episode 55 (720p.HDTV) +: title: Show Name + season: 2 + episode: 31 + episode_title: Episode 55 + screen_size: 720p + source: HDTV + type: episode + +# Scenario: Removing invalid season and episode matches. Correct episode_title match +? Show.Name.S02E06.eps2.4.m4ster-s1ave.aes.1080p.AMZN.WEBRip.DD5.1.x264-GROUP +: title: Show Name + season: 2 + episode: 6 + episode_title: eps2 4 m4ster-s1ave aes + screen_size: 1080p + streaming_service: Amazon Prime + source: Web + other: Rip + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: GROUP + type: episode + +? Show.Name.S01E05.3xpl0its.wmv.720p.WEBdl.EN-SUB.x264-[MULVAcoded].mkv +: title: Show Name + season: 1 + episode: 5 + episode_title: 3xpl0its + screen_size: 720p + source: Web + subtitle_language: en + video_codec: H.264 + type: episode + +# Regression: S4L release group detected as season 4 +# https://github.com/guessit-io/guessit/issues/352 +? Show Name S01E06 DVD-RIP x264-S4L +: title: Show Name + season: 1 + episode: 6 + source: DVD + video_codec: H.264 + release_group: S4L + type: episode + +# Corner case with only date and 720p +? The.Show.Name.2016.05.18.720.HDTV.x264-GROUP.VTV +: title: The Show Name + date: 2016-05-18 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: GROUP.VTV + type: episode + +# Corner case with only date and 720p +? -The.Show.Name.2016.05.18.720.HDTV.x264-GROUP.VTV +: season: 7 + episode: 20 + +# https://github.com/guessit-io/guessit/issues/308 (conflict with screen size) +? "[SuperGroup].Show.Name.-.06.[720.Hi10p][1F5578AC]" +: title: Show Name + episode: 6 + screen_size: 720p + color_depth: 10-bit + crc32: 1F5578AC + release_group: SuperGroup + type: episode + +# https://github.com/guessit-io/guessit/issues/308 (conflict with screen size) +? "[SuperGroup].Show.Name.-.06.[1080.Hi10p][1F5578AC]" +: title: Show Name + episode: 6 + screen_size: 1080p + color_depth: 10-bit + crc32: 1F5578AC + release_group: SuperGroup + type: episode + +? "[MK-Pn8].Dimension.W.-.05.[720p][Hi10][Dual][TV-Dub][EDA6E7F1]" +: options: -C us -L und + release_group: MK-Pn8 + title: Dimension W + episode: 5 + screen_size: 720p + color_depth: 10-bit + other: Dual Audio + source: TV + language: und + crc32: EDA6E7F1 + type: episode + +? "[Zero-Raws].Show.Name.493-498.&.500-507.(CX.1280x720.VFR.x264.AAC)" +: release_group: Zero-Raws + title: Show Name + episode: [493, 494, 495, 496, 497, 498, 500, 501, 502, 503, 504, 505, 506, 507] + screen_size: 720p + other: Variable Frame Rate + video_codec: H.264 + audio_codec: AAC + type: episode + +# NetflixUHD +? Show.Name.S01E06.NetflixUHD +: title: Show Name + season: 1 + episode: 6 + streaming_service: Netflix + other: Ultra HD + type: episode + +? Show.Name.S04E13.FINAL.MULTI.DD51.2160p.NetflixUHDRip.x265-TVS +: title: Show Name + season: 4 + episode: 13 + episode_details: Final + language: mul + audio_codec: Dolby Digital + audio_channels: '5.1' + screen_size: 2160p + streaming_service: Netflix + source: Ultra HDTV + other: Rip + video_codec: H.265 + release_group: TVS + type: episode + +? Show.Name.S06E11.Of.Late.I.Think.of.Rosewood.iTunesHD.x264 +: title: Show Name + season: 6 + episode: 11 + episode_title: Of Late I Think of Rosewood + streaming_service: iTunes + other: HD + video_codec: H.264 + type: episode + +? Show.Name.S01.720p.iTunes.h264-Group +: title: Show Name + season: 1 + screen_size: 720p + streaming_service: iTunes + video_codec: H.264 + release_group: Group + type: episode + +? Show.Name.1x01.eps1.0.hellofriend.(HDiTunes.Ac3.Esp).(2015).By.Malaguita.avi +: title: Show Name + season: 1 + episode: 1 + episode_title: eps1 0 hellofriend + other: HD + streaming_service: iTunes + audio_codec: Dolby Digital + language: spa + year: 2015 + container: avi + type: episode + +? "[Hanamaru&LoliHouse] The Dragon Dentist - 01 [WebRip 1920x1080 HEVC-yuv420p10 AAC].mkv" +: release_group: Hanamaru&LoliHouse + title: The Dragon Dentist + episode: 1 + source: Web + other: Rip + screen_size: 1080p + video_codec: H.265 + color_depth: 10-bit + audio_codec: AAC + container: mkv + type: episode + +? Show Name - Season 1 Episode 50 +: title: Show Name + season: 1 + episode: 50 + type: episode + +? Vikings.Seizoen.4.1080p.Web.NLsubs +: title: Vikings + season: 4 + screen_size: 1080p + source: Web + subtitle_language: nl + type: episode + +? Star.Wars.Rebels.S01E01.Spark.of.Rebellion.ALTERNATE.CUT.HDTV.x264-W4F.mp4 +: title: Star Wars Rebels + season: 1 + episode: 1 + episode_title: Spark of Rebellion + edition: Alternative Cut + source: HDTV + video_codec: H.264 + release_group: W4F + container: mp4 + type: episode + +? DCs.Legends.of.Tomorrow.S02E12.HDTV.XviD-FUM +: title: DCs Legends of Tomorrow + season: 2 + episode: 12 + source: HDTV + video_codec: Xvid + release_group: FUM + type: episode + +? DC's Legends of Tomorrow 2016 - S02E02 +: title: DC's Legends of Tomorrow + year: 2016 + season: 2 + episode: 2 + type: episode + +? Broadchurch.S01.DIRFIX.720p.BluRay.x264-SHORTBREHD +: title: Broadchurch + season: 1 + other: Fix + screen_size: 720p + source: Blu-ray + video_codec: H.264 + release_group: SHORTBREHD + -proper_count: 1 + type: episode + +? Simply Red - 2016-07-08 Montreux Jazz Festival 720p +: title: Simply Red + date: 2016-07-08 + episode_title: Montreux Jazz Festival + screen_size: 720p + type: episode + +? Ridiculousness.S07E14.iNTERNAL.HDTV.x264-YesTV +: title: Ridiculousness + season: 7 + episode: 14 + other: Internal + source: HDTV + video_codec: H.264 + release_group: YesTV + type: episode + +? Stephen.Colbert.2016.05.25.James.McAvoy.iNTERNAL.XviD-AFG +: title: Stephen Colbert + date: 2016-05-25 + episode_title: James McAvoy + other: Internal + video_codec: Xvid + release_group: AFG + type: episode + +? The.100.S01E13.iNTERNAL.READNFO.720p.HDTV.x264-2HD +: title: The 100 + season: 1 + episode: 13 + other: [Internal, Read NFO] + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: 2HD + type: episode + +? The.100.S01E13.READ.NFO.720p.HDTV.x264-2HD +: title: The 100 + season: 1 + episode: 13 + other: Read NFO + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: 2HD + type: episode + +? Dr.Ken.S01E21.SAMPLEFIX.720p.HDTV.x264-SVA +: title: Dr Ken + season: 1 + episode: 21 + other: Fix + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: SVA + type: episode + +? Rick and Morty Season 1 [UNCENSORED] [BDRip] [1080p] [HEVC] +: title: Rick and Morty + season: 1 + edition: Uncensored + other: Rip + source: Blu-ray + screen_size: 1080p + video_codec: H.265 + type: episode + +? 12.Monkeys.S01E01.LiMiTED.FRENCH.1080p.WEB-DL.H264-AUTHORiTY +: title: 12 Monkeys + season: 1 + episode: 1 + edition: Limited + language: french + screen_size: 1080p + source: Web + video_codec: H.264 + release_group: AUTHORiTY + type: episode + +? Undateable.2014.S03E05.West.Feed.HDTV.x264-2HD +: title: Undateable + year: 2014 + season: 3 + episode: 5 + other: West Coast Feed + source: HDTV + video_codec: H.264 + release_group: 2HD + type: episode + +? Undateable.2014.S02E07-E08.Live.Episode.West.Coast.Feed.HDTV.x264-2HD +: title: Undateable + year: 2014 + season: 2 + episode: [7, 8] + other: West Coast Feed + source: HDTV + video_codec: H.264 + release_group: 2HD + type: episode + +? Undateable.S03E01-E02.LIVE.EAST.FEED.720p.HDTV.x264-KILLERS +: title: Undateable + season: 3 + episode: [1, 2] + other: East Coast Feed + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: KILLERS + type: episode + +? Undateable.2014.S02E07.Live.Episode.East.Coast.Feed.HDTV.x264-2HD +: title: Undateable + year: 2014 + season: 2 + episode: 7 + other: East Coast Feed + source: HDTV + video_codec: H.264 + release_group: 2HD + type: episode + +? Undateable.2014.S02E07.East.Coast.Feed.720p.WEB-DL.DD5.1.H.264-NTb +: title: Undateable + year: 2014 + season: 2 + episode: 7 + other: East Coast Feed + screen_size: 720p + source: Web + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: NTb + type: episode + +? True Detective S02E04 720p HDTV x264-0SEC [GloDLS].mkv +: title: True Detective + season: 2 + episode: 4 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: 0SEC [GloDLS] + container: mkv + type: episode + +? Anthony.Bourdain.Parts.Unknown.S09E01.Los.Angeles.720p.HDTV.x264-MiNDTHEGAP +: title: Anthony Bourdain Parts Unknown + season: 9 + episode: 1 + episode_title: Los Angeles + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: MiNDTHEGAP + type: episode + +? -feud.s01e05.and.the.winner.is.(the.oscars.of.1963).720p.amzn.webrip.dd5.1.x264-casstudio.mkv +: year: 1963 + +? feud.s01e05.and.the.winner.is.(the.oscars.of.1963).720p.amzn.webrip.dd5.1.x264-casstudio.mkv +: title: feud + season: 1 + episode: 5 + episode_title: and the winner is + screen_size: 720p + streaming_service: Amazon Prime + source: Web + other: Rip + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: casstudio + container: mkv + type: episode + +? Adventure.Time.S08E16.Elements.Part.1.Skyhooks.720p.WEB-DL.AAC2.0.H.264-RTN.mkv +: title: Adventure Time + season: 8 + episode: 16 + episode_title: Elements Part 1 Skyhooks + screen_size: 720p + source: Web + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: RTN + container: mkv + type: episode + +? D:\TV\SITCOMS (CLASSIC)\That '70s Show\Season 07\That '70s Show - S07E22 - 2000 Light Years from Home.mkv +: title: That '70s Show + season: 7 + episode: 22 + episode_title: 2000 Light Years from Home + container: mkv + type: episode + +? Show.Name.S02E01.Super.Title.720p.WEB-DL.DD5.1.H.264-ABC.nzb +: title: Show Name + season: 2 + episode: 1 + episode_title: Super Title + screen_size: 720p + source: Web + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: ABC + container: nzb + type: episode + +? "[SGKK] Bleach 312v1 [720p/mkv]-Group.mkv" +: title: Bleach + episode: 312 + version: 1 + screen_size: 720p + release_group: Group + container: mkv + type: episode + +? The.Expanse.S02E08.720p.WEBRip.x264.EAC3-KiNGS.mkv +: title: The Expanse + season: 2 + episode: 8 + screen_size: 720p + source: Web + other: Rip + video_codec: H.264 + audio_codec: Dolby Digital Plus + release_group: KiNGS + container: mkv + type: episode + +? Series_name.2005.211.episode.title.avi +: title: Series name + year: 2005 + season: 2 + episode: 11 + episode_title: episode title + container: avi + type: episode + +? the.flash.2014.208.hdtv-lol[ettv].mkv +: title: the flash + year: 2014 + season: 2 + episode: 8 + source: HDTV + release_group: lol[ettv] + container: mkv + type: episode + +? "[Despair-Paradise].Kono.Subarashii.Sekai.ni.Shukufuku.wo!.2.-..09.vostfr.FHD" +: release_group: Despair-Paradise + title: Kono Subarashii Sekai ni Shukufuku wo! 2 + episode: 9 + subtitle_language: fr + other: Full HD + type: episode + +? Whose Line is it anyway/Season 01/Whose.Line.is.it.Anyway.US.S13E01.720p.WEB.x264-TBS.mkv +: title: Whose Line is it Anyway + season: 13 + episode: 1 + country: US + screen_size: 720p + source: Web + video_codec: H.264 + release_group: TBS + container: mkv + type: episode + +? Planet.Earth.II.S01.2160p.UHD.BluRay.HDR.DTS-HD.MA5.1.x265-ULTRAHDCLUB +: title: Planet Earth II + season: 1 + screen_size: 2160p + source: Ultra HD Blu-ray + other: HDR10 + audio_codec: DTS-HD + audio_profile: Master Audio + audio_channels: '5.1' + video_codec: H.265 + release_group: ULTRAHDCLUB + type: episode + +? Reizen.Waes.S03.FLEMISH.1080p.HDTV.MP2.H.264-NOGRP/Reizen.Waes.S03E05.China.PART1.FLEMISH.1080p.HDTV.MP2.H.264-NOGRP.mkv +: title: Reizen Waes + season: 3 + episode: 5 + part: 1 + language: nl-BE + screen_size: 1080p + source: HDTV + video_codec: H.264 + audio_codec: MP2 + release_group: NOGRP + container: mkv + type: episode + +? "/folder/Marvels.Agent.Carter.S02E05.The.Atomic.Job.1080p.WEB-DL.DD5.1.H264-Coo7[rartv]/Marvel's.Agent.Carter.S02E05.The.Atomic.Job.1080p.WEB-DL.DD5.1.H.264-Coo7.mkv" +: title: Marvel's Agent Carter + season: 2 + episode: 5 + episode_title: The Atomic Job + release_group: Coo7 + type: episode + +? My.Name.Is.Earl.S01-S04.DVDRip.XviD-AR +: title: My Name Is Earl + season: [1, 2, 3, 4] + source: DVD + other: Rip + video_codec: Xvid + release_group: AR + type: episode + +? American.Dad.S01E01.Pilot.DVDRip.x264-CS +: title: American Dad + season: 1 + episode: 1 + episode_details: Pilot + source: DVD + other: Rip + video_codec: H.264 + release_group: CS + type: episode + +? Black.Sails.S01E01.HDTV.XviD.HebSubs-DR +: title: Black Sails + season: 1 + episode: 1 + source: HDTV + video_codec: Xvid + subtitle_language: he + release_group: DR + type: episode + +? The.West.Wing.S04E06.Game.On.720p.WEB-DL.AAC2.0.H.264-MC +: title: The West Wing + season: 4 + episode: 6 + episode_title: Game On + screen_size: 720p + source: Web + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: MC + type: episode + +? 12.Monkeys.S02E05.1080p.WEB-DL.DD5.1.H.264-NA +: title: 12 Monkeys + season: 2 + episode: 5 + screen_size: 1080p + source: Web + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: NA + type: episode + +? Fear.the.Walking.Dead.S03E07.1080p.AMZN.WEBRip.DD5.1.x264-VLAD[rarbg]/Fear.the.Walking.Dead.S03E07.1080p.AMZN.WEB-DL.DD+5.1.H.264-VLAD.mkv +: title: Fear the Walking Dead + season: 3 + episode: 7 + screen_size: 1080p + source: Web + audio_codec: Dolby Digital Plus + audio_channels: '5.1' + video_codec: H.264 + release_group: VLAD + container: mkv + type: episode + +? American.Crime.S01E02.1080p.WEB-DL.DD5.1.H.264-NL +: title: American Crime + season: 1 + episode: 2 + screen_size: 1080p + source: Web + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: NL + type: episode + +? Better.Call.Saul.S02.720p.HDTV.x264-TL +: title: Better Call Saul + season: 2 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: TL + type: episode + +? 60.Minutes.2008.12.14.HDTV.XviD-YT +: options: -T '60 Minutes' + title: 60 Minutes + date: 2008-12-14 + source: HDTV + video_codec: Xvid + release_group: YT + type: episode + +? Storm.Chasers.Season.1 +: title: Storm Chasers + season: 1 + type: episode + +? Faking.It.2014.S03E08.720p.HDTV.x264-AVS +: title: Faking It + year: 2014 + season: 3 + episode: 8 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: AVS + type: episode + +? /series/Marvel's Agents of S.H.I.E.L.D/Season 4/Marvels.Agents.of.S.H.I.E.L.D.S04E01.The.Ghost.1080p.WEB-DL.DD5.1.H.264-AG.mkv +: title: Marvels Agents of S.H.I.E.L.D. + season: 4 + episode: 1 + episode_title: The Ghost + screen_size: 1080p + source: Web + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: AG + container: mkv + type: episode + +? "[FASubs & TTF] Inuyasha - 099 [DVD] [B15AA1AC].mkv" +: release_group: FASubs & TTF + title: Inuyasha + episode: 99 + source: DVD + crc32: B15AA1AC + container: mkv + type: episode + +? Show.Name.S01E03.PL.SUBBED.480p.WEBRiP.x264 +: title: Show Name + season: 1 + episode: 3 + subtitle_language: pl + screen_size: 480p + source: Web + other: Rip + video_codec: H.264 + type: episode + +? Show.Name.s10e15(233).480p.BDRip-AVC.Ukr.hurtom +: title: Show Name + season: 10 + episode: 15 + screen_size: 480p + source: Blu-ray + other: Rip + video_codec: H.264 + language: uk + release_group: hurtom + type: episode + +? Goof.Troop.1x24.Waste.Makes.Haste.720p.HDTV.x264.CZ-SDTV +: title: Goof Troop + season: 1 + episode: 24 + episode_title: Waste Makes Haste + screen_size: 720p + source: HDTV + video_codec: H.264 + language: cs + release_group: SDTV + type: episode + +? Marvels.Daredevil.S02E11.German.DL.DUBBED.2160p.WebUHD.x264-UHDTV +: title: Marvels Daredevil + season: 2 + episode: 11 + language: [de, mul] + screen_size: 2160p + source: Web + video_codec: H.264 + release_group: UHDTV + type: episode + +? BBC The Story of China 1 of 6 - Ancestors CC HDTV x264 AC3 2.0 720p mkv +: title: BBC The Story of China + episode: 1 + episode_count: 6 + episode_title: Ancestors + source: HDTV + video_codec: H.264 + audio_codec: Dolby Digital + audio_channels: '2.0' + screen_size: 720p + container: mkv + type: episode + +? Duck.Dynasty.S09E04.Drone.Survivor.720p.AE.WEBRip.AAC2.0.H264-BTW[rartv] +: title: Duck Dynasty + season: 9 + episode: 4 + episode_title: Drone Survivor + screen_size: 720p + streaming_service: A&E + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: BTW[rartv] + type: episode + +? Mr.Selfridge.S04E03.720p.WEB-DL.AAC2.0.H264-MS[rartv] +: title: Mr Selfridge + season: 4 + episode: 3 + screen_size: 720p + source: Web + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: MS[rartv] + type: episode + +? Second.Chance.S01E02.One.More.Notch.1080p.WEB-DL.DD5.1.H264-SC[rartv] +: title: Second Chance + season: 1 + episode: 2 + episode_title: One More Notch + screen_size: 1080p + source: Web + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: rartv + type: episode + +? Total.Divas.S05E01.720p.HDTV.AAC2.0.H.264-SC-SDH +: title: Total Divas + season: 5 + episode: 1 + screen_size: 720p + source: HDTV + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + video_profile: Scalable Video Coding + release_group: SDH + type: episode + +? Marvel's Jessica Jones (2015) s01e09 - AKA Sin Bin.mkv +: title: Marvel's Jessica Jones + season: 1 + episode: 9 + episode_title: AKA Sin Bin + container: mkv + type: episode + +? Hotel.Hell.S01E01.720p.DD5.1.448kbps-ALANiS +: title: Hotel Hell + season: 1 + episode: 1 + screen_size: 720p + audio_codec: Dolby Digital + audio_channels: '5.1' + audio_bit_rate: 448Kbps + release_group: ALANiS + type: episode + +? Greys.Anatomy.S07D1.NTSC.DVDR-ToF +: title: Greys Anatomy + season: 7 + disc: 1 + other: NTSC + source: DVD + release_group: ToF + type: episode + +? Greys.Anatomy.S07D1.NTSC.DVDR-ToF +: title: Greys Anatomy + season: 7 + disc: 1 + other: NTSC + source: DVD + release_group: ToF + type: episode + +? Greys.Anatomy.S07D1-3&5.NTSC.DVDR-ToF +: title: Greys Anatomy + season: 7 + disc: [1, 2, 3, 5] + other: NTSC + source: DVD + release_group: ToF + type: episode + +? El.Principe.2014.S01D01.SPANiSH.COMPLETE.BLURAY-COJONUDO +: title: El Principe + year: 2014 + season: 1 + disc: 1 + language: spa + other: Complete + source: Blu-ray + release_group: COJONUDO + type: episode + +? The Simpsons - Season 2 Complete [DVDRIP VP7 KEGGERMAN +: title: The Simpsons + season: 2 + other: [Complete, Rip] + source: DVD + video_codec: VP7 + release_group: KEGGERMAN + type: episode + +? Barney & Friends_ Easy as ABC (Season 9_ Episode 15)_VP8_Vorbis_360p.webm +: title: Barney & Friends Easy as ABC + season: 9 + episode: 15 + video_codec: VP8 + audio_codec: Vorbis + screen_size: 360p + container: webm + type: episode + +? Victoria.S01.1080p.BluRay.HEVC.DTSMA.LPCM.PGS-OZM +: title: Victoria + season: 1 + screen_size: 1080p + source: Blu-ray + video_codec: H.265 + audio_codec: [DTS-HD, LPCM] + audio_profile: Master Audio + # Does it worth to add subtitle_format? Such rare case + # subtitle_format: PGS + # release_group: OZM + type: episode + +? The.Prisoners.S01E03.1080p.DM.AAC2.0.x264-BTN +: title: The Prisoners + season: 1 + episode: 3 + screen_size: 1080p + source: Digital Master + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: BTN + type: episode + +? Panorama.S2013E25.Broken.by.Battle.1080p.DM.AAC2.0.x264-BTN +: title: Panorama + season: 2013 + episode: 25 + episode_title: Broken by Battle + screen_size: 1080p + source: Digital Master + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: BTN + type: episode + +? Our.World.S2014E11.Chinas.Model.Army.720p.DM.AAC2.0.x264-BTN +: title: Our World + season: 2014 + episode: 11 + episode_title: Chinas Model Army + screen_size: 720p + source: Digital Master + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: BTN + type: episode + +? Storyville.S2016E08.My.Nazi.Legacy.1080p.DM.x264-BTN +: title: Storyville + season: 2016 + episode: 8 + episode_title: My Nazi Legacy + screen_size: 1080p + source: Digital Master + video_codec: H.264 + release_group: BTN + type: episode + +? Comedians.in.Cars.Getting.Coffee.S07E01.1080p.DM.FLAC2.0.x264-NTb +: title: Comedians in Cars Getting Coffee + season: 7 + episode: 1 + screen_size: 1080p + source: Digital Master + audio_codec: FLAC + audio_channels: '2.0' + video_codec: H.264 + release_group: NTb + type: episode + +? "[SomeGroup-Fansub]_Show_Name_727_[VOSTFR][HD_1280x720]" +: release_group: SomeGroup-Fansub + title: Show Name + episode: 727 + subtitle_language: fr + other: HD + screen_size: 720p + type: episode + +? "[GROUP]Show_Name_726_[VOSTFR]_[V1]_[8bit]_[720p]_[2F7B3FA2]" +: release_group: GROUP + title: Show Name + episode: 726 + subtitle_language: fr + version: 1 + color_depth: 8-bit + screen_size: 720p + crc32: 2F7B3FA2 + type: episode + +? Show Name 445 VOSTFR par Fansub-Resistance (1280*720) - version MQ +: title: Show Name + episode: 445 + subtitle_language: fr + screen_size: 720p + type: episode + +? Anime Show Episode 159 v2 [VOSTFR][720p][AAC].mp4 +: title: Anime Show + episode: 159 + version: 2 + subtitle_language: fr + screen_size: 720p + audio_codec: AAC + container: mp4 + type: episode + +? "[Group] Anime Super Episode 161 [VOSTFR][720p].mp4" +: release_group: Group + title: Anime Super + episode: 161 + subtitle_language: fr + screen_size: 720p + container: mp4 + type: episode + +? Anime Show Episode 59 v2 [VOSTFR][720p][AAC].mp4 +: title: Anime Show + episode: 59 + version: 2 + subtitle_language: fr + screen_size: 720p + audio_codec: AAC + container: mp4 + type: episode + +? Show.Name.-.476-479.(2007).[HorribleSubs][WEBRip]..[HD.720p] +: title: Show Name + episode: [476, 477, 478, 479] + year: 2007 + release_group: HorribleSubs + source: Web + other: [Rip, HD] + screen_size: 720p + type: episode + +? Show Name - 722 [HD_1280x720].mp4 +: title: Show Name + episode: 722 + other: HD + screen_size: 720p + container: mp4 + type: episode + +? Show!.Name.2.-.10.(2016).[HorribleSubs][WEBRip]..[HD.720p] +: title: Show! Name 2 + episode: 10 + year: 2016 + release_group: HorribleSubs + source: Web + other: [Rip, HD] + screen_size: 720p + type: episode + +? 'C:\folder\[GROUP]_An_Anime_Show_100_-_10_[1080p]_mkv' +: options: -T 'An Anime Show 100' + release_group: GROUP + title: An Anime Show 100 + episode: 10 + screen_size: 1080p + container: mkv + type: episode + +? "[Group].Show.Name!.Super!!.-.05.[720p][AAC].mp4" +: release_group: Group + title: Show Name! Super!! + episode: 5 + screen_size: 720p + audio_codec: AAC + container: mp4 + type: episode + +? "[GROUP].Mobile.Suit.Gundam.Unicorn.RE.0096.-.14.[720p].mkv" +: options: -T 'Mobile Suit Gundam Unicorn RE 0096' + release_group: GROUP + title: Mobile Suit Gundam Unicorn RE 0096 + episode: 14 + screen_size: 720p + container: mkv + type: episode + +? Show.Name.-.Other Name.-.02.(1280x720.HEVC.AAC) +: title: Show Name + alternative_title: Other Name + episode: 2 + screen_size: 720p + video_codec: H.265 + audio_codec: AAC + type: episode + +? "[GroupName].Show.Name.-.02.5.(Special).[BD.1080p]" +: release_group: GroupName + title: Show Name + episode: 2 + episode_details: Special + screen_size: 1080p + source: Blu-ray + type: episode + +? "[Group].Show.Name.2.The.Big.Show.-.11.[1080p]" +: title: Show Name 2 The Big Show + episode: 11 + screen_size: 1080p + type: episode + +? "[SuperGroup].Show.Name.-.Still.Name.-.11.[1080p]" +: release_group: SuperGroup + title: Show Name + alternative_title: Still Name + episode: 11 + screen_size: 1080p + type: episode + +? "[SuperGroup].Show.Name.-.462" +: release_group: SuperGroup + title: Show Name + episode: 462 + type: episode + +? Show.Name.10.720p +: title: Show Name + episode: 10 + screen_size: 720p + type: episode + +? "[Group].Show.Name.G2.-.19.[1080p]" +: release_group: Group + title: Show Name G2 + episode: 19 + screen_size: 1080p + type: episode + +? "[Group].Show.Name.S2.-.19.[1080p]" +? /Show.Name.S2/[Group].Show.Name.S2.-.19.[1080p] +? /Show Name S2/[Group].Show.Name.S2.-.19.[1080p] +: options: -T 'Show Name S2' + release_group: Group + title: Show Name S2 + episode: 19 + screen_size: 1080p + type: episode + +? "[ABC]_Show_Name_001.mkv" +: release_group: ABC + title: Show Name + episode: 1 + container: mkv + type: episode + +? 003-005. Show Name - Ep Name.mkv +: episode: [3, 4, 5] + title: Show Name + episode_title: Ep Name + container: mkv + type: episode + +? 003. Show Name - Ep Name.mkv +: episode: 3 + title: Show Name + episode_title: Ep Name + container: mkv + type: episode + +? 165.Show Name.s08e014 +: absolute_episode: 165 + title: Show Name + season: 8 + episode: 14 + type: episode + +? Show Name - 16x03-05 - 313-315 +? Show.Name.16x03-05.313-315-GROUP +? Show Name 16x03-05 313-315 +? Show Name - 313-315 - s16e03-05 +? Show.Name.313-315.s16e03-05 +? Show Name 313-315 s16e03-05 +: title: Show Name + absolute_episode: [313, 314, 315] + season: 16 + episode: [3, 4, 5] + type: episode + +? Show Name 13-16 +: title: Show Name + episode: [13, 14, 15, 16] + type: episode + +? Show Name 804 vostfr HD +: options: --episode-prefer-number + title: Show Name + episode: 804 + subtitle_language: fr + other: HD + type: episode + +? "[Doki] Re Zero kara Hajimeru Isekai Seikatsu - 01 1920x1080 Hi10P BD FLAC [7F64383D].mkv" +: release_group: Doki + title: Re Zero kara Hajimeru Isekai Seikatsu + episode: 1 + screen_size: 1080p + aspect_ratio: 1.778 + video_profile: High 10 + color_depth: 10-bit + source: Blu-ray + audio_codec: FLAC + crc32: 7F64383D + container: mkv + type: episode + +? Shark Tank (AU) - S02E01 - HDTV-720p.mkv +: title: Shark Tank + country: AU + season: 2 + episode: 1 + source: HDTV + screen_size: 720p + container: mkv + type: episode + +? "[HorribleSubs] Garo - Vanishing Line - 01 [1080p].mkv" +: release_group: HorribleSubs + title: Garo + alternative_title: Vanishing Line + episode: 1 + screen_size: 1080p + container: mkv + type: episode + +? "[HorribleSubs] Yowamushi Pedal - Glory Line - 01 [1080p].mkv" +: release_group: HorribleSubs + title: Yowamushi Pedal + alternative_title: Glory Line + episode: 1 + screen_size: 1080p + container: mkv + type: episode + +? c:\Temp\autosubliminal\completed\2 Broke Girls\Season 01\2 Broke Girls - S01E01 - HDTV-720p Proper - x264 AC3 - IMMERSE - [2011-09-19].mkv +: title: 2 Broke Girls + season: 1 + episode: 1 + source: HDTV + screen_size: 720p + other: Proper + video_codec: H.264 + audio_codec: Dolby Digital + release_group: IMMERSE + date: 2011-09-19 + container: mkv + type: episode + +? c:\Temp\postprocessing\Marvels.Agents.of.S.H.I.E.L.D.s01e02.0.8.4.720p.WEB.DL.mkv +: title: Marvels Agents of S.H.I.E.L.D. + season: 1 + episode: 2 + episode_title: 0.8.4. + screen_size: 720p + source: Web + container: mkv + type: episode + +? Mind.Field.S02E06.The.Power.of.Suggestion.1440p.H264.WEBDL.Subtitles +: title: Mind Field + season: 2 + episode: 6 + episode_title: The Power of Suggestion + screen_size: 1440p + video_codec: H.264 + source: Web + subtitle_language: und + type: episode + +? The Power of Suggestion - Mind Field S2 (Ep 6) (1440p_24fps_H264-384kbit_AAC 6Ch).mp4 +: title: The Power of Suggestion + alternative_title: Mind Field + season: 2 + episode: 6 + screen_size: 1440p + frame_rate: 24fps + video_codec: H.264 + audio_bit_rate: 384Kbps + audio_codec: AAC + audio_channels: '5.1' + container: mp4 + type: episode + +? Mind.Field.S02E06.The.Power.of.Suggestion.1440p.H264.WEBDL.Subtitles/The Power of Suggestion - Mind Field S2 (Ep 6) (1440p_24fps_H264-384kbit_AAC 6Ch).mp4 +: season: 2 + episode: 6 + title: The Power of Suggestion + alternative_title: Mind Field + screen_size: 1440p + frame_rate: 24fps + video_codec: H.264 + source: Web + subtitle_language: und + audio_bit_rate: 384Kbps + audio_codec: AAC + audio_channels: '5.1' + container: mp4 + type: episode + +? Mind.Field.S02E06.The.Power.of.Suggestion.1440p.H264.WEBDL.Subtitles/The Power of Suggestion - Mind Field S2 (Ep 6) (English).srt +: title: Mind Field + season: 2 + episode: 6 + episode_title: The Power of Suggestion + screen_size: 1440p + video_codec: H.264 + source: Web + subtitle_language: en + container: srt + type: episode + +? Mind.Field.S02E06.The.Power.of.Suggestion.1440p.H264.WEBDL.Subtitles/The Power of Suggestion - Mind Field S2 (Ep 6) (Korean).srt +: title: Mind Field + season: 2 + episode: 6 + episode_title: The Power of Suggestion + screen_size: 1440p + video_codec: H.264 + source: Web + subtitle_language: ko + container: srt + type: episode + +? '[HorribleSubs] Overlord II - 01 [1080p] 19.1mbits - 120fps.mkv' +: release_group: HorribleSubs + title: Overlord II + episode: 1 + screen_size: 1080p + video_bit_rate: 19.1Mbps + frame_rate: 120fps + container: mkv + type: episode + +? One Piece - 720 +: title: One Piece + season: 7 + episode: 20 + type: episode + +? foobar.213.avi +: options: -E + title: foobar + episode: 213 + container: avi + type: episode + +? FooBar - 360 368p-Grp +: options: -E + title: FooBar + episode: 360 + screen_size: 368p + release_group: Grp + type: episode + +? wwiis.most.daring.raids.s01e04.storming.mussolinis.island.1080p.web.h.264-edhd-sample.mkv +: title: wwiis most daring raids + season: 1 + episode: 4 + episode_title: storming mussolinis island + screen_size: 1080p + source: Web + video_codec: H.264 + release_group: edhd + other: Sample + container: mkv + type: episode + +? WWIIs.Most.Daring.Raids.S01E04.Storming.Mussolinis.Island.1080p.WEB.h264-EDHD/wwiis.most.daring.raids.s01e04.storming.mussolinis.island.1080p.web.h.264-edhd-sample.mkv +: title: wwiis most daring raids + season: 1 + episode: 4 + episode_title: Storming Mussolinis Island + screen_size: 1080p + source: Web + video_codec: H.264 + release_group: edhd + other: Sample + container: mkv + type: episode + +? dcs.legends.of.tomorrow.s02e01.1080p.bluray.x264-rovers.proof +: title: dcs legends of tomorrow + season: 2 + episode: 1 + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + release_group: rovers + other: Proof + type: episode + +? dcs.legends.of.tomorrow.s02e01.720p.bluray.x264-demand.sample.mkv +: title: dcs legends of tomorrow + season: 2 + episode: 1 + screen_size: 720p + source: Blu-ray + video_codec: H.264 + release_group: demand + other: Sample + container: mkv + type: episode + +? Season 06/e01.1080p.bluray.x264-wavey-obfuscated.mkv +: season: 6 + episode: 1 + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + title: wavey + other: Obfuscated + container: mkv + type: episode + +? Hells.Kitchen.US.S17E08.1080p.HEVC.x265-MeGusta-Obfuscated/c48db7d2aeb040e8a920a9fd6effcbf4.mkv +: title: Hells Kitchen + country: US + season: 17 + episode: 8 + screen_size: 1080p + video_codec: H.265 + release_group: MeGusta + other: Obfuscated + uuid: c48db7d2aeb040e8a920a9fd6effcbf4 + container: mkv + type: episode + +? Blue.Bloods.S08E09.1080p.HEVC.x265-MeGusta-Obfuscated/afaae96ae7a140e0981ced2a79221751.mkv +: title: Blue Bloods + season: 8 + episode: 9 + screen_size: 1080p + video_codec: H.265 + release_group: MeGusta + other: Obfuscated + container: mkv + type: episode + +? MacGyver.2016.S02E09.CD-ROM.and.Hoagie.Foil.1080p.AMZN.WEBRip.DDP5.1.x264-NTb-Scrambled/c329b27187d44a94b4a25b21502db552.mkv +: title: MacGyver + year: 2016 + season: 2 + episode: 9 + screen_size: 1080p + streaming_service: Amazon Prime + source: Web + other: [Rip, Obfuscated] + audio_codec: Dolby Digital Plus + audio_channels: '5.1' + video_codec: H.264 + release_group: NTb + uuid: c329b27187d44a94b4a25b21502db552 + container: mkv + type: episode + +? The.Late.Late.Show.with.James.Corden.2017.11.27.Armie.Hammer.Juno.Temple.Charlie.Puth.1080p.AMZN.WEB-DL.DDP2.0.H.264-monkee-Scrambled/42e7e8a48eb7454aaebebcf49705ce41.mkv +: title: The Late Late Show with James Corden + date: 2017-11-27 + episode_title: Armie Hammer Juno Temple Charlie Puth + screen_size: 1080p + streaming_service: Amazon Prime + source: Web + audio_codec: Dolby Digital Plus + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + other: Obfuscated + uuid: 42e7e8a48eb7454aaebebcf49705ce41 + container: mkv + type: episode + +? Educating Greater Manchester S01E07 720p HDTV x264-PLUTONiUM-AsRequested +: title: Educating Greater Manchester + season: 1 + episode: 7 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: PLUTONiUM + other: Repost + type: episode + +? Im A Celebrity Get Me Out Of Here S17E14 HDTV x264-PLUTONiUM-xpost +: title: Im A Celebrity Get Me Out Of Here + season: 17 + episode: 14 + source: HDTV + video_codec: H.264 + release_group: PLUTONiUM + other: Repost + type: episode + +? Tales S01E08 All I Need Method Man Featuring Mary J Blige 720p BET WEBRip AAC2 0 x264-RTN-xpost +: title: Tales + season: 1 + episode: 8 + episode_title: All I Need Method Man Featuring Mary J Blige + screen_size: 720p + source: Web + other: [Rip, Repost] + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: RTN + type: episode + +? This is Us S01E11 Herzensangelegenheiten German DL WS DVDRip x264-CDP-xpost +: options: --exclude country + title: This is Us + season: 1 + episode: 11 + episode_title: Herzensangelegenheiten + language: + - de + - mul + other: + - Widescreen + - Rip + - Repost + source: DVD + video_codec: H.264 + release_group: CDP + type: episode + +? The Girlfriend Experience S02E10 1080p WEB H264-STRiFE-postbot +: title: The Girlfriend Experience + season: 2 + episode: 10 + screen_size: 1080p + source: Web + video_codec: H.264 + release_group: STRiFE + other: Repost + type: episode + +? The.Girlfriend.Experience.S02E10.1080p.WEB.H264-STRiFE-postbot/90550c1adaf44c47b60d24f59603bb98.mkv +: title: The Girlfriend Experience + season: 2 + episode: 10 + screen_size: 1080p + source: Web + video_codec: H.264 + release_group: STRiFE + other: Repost + uuid: 90550c1adaf44c47b60d24f59603bb98 + container: mkv + type: episode + +? 24.S01E02.1080p.BluRay.REMUX.AVC.DD.2.0-EPSiLON-xpost/eb518eaf33f641a1a8c6e0973a67aec2.mkv +: title: '24' + season: 1 + episode: 2 + screen_size: 1080p + source: Blu-ray + other: [Remux, Repost] + video_codec: H.264 + audio_codec: Dolby Digital + audio_channels: '2.0' + release_group: EPSiLON + uuid: eb518eaf33f641a1a8c6e0973a67aec2 + container: mkv + type: episode + +? Educating.Greater.Manchester.S01E02.720p.HDTV.x264-PLUTONiUM-AsRequested/47fbcb2393aa4b5cbbb340d3173ca1a9.mkv +: title: Educating Greater Manchester + season: 1 + episode: 2 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: PLUTONiUM + other: Repost + uuid: 47fbcb2393aa4b5cbbb340d3173ca1a9 + container: mkv + type: episode + +? Stranger.Things.S02E05.Chapter.Five.Dig.Dug.720p.NF.WEBRip.DD5.1.x264-PSYPHER-AsRequested-Obfuscated +: title: Stranger Things + season: 2 + episode: 5 + episode_title: Chapter Five Dig Dug + screen_size: 720p + streaming_service: Netflix + source: Web + other: [Rip, Repost, Obfuscated] + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: PSYPHER + type: episode + +? Show.Name.-.Season.1.3.4-.Mp4.1080p +: title: Show Name + season: [1, 3, 4] + container: mp4 + screen_size: 1080p + type: episode + +? Bones.S03.720p.HDTV.x264-SCENE +: title: Bones + season: 3 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: SCENE + type: episode + +? shes.gotta.have.it.s01e08.720p.web.x264-strife.mkv +: title: shes gotta have it + season: 1 + episode: 8 + screen_size: 720p + source: Web + video_codec: H.264 + release_group: strife + type: episode + +? DuckTales.2017.S01E10.The.Missing.Links.of.Moorshire.PDTV.H.264.MP2-KIDKAT +: title: DuckTales + year: 2017 + season: 1 + episode: 10 + episode_title: The Missing Links of Moorshire + source: Digital TV + video_codec: H.264 + audio_codec: MP2 + release_group: KIDKAT + type: episode + +? Por Trece Razones - Temporada 2 [HDTV 720p][Cap.201][AC3 5.1 Castellano]/Por Trece Razones 2x01 [des202].mkv +: title: Por Trece Razones + season: 2 + source: HDTV + screen_size: 720p + episode: 1 + audio_codec: Dolby Digital + audio_channels: '5.1' + language: Catalan + release_group: des202 + container: mkv + type: episode + +? Cuerpo de Elite - Temporada 1 [HDTV 720p][Cap.113][AC3 5.1 Esp Castellano]\CuerpoDeElite720p_113_desca202.mkv +: title: Cuerpo de Elite + season: 1 + source: HDTV + screen_size: 720p + episode: 13 + audio_codec: Dolby Digital + audio_channels: '5.1' + language: + - Spanish + - Catalan + container: mkv + type: episode + +? Show.Name.S01E01.St.Patricks.Day.1080p.mkv +: title: Show Name + season: 1 + episode: 1 + episode_title: St Patricks Day + screen_size: 1080p + container: mkv + type: episode + +? Show.Name.S01E01.St.Patricks.Day.1080p-grp.mkv +: title: Show Name + season: 1 + episode: 1 + episode_title: St Patricks Day + screen_size: 1080p + release_group: grp + container: mkv + type: episode + +? Titans.2018.S01E09.Hank.And.Dawn.720p.DCU.WEB-DL.AAC2.0.H264-NTb +: title: Titans + year: 2018 + season: 1 + episode: 9 + episode_title: Hank And Dawn + screen_size: 720p + streaming_service: DC Universe + source: Web + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: NTb + type: episode + +? S.W.A.T.2017.S01E21.Treibjagd.German.Dubbed.DL.AmazonHD.x264-TVS +: title: S.W.A.T. + year: 2017 + season: 1 + episode: 21 + episode_title: Treibjagd + language: + - German + - Multi + streaming_service: Amazon Prime + other: HD + video_codec: H.264 + release_group: TVS + type: episode + +? S.W.A.T.2017.S01E16.READNFO.720p.HDTV.x264-KILLERS +: title: S.W.A.T. + year: 2017 + season: 1 + episode: 16 + other: Read NFO + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: KILLERS + type: episode + +? /mnt/NAS/NoSubsTVShows/Babylon 5/Season 01/Ep. 02 - Soul Hunter +: title: Babylon 5 + season: 1 + episode: 2 + episode_title: Soul Hunter + type: episode + +? This.is.Us.S01E01.HDTV.x264-KILLERS.mkv +: title: This is Us + season: 1 + episode: 1 + source: HDTV + video_codec: H.264 + release_group: KILLERS + container: mkv + type: episode + +? Videos/Office1080/The Office (US) (2005) Season 2 S02 + Extras (1080p AMZN WEB-DL x265 HEVC 10bit AAC 2.0 LION)/The Office (US) (2005) - S02E12 - The Injury (1080p AMZN WEB-DL x265 LION).mkv +: title: The Office + country: US + year: 2005 + season: 2 + other: Extras + screen_size: 1080p + streaming_service: Amazon Prime + source: Web + video_codec: H.265 + video_profile: High Efficiency Video Coding + color_depth: 10-bit + audio_codec: AAC + audio_channels: '2.0' + release_group: LION + episode: 12 + episode_title: The Injury + container: mkv + type: episode + +? Thumping.Spike.2.E01.DF.WEBRip.720p-DRAMATV.mp4 +: title: Thumping Spike 2 + episode: 1 + source: Web + other: Rip + screen_size: 720p + streaming_service: DramaFever + release_group: DRAMATV + container: mp4 + mimetype: video/mp4 + type: episode + +? About.Time.E01.1080p.VIKI.WEB-DL-BLUEBERRY.mp4 +: title: About Time + episode: 1 + screen_size: 1080p + streaming_service: Viki + source: Web + release_group: BLUEBERRY + container: mp4 + mimetype: video/mp4 + type: episode + +? Eyes.Of.Dawn.1991.E01.480p.MBCVOD.AAC.x264-NOGPR.mp4 +: title: Eyes Of Dawn + year: 1991 + season: 1991 + episode: 1 + screen_size: 480p + streaming_service: MBC + audio_codec: AAC + video_codec: H.264 + release_group: NOGPR + container: mp4 + mimetype: video/mp4 + type: episode \ No newline at end of file diff --git a/lib/guessit/test/movies.yml b/lib/guessit/test/movies.yml new file mode 100644 index 00000000..a534ca0f --- /dev/null +++ b/lib/guessit/test/movies.yml @@ -0,0 +1,1786 @@ +? __default__ +: type: movie + +? Movies/Fear and Loathing in Las Vegas (1998)/Fear.and.Loathing.in.Las.Vegas.720p.HDDVD.DTS.x264-ESiR.mkv +: title: Fear and Loathing in Las Vegas + year: 1998 + screen_size: 720p + source: HD-DVD + audio_codec: DTS + video_codec: H.264 + container: mkv + release_group: ESiR + +? Movies/El Dia de la Bestia (1995)/El.dia.de.la.bestia.DVDrip.Spanish.DivX.by.Artik[SEDG].avi +: title: El Dia de la Bestia + year: 1995 + source: DVD + other: Rip + language: spanish + video_codec: DivX + release_group: Artik[SEDG] + container: avi + +? Movies/Dark City (1998)/Dark.City.(1998).DC.BDRip.720p.DTS.X264-CHD.mkv +: title: Dark City + year: 1998 + source: Blu-ray + other: Rip + screen_size: 720p + audio_codec: DTS + video_codec: H.264 + release_group: CHD + +? Movies/Sin City (BluRay) (2005)/Sin.City.2005.BDRip.720p.x264.AC3-SEPTiC.mkv +: title: Sin City + year: 2005 + source: Blu-ray + other: Rip + screen_size: 720p + video_codec: H.264 + audio_codec: Dolby Digital + release_group: SEPTiC + +? Movies/Borat (2006)/Borat.(2006).R5.PROPER.REPACK.DVDRip.XviD-PUKKA.avi +: title: Borat + year: 2006 + proper_count: 2 + source: DVD + other: [ Region 5, Proper, Rip ] + video_codec: Xvid + release_group: PUKKA + +? "[XCT].Le.Prestige.(The.Prestige).DVDRip.[x264.HP.He-Aac.{Fr-Eng}.St{Fr-Eng}.Chaps].mkv" +: title: Le Prestige + source: DVD + other: Rip + video_codec: H.264 + video_profile: High + audio_codec: AAC + audio_profile: High Efficiency + language: [ french, english ] + subtitle_language: [ french, english ] + release_group: Chaps + +? Battle Royale (2000)/Battle.Royale.(Batoru.Rowaiaru).(2000).(Special.Edition).CD1of2.DVDRiP.XviD-[ZeaL].avi +: title: Battle Royale + year: 2000 + edition: Special + cd: 1 + cd_count: 2 + source: DVD + other: Rip + video_codec: Xvid + release_group: ZeaL + +? Movies/Brazil (1985)/Brazil_Criterion_Edition_(1985).CD2.avi +: title: Brazil + edition: Criterion + year: 1985 + cd: 2 + +? Movies/Persepolis (2007)/[XCT] Persepolis [H264+Aac-128(Fr-Eng)+ST(Fr-Eng)+Ind].mkv +: title: Persepolis + year: 2007 + video_codec: H.264 + audio_codec: AAC + language: [ French, English ] + subtitle_language: [ French, English ] + release_group: Ind + +? Movies/Toy Story (1995)/Toy Story [HDTV 720p English-Spanish].mkv +: title: Toy Story + year: 1995 + source: HDTV + screen_size: 720p + language: [ english, spanish ] + +? Movies/Office Space (1999)/Office.Space.[Dual-DVDRip].[Spanish-English].[XviD-AC3-AC3].[by.Oswald].avi +: title: Office Space + year: 1999 + other: [Dual Audio, Rip] + source: DVD + language: [ english, spanish ] + video_codec: Xvid + audio_codec: Dolby Digital + +? Movies/Wild Zero (2000)/Wild.Zero.DVDivX-EPiC.avi +: title: Wild Zero + year: 2000 + video_codec: DivX + release_group: EPiC + +? movies/Baraka_Edition_Collector.avi +: title: Baraka + edition: Collector + +? Movies/Blade Runner (1982)/Blade.Runner.(1982).(Director's.Cut).CD1.DVDRip.XviD.AC3-WAF.avi +: title: Blade Runner + year: 1982 + edition: Director's Cut + cd: 1 + source: DVD + other: Rip + video_codec: Xvid + audio_codec: Dolby Digital + release_group: WAF + +? movies/American.The.Bill.Hicks.Story.2009.DVDRip.XviD-EPiSODE.[UsaBit.com]/UsaBit.com_esd-americanbh.avi +: title: American The Bill Hicks Story + year: 2009 + source: DVD + other: Rip + video_codec: Xvid + release_group: EPiSODE + website: UsaBit.com + +? movies/Charlie.And.Boots.DVDRip.XviD-TheWretched/wthd-cab.avi +: title: Charlie And Boots + source: DVD + other: Rip + video_codec: Xvid + release_group: TheWretched + +? movies/Steig Larsson Millenium Trilogy (2009) BRrip 720 AAC x264/(1)The Girl With The Dragon Tattoo (2009) BRrip 720 AAC x264.mkv +: title: The Girl With The Dragon Tattoo + #film_title: Steig Larsson Millenium Trilogy + #film: 1 + year: 2009 + source: Blu-ray + other: [Reencoded, Rip] + audio_codec: AAC + video_codec: H.264 + screen_size: 720p + +? movies/Greenberg.REPACK.LiMiTED.DVDRip.XviD-ARROW/arw-repack-greenberg.dvdrip.xvid.avi +: title: Greenberg + source: DVD + video_codec: Xvid + release_group: ARROW + other: [Proper, Rip] + edition: Limited + proper_count: 1 + +? Movies/Fr - Paris 2054, Renaissance (2005) - De Christian Volckman - (Film Divx Science Fiction Fantastique Thriller Policier N&B).avi +: title: Paris 2054, Renaissance + year: 2005 + language: french + video_codec: DivX + +? Movies/[阿维达].Avida.2006.FRENCH.DVDRiP.XViD-PROD.avi +: title: Avida + year: 2006 + language: french + source: DVD + other: Rip + video_codec: Xvid + release_group: PROD + +? Movies/Alice in Wonderland DVDRip.XviD-DiAMOND/dmd-aw.avi +: title: Alice in Wonderland + source: DVD + other: Rip + video_codec: Xvid + release_group: DiAMOND + +? Movies/Ne.Le.Dis.A.Personne.Fr 2 cd/personnea_mp.avi +: title: Ne Le Dis A Personne + language: french + cd_count: 2 + +? Movies/Bunker Palace Hôtel (Enki Bilal) (1989)/Enki Bilal - Bunker Palace Hotel (Fr Vhs Rip).avi +: title: Bunker Palace Hôtel + year: 1989 + language: french + source: VHS + other: Rip + +? Movies/21 (2008)/21.(2008).DVDRip.x264.AC3-FtS.[sharethefiles.com].mkv +: title: "21" + year: 2008 + source: DVD + other: Rip + video_codec: H.264 + audio_codec: Dolby Digital + release_group: FtS + website: sharethefiles.com + +? Movies/9 (2009)/9.2009.Blu-ray.DTS.720p.x264.HDBRiSe.[sharethefiles.com].mkv +: title: "9" + year: 2009 + source: Blu-ray + audio_codec: DTS + screen_size: 720p + video_codec: H.264 + release_group: HDBRiSe + website: sharethefiles.com + +? Movies/Mamma.Mia.2008.DVDRip.AC3.XviD-CrazyTeam/Mamma.Mia.2008.DVDRip.AC3.XviD-CrazyTeam.avi +: title: Mamma Mia + year: 2008 + source: DVD + other: Rip + audio_codec: Dolby Digital + video_codec: Xvid + release_group: CrazyTeam + +? Movies/M.A.S.H. (1970)/MASH.(1970).[Divx.5.02][Dual-Subtitulos][DVDRip].ogm +: title: MASH + year: 1970 + video_codec: DivX + source: DVD + other: [Dual Audio, Rip] + +? Movies/The Doors (1991)/09.03.08.The.Doors.(1991).BDRip.720p.AC3.X264-HiS@SiLUHD-English.[sharethefiles.com].mkv +: title: The Doors + year: 1991 + date: 2008-03-09 + source: Blu-ray + other: Rip + screen_size: 720p + audio_codec: Dolby Digital + video_codec: H.264 + release_group: HiS@SiLUHD + language: english + website: sharethefiles.com + +? Movies/The Doors (1991)/08.03.09.The.Doors.(1991).BDRip.720p.AC3.X264-HiS@SiLUHD-English.[sharethefiles.com].mkv +: options: --date-year-first + title: The Doors + year: 1991 + date: 2008-03-09 + source: Blu-ray + other: Rip + screen_size: 720p + audio_codec: Dolby Digital + video_codec: H.264 + release_group: HiS@SiLUHD + language: english + website: sharethefiles.com + +? Movies/Ratatouille/video_ts-ratatouille.srt +: title: Ratatouille + source: DVD + +# Removing this one because 001 is guessed as an episode number. +# ? Movies/001 __ A classer/Fantomas se déchaine - Louis de Funès.avi +# : title: Fantomas se déchaine + +? Movies/Comme une Image (2004)/Comme.Une.Image.FRENCH.DVDRiP.XViD-NTK.par-www.divx-overnet.com.avi +: title: Comme une Image + year: 2004 + language: french + source: DVD + other: Rip + video_codec: Xvid + release_group: NTK + website: www.divx-overnet.com + +? Movies/Fantastic Mr Fox/Fantastic.Mr.Fox.2009.DVDRip.{x264+LC-AAC.5.1}{Fr-Eng}{Sub.Fr-Eng}-™.[sharethefiles.com].mkv +: title: Fantastic Mr Fox + year: 2009 + source: DVD + other: Rip + video_codec: H.264 + audio_codec: AAC + audio_profile: Low Complexity + audio_channels: "5.1" + language: [ french, english ] + subtitle_language: [ french, english ] + website: sharethefiles.com + +? Movies/Somewhere.2010.DVDRip.XviD-iLG/i-smwhr.avi +: title: Somewhere + year: 2010 + source: DVD + other: Rip + video_codec: Xvid + release_group: iLG + +? Movies/Moon_(2009).mkv +: title: Moon + year: 2009 + +? Movies/Moon_(2009)-x02-Making_Of.mkv +: title: Moon + year: 2009 + bonus: 2 + bonus_title: Making Of + +? movies/James_Bond-f17-Goldeneye.mkv +: title: Goldeneye + film_title: James Bond + film: 17 + + +? /movies/James_Bond-f21-Casino_Royale.mkv +: title: Casino Royale + film_title: James Bond + film: 21 + +? /movies/James_Bond-f21-Casino_Royale-x01-Becoming_Bond.mkv +: title: Casino Royale + film_title: James Bond + film: 21 + bonus: 1 + bonus_title: Becoming Bond + +? /movies/James_Bond-f21-Casino_Royale-x02-Stunts.mkv +: title: Casino Royale + film_title: James Bond + film: 21 + bonus: 2 + bonus_title: Stunts + +? OSS_117--Cairo,_Nest_of_Spies.mkv +: title: OSS 117 +# TODO: Implement subTitle for movies. + +? The Godfather Part 3.mkv +? The Godfather Part III.mkv +: title: The Godfather + part: 3 + +? Foobar Part VI.mkv +: title: Foobar + part: 6 + +? The_Insider-(1999)-x02-60_Minutes_Interview-1996.mp4 +: title: The Insider + year: 1999 + bonus: 2 + bonus_title: 60 Minutes Interview-1996 + +? Rush.._Beyond_The_Lighted_Stage-x09-Between_Sun_and_Moon-2002_Hartford.mkv +: title: Rush Beyond The Lighted Stage + bonus: 9 + bonus_title: Between Sun and Moon + year: 2002 + +? /public/uTorrent/Downloads Finished/Movies/Indiana.Jones.and.the.Temple.of.Doom.1984.HDTV.720p.x264.AC3.5.1-REDµX/Indiana.Jones.and.the.Temple.of.Doom.1984.HDTV.720p.x264.AC3.5.1-REDµX.mkv +: title: Indiana Jones and the Temple of Doom + year: 1984 + source: HDTV + screen_size: 720p + video_codec: H.264 + audio_codec: Dolby Digital + audio_channels: "5.1" + release_group: REDµX + +? The.Director’s.Notebook.2006.Blu-Ray.x264.DXVA.720p.AC3-de[42].mkv +: title: The Director’s Notebook + year: 2006 + source: Blu-ray + video_codec: H.264 + video_api: DXVA + screen_size: 720p + audio_codec: Dolby Digital + release_group: de[42] + + +? Movies/Cosmopolis.2012.LiMiTED.720p.BluRay.x264-AN0NYM0US[bb]/ano-cosmo.720p.mkv +: title: Cosmopolis + year: 2012 + screen_size: 720p + video_codec: H.264 + release_group: AN0NYM0US[bb] + source: Blu-ray + edition: Limited + +? movies/La Science des Rêves (2006)/La.Science.Des.Reves.FRENCH.DVDRip.XviD-MP-AceBot.avi +: title: La Science des Rêves + year: 2006 + source: DVD + other: Rip + video_codec: Xvid + video_profile: Main + release_group: AceBot + language: French + +? The_Italian_Job.mkv +: title: The Italian Job + +? The.Rum.Diary.2011.1080p.BluRay.DTS.x264.D-Z0N3.mkv +: title: The Rum Diary + year: 2011 + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + audio_codec: DTS + release_group: D-Z0N3 + +? Life.Of.Pi.2012.1080p.BluRay.DTS.x264.D-Z0N3.mkv +: title: Life Of Pi + year: 2012 + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + audio_codec: DTS + release_group: D-Z0N3 + +? The.Kings.Speech.2010.1080p.BluRay.DTS.x264.D Z0N3.mkv +: title: The Kings Speech + year: 2010 + screen_size: 1080p + source: Blu-ray + audio_codec: DTS + video_codec: H.264 + release_group: D Z0N3 + +? Street.Kings.2008.BluRay.1080p.DTS.x264.dxva EuReKA.mkv +: title: Street Kings + year: 2008 + source: Blu-ray + screen_size: 1080p + audio_codec: DTS + video_codec: H.264 + video_api: DXVA + release_group: EuReKA + +? 2001.A.Space.Odyssey.1968.HDDVD.1080p.DTS.x264.dxva EuReKA.mkv +: title: 2001 A Space Odyssey + year: 1968 + source: HD-DVD + screen_size: 1080p + audio_codec: DTS + video_codec: H.264 + video_api: DXVA + release_group: EuReKA + +? 2012.2009.720p.BluRay.x264.DTS WiKi.mkv +: title: "2012" + year: 2009 + screen_size: 720p + source: Blu-ray + video_codec: H.264 + audio_codec: DTS + release_group: WiKi + +? /share/Download/movie/Dead Man Down (2013) BRRiP XViD DD5_1 Custom NLSubs =-_lt Q_o_Q gt-=_/XD607ebb-BRc59935-5155473f-1c5f49/XD607ebb-BRc59935-5155473f-1c5f49.avi +: title: Dead Man Down + year: 2013 + source: Blu-ray + other: [Reencoded, Rip] + video_codec: Xvid + audio_channels: "5.1" + audio_codec: Dolby Digital + uuid: XD607ebb-BRc59935-5155473f-1c5f49 + +? Pacific.Rim.3D.2013.COMPLETE.BLURAY-PCH.avi +: title: Pacific Rim + year: 2013 + source: Blu-ray + other: + - Complete + - 3D + release_group: PCH + +? Immersion.French.2011.STV.READNFO.QC.FRENCH.ENGLISH.NTSC.DVDR.nfo +: title: Immersion French + year: 2011 + language: + - French + - English + source: DVD + other: [Straight to Video, Read NFO, NTSC] + +? Immersion.French.2011.STV.READNFO.QC.FRENCH.NTSC.DVDR.nfo +: title: Immersion French + year: 2011 + language: French + source: DVD + other: [Straight to Video, Read NFO, NTSC] + +? Immersion.French.2011.STV.READNFO.QC.NTSC.DVDR.nfo +: title: Immersion + language: French + year: 2011 + source: DVD + other: [Straight to Video, Read NFO, NTSC] + +? French.Immersion.2011.STV.READNFO.QC.ENGLISH.NTSC.DVDR.nfo +: title: French Immersion + year: 2011 + language: ENGLISH + source: DVD + other: [Straight to Video, Read NFO, NTSC] + +? Howl's_Moving_Castle_(2004)_[720p,HDTV,x264,DTS]-FlexGet.avi +: video_codec: H.264 + source: HDTV + title: Howl's Moving Castle + screen_size: 720p + year: 2004 + audio_codec: DTS + release_group: FlexGet + +? Pirates de langkasuka.2008.FRENCH.1920X1080.h264.AVC.AsiaRa.mkv +: screen_size: 1080p + year: 2008 + language: French + video_codec: H.264 + title: Pirates de langkasuka + release_group: AsiaRa + +? Masala (2013) Telugu Movie HD DVDScr XviD - Exclusive.avi +: year: 2013 + video_codec: Xvid + title: Masala + source: HD-DVD + other: Screener + release_group: Exclusive + +? Django Unchained 2012 DVDSCR X264 AAC-P2P.nfo +: year: 2012 + other: Screener + video_codec: H.264 + title: Django Unchained + audio_codec: AAC + source: DVD + release_group: P2P + +? Ejecutiva.En.Apuros(2009).BLURAY.SCR.Xvid.Spanish.LanzamientosD.nfo +: year: 2009 + other: Screener + source: Blu-ray + video_codec: Xvid + language: Spanish + title: Ejecutiva En Apuros + +? Die.Schluempfe.2.German.DL.1080p.BluRay.x264-EXQUiSiTE.mkv +: title: Die Schluempfe 2 + source: Blu-ray + language: + - Multiple languages + - German + video_codec: H.264 + release_group: EXQUiSiTE + screen_size: 1080p + +? Rocky 1976 French SubForced BRRip x264 AC3-FUNKY.mkv +: title: Rocky + year: 1976 + subtitle_language: French + source: Blu-ray + other: [Reencoded, Rip] + video_codec: H.264 + audio_codec: Dolby Digital + release_group: FUNKY + +? REDLINE (BD 1080p H264 10bit FLAC) [3xR].mkv +: title: REDLINE + source: Blu-ray + video_codec: H.264 + color_depth: 10-bit + audio_codec: FLAC + screen_size: 1080p + +? The.Lizzie.McGuire.Movie.(2003).HR.DVDRiP.avi +: title: The Lizzie McGuire Movie + year: 2003 + source: DVD + other: [High Resolution, Rip] + +? Hua.Mulan.BRRIP.MP4.x264.720p-HR.avi +: title: Hua Mulan + video_codec: H.264 + source: Blu-ray + screen_size: 720p + other: [Reencoded, Rip] + release_group: HR + +? Dr.Seuss.The.Lorax.2012.DVDRip.LiNE.XviD.AC3.HQ.Hive-CM8.mp4 +: video_codec: Xvid + title: Dr Seuss The Lorax + source: DVD + other: [Rip, Line Audio] + year: 2012 + audio_codec: Dolby Digital + audio_profile: High Quality + release_group: Hive-CM8 + +? "Star Wars: Episode IV - A New Hope (2004) Special Edition.MKV" +: title: "Star Wars: Episode IV" + alternative_title: A New Hope + year: 2004 + edition: Special + +? Dr.LiNE.The.Lorax.2012.DVDRip.LiNE.XviD.AC3.HQ.Hive-CM8.mp4 +: video_codec: Xvid + title: Dr LiNE The Lorax + source: DVD + other: [Rip, Line Audio] + year: 2012 + audio_codec: Dolby Digital + audio_profile: High Quality + release_group: Hive-CM8 + +? Dr.LiNE.The.Lorax.2012.DVDRip.XviD.AC3.HQ.Hive-CM8.mp4 +: video_codec: Xvid + title: Dr LiNE The Lorax + source: DVD + other: Rip + year: 2012 + audio_codec: Dolby Digital + audio_profile: High Quality + release_group: Hive-CM8 + +? Perfect Child-2007-TRUEFRENCH-TVRip.Xvid-h@mster.avi +: release_group: h@mster + title: Perfect Child + video_codec: Xvid + language: French + source: TV + other: Rip + year: 2007 + +? entre.ciel.et.terre.(1994).dvdrip.h264.aac-psypeon.avi +: audio_codec: AAC + source: DVD + other: Rip + release_group: psypeon + title: entre ciel et terre + video_codec: H.264 + year: 1994 + +? Yves.Saint.Laurent.2013.FRENCH.DVDSCR.MD.XviD-ViVARiUM.avi +: source: DVD + language: French + other: [Screener, Mic Dubbed] + release_group: ViVARiUM + title: Yves Saint Laurent + video_codec: Xvid + year: 2013 + +? Echec et Mort - Hard to Kill - Steven Seagal Multi 1080p BluRay x264 CCATS.avi +: source: Blu-ray + language: Multiple languages + release_group: CCATS + screen_size: 1080p + title: Echec et Mort + alternative_title: + - Hard to Kill + - Steven Seagal + video_codec: H.264 + +? Paparazzi - Timsit/Lindon (MKV 1080p tvripHD) +: options: -n + title: Paparazzi + alternative_title: + - Timsit + - Lindon + screen_size: 1080p + container: mkv + source: HDTV + other: Rip + +? some.movie.720p.bluray.x264-mind +: title: some movie + screen_size: 720p + video_codec: H.264 + release_group: mind + source: Blu-ray + +? Dr LiNE The Lorax 720p h264 BluRay +: title: Dr LiNE The Lorax + screen_size: 720p + video_codec: H.264 + source: Blu-ray + +#TODO: Camelcase implementation +#? BeatdownFrenchDVDRip.mkv +#: options: -c +# title: Beatdown +# language: French +# source: DVD + +#? YvesSaintLaurent2013FrenchDVDScrXvid.avi +#: options: -c +# source: DVD +# language: French +# other: Screener +# title: Yves saint laurent +# video_codec: Xvid +# year: 2013 + + +? Elle.s.en.va.720p.mkv +: screen_size: 720p + title: Elle s en va + +? FooBar.7.PDTV-FlexGet +: source: Digital TV + release_group: FlexGet + title: FooBar 7 + +? h265 - HEVC Riddick Unrated Director Cut French 1080p DTS.mkv +: audio_codec: DTS + edition: [Unrated, Director's Cut] + language: fr + screen_size: 1080p + title: Riddick + video_codec: H.265 + +? "[h265 - HEVC] Riddick Unrated Director Cut French [1080p DTS].mkv" +: audio_codec: DTS + edition: [Unrated, Director's Cut] + language: fr + screen_size: 1080p + title: Riddick + video_codec: H.265 + +? Barbecue-2014-French-mHD-1080p +: language: fr + other: Micro HD + screen_size: 1080p + title: Barbecue + year: 2014 + +? Underworld Quadrilogie VO+VFF+VFQ 1080p HDlight.x264~Tonyk~Monde Infernal +: language: fr + other: [Original Video, Micro HD] + screen_size: 1080p + title: Underworld Quadrilogie + video_codec: H.264 + +? A Bout Portant (The Killers).PAL.Multi.DVD-R-KZ +: source: DVD + language: mul + release_group: KZ + title: A Bout Portant + +? "Mise à Sac (Alain Cavalier, 1967) [Vhs.Rip.Vff]" +: source: VHS + language: fr + title: "Mise à Sac" + year: 1967 + +? A Bout Portant (The Killers).PAL.Multi.DVD-R-KZ +: source: DVD + other: PAL + language: mul + release_group: KZ + title: A Bout Portant + +? Youth.In.Revolt.(Be.Bad).2009.MULTI.1080p.LAME3*92-MEDIOZZ +: audio_codec: MP3 + language: mul + release_group: MEDIOZZ + screen_size: 1080p + title: Youth In Revolt + year: 2009 + +? La Defense Lincoln (The Lincoln Lawyer) 2011 [DVDRIP][Vostfr] +: source: DVD + other: Rip + subtitle_language: fr + title: La Defense Lincoln + year: 2011 + +? '[h265 - HEVC] Fight Club French 1080p DTS.' +: audio_codec: DTS + language: fr + screen_size: 1080p + title: Fight Club + video_codec: H.265 + +? Love Gourou (Mike Myers) - FR +: language: fr + title: Love Gourou + +? '[h265 - hevc] transformers 2 1080p french ac3 6ch.' +: audio_channels: '5.1' + audio_codec: Dolby Digital + language: fr + screen_size: 1080p + title: transformers 2 + video_codec: H.265 + +? 1.Angry.Man.1957.mkv +: title: 1 Angry Man + year: 1957 + +? 12.Angry.Men.1957.mkv +: title: 12 Angry Men + year: 1957 + +? 123.Angry.Men.1957.mkv +: title: 123 Angry Men + year: 1957 + +? "Looney Tunes 1444x866 Porky's Last Stand.mkv" +: screen_size: 1444x866 + title: Looney Tunes + +? Das.Appartement.German.AC3D.DL.720p.BluRay.x264-TVP +: audio_codec: Dolby Digital + source: Blu-ray + language: + - German + - Multi + release_group: TVP + screen_size: 720p + title: Das Appartement + type: movie + video_codec: H.264 + +? Das.Appartement.GERMAN.AC3D.DL.720p.BluRay.x264-TVP +: audio_codec: Dolby Digital + source: Blu-ray + language: + - de + - mul + release_group: TVP + screen_size: 720p + title: Das Appartement + video_codec: H.264 + +? Hyena.Road.2015.German.1080p.DL.DTSHD.Bluray.x264-pmHD +: audio_codec: DTS-HD + source: Blu-ray + language: + - de + - mul + release_group: pmHD + screen_size: 1080p + title: Hyena Road + type: movie + video_codec: H.264 + year: 2015 + +? Hyena.Road.2015.German.1080p.DL.DTSHD.Bluray.x264-pmHD +: audio_codec: DTS-HD + source: Blu-ray + language: + - de + - mul + release_group: pmHD + screen_size: 1080p + title: Hyena Road + type: movie + video_codec: H.264 + year: 2015 + +? Name.BDMux.720p +: title: Name + source: Blu-ray + other: Mux + screen_size: 720p + type: movie + +? Name.BRMux.720p +: title: Name + source: Blu-ray + other: [Reencoded, Mux] + screen_size: 720p + type: movie + +? Name.BDRipMux.720p +: title: Name + source: Blu-ray + other: [Rip, Mux] + screen_size: 720p + type: movie + +? Name.BRRipMux.720p +: title: Name + source: Blu-ray + other: [Reencoded, Rip, Mux] + screen_size: 720p + type: movie + +? Secondary Education (2013).mkv +: options: -T Second + title: Secondary Education + year: 2013 + type: movie + +? Mad Max Beyond Thunderdome () +: title: Mad Max Beyond Thunderdome + type: movie + +? Hacksaw Ridge 2016 Multi 2160p UHD BluRay Hevc10 HDR10 DTSHD & ATMOS 7.1 -DDR.mkv +: title: Hacksaw Ridge + year: 2016 + language: mul + screen_size: 2160p + source: Ultra HD Blu-ray + video_codec: H.265 + color_depth: 10-bit + audio_codec: [DTS-HD, Dolby Atmos] + audio_channels: '7.1' + release_group: DDR + container: mkv + type: movie + +? Special.Correspondents.2016.iTA.ENG.4K.2160p.NetflixUHD.TeamPremium.mp4 +: title: Special Correspondents + year: 2016 + language: [it, en] + screen_size: 2160p + streaming_service: Netflix + other: Ultra HD + release_group: TeamPremium + container: mp4 + type: movie + +? -Special.Correspondents.2016.iTA.ENG.4K.2160p.NetflixUHD.TeamPremium.mp4 +: alternative_title: 4K + +? -Special.Correspondents.2016.iTA.ENG.4K.2160p.NetflixUHD.TeamPremium.mp4 +: alternative_title: 2160p + +? Suicide Squad EXTENDED (2016) 2160p 4K UltraHD Blu-Ray x265 (HEVC 10bit BT709) Dolby Atmos 7.1 -DDR +: title: Suicide Squad + edition: Extended + year: 2016 + screen_size: 2160p + source: Ultra HD Blu-ray + video_codec: H.265 + color_depth: 10-bit + audio_codec: Dolby Atmos + audio_channels: '7.1' + release_group: DDR + type: movie + +? Queen - A Kind of Magic (Alternative Extended Version) 2CD 2014 +: title: Queen + alternative_title: A Kind of Magic + edition: [Alternative Cut, Extended] + cd_count: 2 + year: 2014 + type: movie + +? Jour.de.Fete.1949.ALTERNATiVE.CUT.1080p.BluRay.x264-SADPANDA[rarbg] +: title: Jour de Fete + year: 1949 + edition: Alternative Cut + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + release_group: SADPANDA[rarbg] + +? The.Movie.CONVERT.720p.HDTV.x264-C4TV +: title: The Movie + other: Converted + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: C4TV + type: movie + +? Its.A.Wonderful.Life.1946.Colorized.720p.BRRip.999MB.MkvCage.com +: title: Its A Wonderful Life + year: 1946 + other: [Colorized, Reencoded, Rip] + screen_size: 720p + source: Blu-ray + size: 999MB + website: MkvCage.com + type: movie + +? Alien DC (1979) [1080p] +: title: Alien + edition: Director's Cut + year: 1979 + screen_size: 1080p + type: movie + +? Requiem.For.A.Dream.2000.DC.1080p.BluRay.x264.anoXmous +: title: Requiem For A Dream + year: 2000 + edition: Director's Cut + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + release_group: anoXmous + type: movie + +? Before.the.Flood.2016.DOCU.1080p.WEBRip.x264.DD5.1-FGT +: title: Before the Flood + year: 2016 + other: [Documentary, Rip] + screen_size: 1080p + source: Web + video_codec: H.264 + audio_codec: Dolby Digital + audio_channels: '5.1' + release_group: FGT + type: movie + +? Zootopia.2016.HDRip.1.46Gb.Dub.MegaPeer +: title: Zootopia + year: 2016 + other: [HD, Rip] + size: 1.46GB + language: und + release_group: MegaPeer + type: movie + +? Suntan.2016.FESTiVAL.DVDRip.x264-IcHoR +: title: Suntan + year: 2016 + edition: Festival + source: DVD + other: Rip + video_codec: H.264 + release_group: IcHoR + type: movie + +? Hardwired.STV.NFOFiX.FRENCH.DVDRiP.XviD-SURViVAL +: title: Hardwired + other: [Straight to Video, Fix, Rip] + language: french + source: DVD + video_codec: Xvid + release_group: SURViVAL + -proper_count: 1 + type: movie + +? Maze.Runner.The.Scorch.Trials.OM.2015.WEB-DLRip.by.Seven +: title: Maze Runner The Scorch Trials + other: [Open Matte, Rip] + year: 2015 + source: Web + release_group: Seven + type: movie + +? Kampen Om Tungtvannet aka The Heavy Water War COMPLETE 720p x265 HEVC-Lund +: title: Kampen Om Tungtvannet aka The Heavy Water War + other: Complete + screen_size: 720p + video_codec: H.265 + release_group: Lund + type: movie + +? All.Fall.Down.x264.PROOFFIX-OUTLAWS +: title: All Fall Down + video_codec: H.264 + other: Fix + release_group: OUTLAWS + -proper_count: 1 + type: movie + +? The.Last.Survivors.2014.PROOF.SAMPLE.FiX.BDRip.x264-TOPCAT +: title: The Last Survivors + year: 2014 + other: [Fix, Rip] + source: Blu-ray + video_codec: H.264 + release_group: TOPCAT + type: movie + +? Bad Santa 2 2016 THEATRiCAL FRENCH BDRip XviD-EXTREME +: title: Bad Santa 2 + year: 2016 + edition: Theatrical + language: french + source: Blu-ray + other: Rip + video_codec: Xvid + release_group: EXTREME + type: movie + +? The Lord of the Rings The Fellowship of the Ring THEATRICAL EDITION (2001) [1080p] +: title: The Lord of the Rings The Fellowship of the Ring + edition: Theatrical + year: 2001 + screen_size: 1080p + type: movie + +? World War Z (2013) Theatrical Cut 720p BluRay x264 +: title: World War Z + year: 2013 + edition: Theatrical + screen_size: 720p + source: Blu-ray + video_codec: H.264 + type: movie + +? The Heartbreak Kid (1993) UNCUT 720p WEBRip x264 +: title: The Heartbreak Kid + year: 1993 + edition: Uncut + other: Rip + screen_size: 720p + source: Web + video_codec: H.264 + type: movie + +? Mrs.Doubtfire.1993.720p.OAR.Bluray.DTS.x264-CtrlHD +: title: Mrs Doubtfire + year: 1993 + screen_size: 720p + other: Original Aspect Ratio + source: Blu-ray + audio_codec: DTS + video_codec: H.264 + release_group: CtrlHD + type: movie + +? Aliens.SE.1986.BDRip.1080p +: title: Aliens + edition: Special + year: 1986 + source: Blu-ray + other: Rip + screen_size: 1080p + type: movie + +? 10 Cloverfield Lane.[Blu-Ray 1080p].[MULTI] +: options: --type movie + title: 10 Cloverfield Lane + source: Blu-ray + screen_size: 1080p + language: Multiple languages + type: movie + +? 007.Spectre.[HDTC.MD].[TRUEFRENCH] +: options: --type movie + title: 007 Spectre + source: HD Telecine + language: French + type: movie + +? We.Are.X.2016.LIMITED.BDRip.x264-BiPOLAR +: title: We Are X + year: 2016 + edition: Limited + source: Blu-ray + other: Rip + video_codec: H.264 + release_group: BiPOLAR + type: movie + +? The Rack (VHS) [1956] Paul Newman +: title: The Rack + source: VHS + year: 1956 + type: movie + +? Les.Magiciens.1976.VHSRip.XViD.MKO +: title: Les Magiciens + year: 1976 + source: VHS + other: Rip + video_codec: Xvid + release_group: MKO + type: movie + +? The Boss Baby 2017 720p CAM x264 AC3 TiTAN +: title: The Boss Baby + year: 2017 + screen_size: 720p + source: Camera + video_codec: H.264 + audio_codec: Dolby Digital + release_group: TiTAN + type: movie + +? The.Boss.Baby.2017.HDCAM.XviD-MrGrey +: title: The Boss Baby + year: 2017 + source: HD Camera + video_codec: Xvid + release_group: MrGrey + type: movie + +? The Martian 2015 Multi 2160p 4K UHD Bluray HEVC10 SDR DTSHD 7.1 -Zeus +: title: The Martian + year: 2015 + language: mul + screen_size: 2160p + source: Ultra HD Blu-ray + video_codec: H.265 + color_depth: 10-bit + other: Standard Dynamic Range + audio_codec: DTS-HD + audio_channels: '7.1' + release_group: Zeus + type: movie + +? Fantastic Beasts and Where to Find Them 2016 Multi 2160p UHD BluRay HEVC HDR Atmos7.1-DDR +: title: Fantastic Beasts and Where to Find Them + year: 2016 + language: mul + screen_size: 2160p + source: Ultra HD Blu-ray + video_codec: H.265 + other: HDR10 + audio_codec: Dolby Atmos + audio_channels: '7.1' + release_group: DDR + type: movie + +? Life of Pi 2012 2160p 4K BluRay HDR10 HEVC BT2020 DTSHD 7.1 subs -DDR +: title: Life of Pi + year: 2012 + screen_size: 2160p + source: Ultra HD Blu-ray + other: [HDR10, BT.2020] + subtitle_language: und + release_group: DDR + +? Captain.America.Civil.War.HDR.1080p.HEVC.10bit.BT.2020.DTS-HD.MA.7.1-VISIONPLUSHDR +: title: Captain America Civil War + other: [HDR10, BT.2020] + screen_size: 1080p + video_codec: H.265 + color_depth: 10-bit + audio_codec: DTS-HD + audio_profile: Master Audio + audio_channels: '7.1' + release_group: VISIONPLUSHDR + type: movie + +? Deadpool.2016.4K.2160p.UHD.HQ.8bit.BluRay.8CH.x265.HEVC-MZABI.mkv +: title: Deadpool + year: 2016 + screen_size: 2160p + source: Ultra HD Blu-ray + other: High Quality + color_depth: 8-bit + audio_channels: '7.1' + video_codec: H.265 + release_group: MZABI + type: movie + +? Fantastic.Beasts.and.Where.to.Find.Them.2016.2160p.4K.UHD.10bit.HDR.BluRay.7.1.x265.HEVC-MZABI.mkv +: title: Fantastic Beasts and Where to Find Them + year: 2016 + screen_size: 2160p + source: Ultra HD Blu-ray + color_depth: 10-bit + other: HDR10 + audio_channels: '7.1' + video_codec: H.265 + release_group: MZABI + container: mkv + type: movie + +? The.Arrival.4K.HDR.HEVC.10bit.BT2020.DTS.HD-MA-MadVR.HDR10.Dolby.Vision-VISIONPLUSHDR1000 +: title: The Arrival + screen_size: 2160p + other: [HDR10, BT.2020, Dolby Vision] + video_codec: H.265 + color_depth: 10-bit + audio_codec: DTS-HD + audio_profile: Master Audio + release_group: VISIONPLUSHDR1000 + type: movie + +? How To Steal A Dog.2014.BluRay.1080p.12bit.HEVC.OPUS 5.1-Hn1Dr2.mkv +: title: How To Steal A Dog + year: 2014 + source: Blu-ray + screen_size: 1080p + color_depth: 12-bit + video_codec: H.265 + audio_codec: Opus + audio_channels: '5.1' + release_group: Hn1Dr2 + container: mkv + type: movie + +? Interstelar.2014.IMAX.RUS.BDRip.x264.-HELLYWOOD.mkv +: title: Interstelar + year: 2014 + edition: IMAX + language: ru + source: Blu-ray + other: Rip + video_codec: H.264 + release_group: HELLYWOOD + container: mkv + type: movie + +? The.Dark.Knight.IMAX.EDITION.HQ.BluRay.1080p.x264.AC3.Hindi.Eng.ETRG +: title: The Dark Knight + edition: IMAX + other: High Quality + source: Blu-ray + screen_size: 1080p + video_codec: H.264 + audio_codec: Dolby Digital + language: [hindi, english] + release_group: ETRG + type: movie + +? The.Martian.2015.4K.UHD.UPSCALED-ETRG +: title: The Martian + year: 2015 + screen_size: 2160p + other: [Ultra HD, Upscaled] + release_group: ETRG + type: movie + +? Delibal 2015 720p Upscale DVDRip x264 DD5.1 AC3 +: title: Delibal + year: 2015 + screen_size: 720p + other: [Upscaled, Rip] + source: DVD + video_codec: H.264 + audio_codec: Dolby Digital + audio_channels: '5.1' + type: movie + +? Casablanca [Ultimate Collector's Edition].1942.BRRip.XviD-VLiS +: title: Casablanca + edition: [Ultimate, Collector] + year: 1942 + source: Blu-ray + other: [Reencoded, Rip] + video_codec: Xvid + release_group: VLiS + type: movie + +? Batman V Superman Dawn of Justice 2016 Extended Cut Ultimate Edition HDRip x264 AC3-DaDDy +: title: Batman V Superman Dawn of Justice + year: 2016 + edition: [Extended, Ultimate] + other: [HD, Rip] + video_codec: H.264 + audio_codec: Dolby Digital + release_group: DaDDy + type: movie + +? Stargate SG1 Ultimate Fan Collection +: title: Stargate SG1 + edition: [Ultimate, Fan] + +? The.Jungle.Book.2016.MULTi.1080p.BluRay.x264.DTS-HD.MA.7.1.DTS-HD.HRA.5.1-LeRalou +: title: The Jungle Book + year: 2016 + language: mul + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + audio_codec: DTS-HD + audio_profile: [Master Audio, High Resolution Audio] + audio_channels: ['7.1', '5.1'] + release_group: LeRalou + type: movie + +? Terminus.2015.BluRay.1080p.x264.DTS-HD.HRA.5.1-LTT +: title: Terminus + year: 2015 + source: Blu-ray + screen_size: 1080p + video_codec: H.264 + audio_codec: DTS-HD + audio_profile: High Resolution Audio + audio_channels: '5.1' + release_group: LTT + type: movie + +? Ghost.in.the.Shell.1995.1080p.Bluray.DTSES.x264-SHiTSoNy +: title: Ghost in the Shell + year: 1995 + screen_size: 1080p + source: Blu-ray + audio_codec: DTS + audio_profile: Extended Surround + +? The.Boss.Baby.2017.BluRay.1080p.DTS-ES.x264-PRoDJi +: title: The Boss Baby + year: 2017 + source: Blu-ray + screen_size: 1080p + audio_codec: DTS + audio_profile: Extended Surround + video_codec: H.264 + release_group: PRoDJi + type: movie + +? Title.2000.720p.BluRay.DDEX.x264-HDClub.mkv +: title: Title + year: 2000 + screen_size: 720p + source: Blu-ray + audio_codec: Dolby Digital + audio_profile: EX + video_codec: H.264 + release_group: HDClub + container: mkv + type: movie + +? Jack Reacher Never Go Back 2016 720p Bluray DD-EX x264-BluPanther +: title: Jack Reacher Never Go Back + year: 2016 + screen_size: 720p + source: Blu-ray + audio_codec: Dolby Digital + audio_profile: EX + video_codec: H.264 + release_group: BluPanther + type: movie + +? How To Steal A Dog.2014.BluRay.1080p.12bit.HEVC.OPUS 5.1-Hn1Dr2.mkv +: title: How To Steal A Dog + year: 2014 + source: Blu-ray + screen_size: 1080p + color_depth: 12-bit + video_codec: H.265 + audio_codec: Opus + audio_channels: '5.1' + release_group: Hn1Dr2 + container: mkv + type: movie + +? How.To.Be.Single.2016.1080p.BluRay.x264-BLOW/blow-how.to.be.single.2016.1080p.bluray.x264.mkv +: title: How To Be Single + year: 2016 + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + release_group: BLOW + container: mkv + type: movie + +? After.the.Storm.2016.720p.YIFY +: title: After the Storm + year: 2016 + screen_size: 720p + release_group: YIFY + type: movie + +? Battle Royale 2000 DC (1080p Bluray x265 HEVC 10bit AAC 7.1 Japanese Tigole) +: title: Battle Royale + year: 2000 + edition: Director's Cut + screen_size: 1080p + source: Blu-ray + video_codec: H.265 + color_depth: 10-bit + audio_codec: AAC + audio_channels: '7.1' + language: jp + release_group: Tigole + +? Congo.The.Grand.Inga.Project.2013.1080p.BluRay.x264-OBiTS +: title: Congo The Grand Inga Project + year: 2013 + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + release_group: OBiTS + type: movie + +? Congo.The.Grand.Inga.Project.2013.BRRip.XviD.MP3-RARBG +: title: Congo The Grand Inga Project + year: 2013 + source: Blu-ray + other: [Reencoded, Rip] + video_codec: Xvid + audio_codec: MP3 + release_group: RARBG + type: movie + +? Congo.The.Grand.Inga.Project.2013.720p.BluRay.H264.AAC-RARBG +: title: Congo The Grand Inga Project + year: 2013 + screen_size: 720p + source: Blu-ray + video_codec: H.264 + audio_codec: AAC + release_group: RARBG + type: movie + +? Mit.dem.Bauch.durch.die.Wand.SWiSSGERMAN.DOKU.DVDRiP.x264-DEFLOW +: title: Mit dem Bauch durch die Wand + language: de-CH + other: [Documentary, Rip] + source: DVD + video_codec: H.264 + release_group: DEFLOW + type: movie + +? InDefinitely.Maybe.2008.1080p.EUR.BluRay.VC-1.DTS-HD.MA.5.1-FGT +: title: InDefinitely Maybe + year: 2008 + screen_size: 1080p + source: Blu-ray + video_codec: VC-1 + audio_codec: DTS-HD + audio_profile: Master Audio + audio_channels: '5.1' + release_group: FGT + type: movie + +? Bjyukujyo Kyoushi Kan XXX 720P WEBRIP MP4-GUSH +: title: Bjyukujyo Kyoushi Kan + other: [XXX, Rip] + screen_size: 720p + source: Web + container: mp4 + release_group: GUSH + type: movie + +? The.Man.With.The.Golden.Arm.1955.1080p.BluRay.x264.DTS-FGT +: title: The Man With The Golden Arm + year: 1955 + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + audio_codec: DTS + release_group: FGT + type: movie + +? blow-how.to.be.single.2016.1080p.bluray.x264.mkv +: release_group: blow + title: how to be single + year: 2016 + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + container: mkv + type: movie + +? ulshd-the.right.stuff.1983.multi.1080p.bluray.x264.mkv +: release_group: ulshd + title: the right stuff + year: 1983 + language: mul + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + container: mkv + type: movie + +? FROZEN [2010] LiMiTED DVDRip H262 AAC[ ENG SUBS]-MANTESH +: title: FROZEN + year: 2010 + edition: Limited + source: DVD + other: Rip + video_codec: MPEG-2 + audio_codec: AAC + subtitle_language: english + release_group: MANTESH + type: movie + +? Family.Katta.2016.1080p.WEB-DL.H263.DD5.1.ESub-DDR +: title: Family Katta + year: 2016 + screen_size: 1080p + source: Web + video_codec: H.263 + audio_codec: Dolby Digital + audio_channels: '5.1' + subtitle_language: und + release_group: DDR + type: movie + +? Bad Boys 2 1080i.mpg2.rus.eng.ts +: title: Bad Boys 2 + screen_size: 1080i + video_codec: MPEG-2 + language: [russian, english] + container: ts + type: movie + +? Alien.Director.Cut.Ita.Eng.VP9.Opus.AlphaBot.webm +: title: Alien + edition: Director's Cut + language: [english, italian] + video_codec: VP9 + audio_codec: Opus + release_group: AlphaBot + container: webm + type: movie + +? The.Stranger.1946.US.(Kino.Classics).Bluray.1080p.LPCM.DD-2.0.x264-Grym@BTNET +: title: The Stranger + year: 1946 + country: US + source: Blu-ray + screen_size: 1080p + audio_codec: [LPCM, Dolby Digital] + audio_channels: '2.0' + video_codec: H.264 + release_group: Grym@BTNET + type: movie + +? X-Men.Apocalypse.2016.complete.hdts.pcm.TrueFrench-Scarface45.avi +: title: X-Men Apocalypse + year: 2016 + other: Complete + source: HD Telesync + audio_codec: PCM + language: french + release_group: Scarface45 + container: avi + type: movie + +? Tears.of.Steel.2012.2160p.DMRip.Eng.HDCLUB.mkv +: title: Tears of Steel + year: 2012 + screen_size: 2160p + source: Digital Master + other: Rip + language: english + release_group: HDCLUB + container: mkv + type: movie + +? "/Movies/Open Season 2 (2008)/Open Season 2 (2008) - Bluray-1080p.x264.DTS.mkv" +: options: --type movie + title: Open Season 2 + year: 2008 + source: Blu-ray + screen_size: 1080p + video_codec: H.264 + audio_codec: DTS + container: mkv + type: movie + +? Re-Animator.1985.INTEGRAL VERSION LIMITED EDITION.1080p.BluRay.REMUX.AVC.DTS-HD MA 5.1-LAZY +: title: Re-Animator + year: 1985 + edition: Limited + screen_size: 1080p + source: Blu-ray + other: Remux + video_codec: H.264 + audio_codec: DTS-HD + audio_profile: Master Audio + audio_channels: '5.1' + release_group: LAZY + type: movie + +? Test (2013) [WEBDL-1080p] [x264 AC3] [ENG+RU+PT] [NTb].mkv +: title: Test + year: 2013 + source: Web + screen_size: 1080p + video_codec: H.264 + audio_codec: Dolby Digital + language: [en, ru, pt] + release_group: NTb + container: mkv + type: movie + +? "[nextorrent.org] Bienvenue.Au.Gondwana.2016.FRENCH.DVDRiP.XViD-AViTECH.avi" +: website: nextorrent.org + title: Bienvenue Au Gondwana + year: 2016 + language: french + source: DVD + other: Rip + video_codec: Xvid + release_group: AViTECH + container: avi + type: movie + +? Star Trek First Contact (1996) Blu-Ray 1080p24 H.264 TrueHD 5.1 CtrlHD +: title: Star Trek First Contact + year: 1996 + source: Blu-ray + screen_size: 1080p + frame_rate: 24fps + video_codec: H.264 + audio_codec: Dolby TrueHD + audio_channels: '5.1' + release_group: CtrlHD + type: movie + +? The.Hobbit.The.Desolation.of.Smaug.Extended.HFR.48fps.ITA.ENG.AC3.BDRip.1080p.x264_ZMachine.mkv +: title: The Hobbit The Desolation of Smaug + edition: Extended + other: [High Frame Rate, Rip] + frame_rate: 48fps + language: [it, en] + audio_codec: Dolby Digital + source: Blu-ray + screen_size: 1080p + video_codec: H.264 + release_group: ZMachine + container: mkv + type: movie + +? Test (2013) [WEBDL-1080p] [x264 AC3] [ENG+PT+DE] [STANDARD] +: title: Test + year: 2013 + source: Web + screen_size: 1080p + video_codec: H.264 + audio_codec: Dolby Digital + language: [en, pt, de] + release_group: STANDARD + type: movie + +? Test (2013) [WEBDL-1080p] [x264 AC3] [ENG+DE+IT] [STANDARD] +: title: Test + year: 2013 + source: Web + screen_size: 1080p + video_codec: H.264 + audio_codec: Dolby Digital + language: [en, de, it] + release_group: STANDARD + type: movie + +? Ant-Man.and.the.Wasp.2018.Digital.Extras.1080p.AMZN.WEB-DL.DDP5.1.H.264-NTG.mkv +: title: Ant-Man and the Wasp + year: 2018 + other: Extras + screen_size: 1080p + streaming_service: Amazon Prime + source: Web + audio_codec: Dolby Digital Plus + audio_channels: '5.1' + video_codec: H.264 + release_group: NTG + type: movie + +? Ant-Man.and.the.Wasp.2018.1080p.AMZN.WEB-DL.DDP5.1.H.264-NTG.mkv +: title: Ant-Man and the Wasp + year: 2018 + screen_size: 1080p + streaming_service: Amazon Prime + source: Web + audio_codec: Dolby Digital Plus + audio_channels: '5.1' + video_codec: H.264 + release_group: NTG + type: movie + +? Avengers.Infinity.War.2018.3D.Hybrid.REPACK.1080p.BluRay.REMUX.AVC.Atmos-EPSiLON.mk3d +: title: Avengers Infinity War + year: 2018 + other: + - 3D + - Proper + - Remux + proper_count: 1 + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + audio_codec: Dolby Atmos + release_group: EPSiLON + container: mk3d + type: movie + +? Ouija.Seance.The.Final.Game.2018.1080p.WEB-DL.DD5.1.H264-CMRG +: title: Ouija Seance The Final Game + year: 2018 + screen_size: 1080p + source: Web + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: CMRG + type: movie + +? The.Girl.in.the.Spiders.Web.2019.1080p.WEB-DL.x264.AC3-EVO.mkv +: title: The Girl in the Spiders Web + year: 2019 + screen_size: 1080p + source: Web + video_codec: H.264 + audio_codec: Dolby Digital + release_group: EVO + container: mkv + type: movie diff --git a/lib/guessit/test/rules/__init__.py b/lib/guessit/test/rules/__init__.py new file mode 100644 index 00000000..e5be370e --- /dev/null +++ b/lib/guessit/test/rules/__init__.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# pylint: disable=no-self-use, pointless-statement, missing-docstring, invalid-name diff --git a/lib/guessit/test/rules/audio_codec.yml b/lib/guessit/test/rules/audio_codec.yml new file mode 100644 index 00000000..9e381c34 --- /dev/null +++ b/lib/guessit/test/rules/audio_codec.yml @@ -0,0 +1,134 @@ +# Multiple input strings having same expected results can be chained. +# Use $ marker to check inputs that should not match results. + + +? +MP3 +? +lame +? +lame3.12 +? +lame3.100 +: audio_codec: MP3 + +? +MP2 +: audio_codec: MP2 + +? +DolbyDigital +? +DD +? +Dolby Digital +? +AC3 +: audio_codec: Dolby Digital + +? +DDP +? +DD+ +? +EAC3 +: audio_codec: Dolby Digital Plus + +? +DolbyAtmos +? +Dolby Atmos +? +Atmos +? -Atmosphere +: audio_codec: Dolby Atmos + +? +AAC +: audio_codec: AAC + +? +Flac +: audio_codec: FLAC + +? +DTS +: audio_codec: DTS + +? +True-HD +? +trueHD +: audio_codec: Dolby TrueHD + +? +True-HD51 +? +trueHD51 +: audio_codec: Dolby TrueHD + audio_channels: '5.1' + +? +DTSHD +? +DTS HD +? +DTS-HD +: audio_codec: DTS-HD + +? +DTS-HDma +? +DTSMA +: audio_codec: DTS-HD + audio_profile: Master Audio + +? +AC3-hq +: audio_codec: Dolby Digital + audio_profile: High Quality + +? +AAC-HE +: audio_codec: AAC + audio_profile: High Efficiency + +? +AAC-LC +: audio_codec: AAC + audio_profile: Low Complexity + +? +AAC2.0 +? +AAC20 +: audio_codec: AAC + audio_channels: '2.0' + +? +7.1 +? +7ch +? +8ch +: audio_channels: '7.1' + +? +5.1 +? +5ch +? +6ch +: audio_channels: '5.1' + +? +2ch +? +2.0 +? +stereo +: audio_channels: '2.0' + +? +1ch +? +mono +: audio_channels: '1.0' + +? DD5.1 +? DD51 +: audio_codec: Dolby Digital + audio_channels: '5.1' + +? -51 +: audio_channels: '5.1' + +? DTS-HD.HRA +? DTSHD.HRA +? DTS-HD.HR +? DTSHD.HR +? -HRA +? -HR +: audio_codec: DTS-HD + audio_profile: High Resolution Audio + +? DTSES +? DTS-ES +? -ES +: audio_codec: DTS + audio_profile: Extended Surround + +? DD-EX +? DDEX +? -EX +: audio_codec: Dolby Digital + audio_profile: EX + +? OPUS +: audio_codec: Opus + +? Vorbis +: audio_codec: Vorbis + +? PCM +: audio_codec: PCM + +? LPCM +: audio_codec: LPCM diff --git a/lib/guessit/test/rules/bonus.yml b/lib/guessit/test/rules/bonus.yml new file mode 100644 index 00000000..6ef6f5b2 --- /dev/null +++ b/lib/guessit/test/rules/bonus.yml @@ -0,0 +1,9 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? Movie Title-x01-Other Title.mkv +? Movie Title-x01-Other Title +? directory/Movie Title-x01-Other Title/file.mkv +: title: Movie Title + bonus_title: Other Title + bonus: 1 + diff --git a/lib/guessit/test/rules/cds.yml b/lib/guessit/test/rules/cds.yml new file mode 100644 index 00000000..d76186c6 --- /dev/null +++ b/lib/guessit/test/rules/cds.yml @@ -0,0 +1,10 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? cd 1of3 +: cd: 1 + cd_count: 3 + +? Some.Title-DVDRIP-x264-CDP +: cd: !!null + release_group: CDP + video_codec: H.264 diff --git a/lib/guessit/test/rules/common_words.yml b/lib/guessit/test/rules/common_words.yml new file mode 100644 index 00000000..d403a457 --- /dev/null +++ b/lib/guessit/test/rules/common_words.yml @@ -0,0 +1,467 @@ +? is +: title: is + +? it +: title: it + +? am +: title: am + +? mad +: title: mad + +? men +: title: men + +? man +: title: man + +? run +: title: run + +? sin +: title: sin + +? st +: title: st + +? to +: title: to + +? 'no' +: title: 'no' + +? non +: title: non + +? war +: title: war + +? min +: title: min + +? new +: title: new + +? car +: title: car + +? day +: title: day + +? bad +: title: bad + +? bat +: title: bat + +? fan +: title: fan + +? fry +: title: fry + +? cop +: title: cop + +? zen +: title: zen + +? gay +: title: gay + +? fat +: title: fat + +? one +: title: one + +? cherokee +: title: cherokee + +? got +: title: got + +? an +: title: an + +? as +: title: as + +? cat +: title: cat + +? her +: title: her + +? be +: title: be + +? hat +: title: hat + +? sun +: title: sun + +? may +: title: may + +? my +: title: my + +? mr +: title: mr + +? rum +: title: rum + +? pi +: title: pi + +? bb +: title: bb + +? bt +: title: bt + +? tv +: title: tv + +? aw +: title: aw + +? by +: title: by + +? md +: other: Mic Dubbed + +? mp +: title: mp + +? cd +: title: cd + +? in +: title: in + +? ad +: title: ad + +? ice +: title: ice + +? ay +: title: ay + +? at +: title: at + +? star +: title: star + +? so +: title: so + +? he +: title: he + +? do +: title: do + +? ax +: title: ax + +? mx +: title: mx + +? bas +: title: bas + +? de +: title: de + +? le +: title: le + +? son +: title: son + +? ne +: title: ne + +? ca +: title: ca + +? ce +: title: ce + +? et +: title: et + +? que +: title: que + +? mal +: title: mal + +? est +: title: est + +? vol +: title: vol + +? or +: title: or + +? mon +: title: mon + +? se +: title: se + +? je +: title: je + +? tu +: title: tu + +? me +: title: me + +? ma +: title: ma + +? va +: title: va + +? au +: country: AU + +? lu +: title: lu + +? wa +: title: wa + +? ga +: title: ga + +? ao +: title: ao + +? la +: title: la + +? el +: title: el + +? del +: title: del + +? por +: title: por + +? mar +: title: mar + +? al +: title: al + +? un +: title: un + +? ind +: title: ind + +? arw +: title: arw + +? ts +: source: Telesync + +? ii +: title: ii + +? bin +: title: bin + +? chan +: title: chan + +? ss +: title: ss + +? san +: title: san + +? oss +: title: oss + +? iii +: title: iii + +? vi +: title: vi + +? ben +: title: ben + +? da +: title: da + +? lt +: title: lt + +? ch +: title: ch + +? sr +: title: sr + +? ps +: title: ps + +? cx +: title: cx + +? vo +: title: vo + +? mkv +: container: mkv + +? avi +: container: avi + +? dmd +: title: dmd + +? the +: title: the + +? dis +: title: dis + +? cut +: title: cut + +? stv +: title: stv + +? des +: title: des + +? dia +: title: dia + +? and +: title: and + +? cab +: title: cab + +? sub +: title: sub + +? mia +: title: mia + +? rim +: title: rim + +? las +: title: las + +? une +: title: une + +? par +: title: par + +? srt +: container: srt + +? ano +: title: ano + +? toy +: title: toy + +? job +: title: job + +? gag +: title: gag + +? reel +: title: reel + +? www +: title: www + +? for +: title: for + +? ayu +: title: ayu + +? csi +: title: csi + +? ren +: title: ren + +? moi +: title: moi + +? sur +: title: sur + +? fer +: title: fer + +? fun +: title: fun + +? two +: title: two + +? big +: title: big + +? psy +: title: psy + +? air +: title: air + +? brazil +: title: brazil + +? jordan +: title: jordan + +? bs +: title: bs + +? kz +: title: kz + +? gt +: title: gt + +? im +: title: im + +? pt +: language: pt + +? scr +: title: scr + +? sd +: title: sd + +? hr +: other: High Resolution diff --git a/lib/guessit/test/rules/country.yml b/lib/guessit/test/rules/country.yml new file mode 100644 index 00000000..b3d4d8f1 --- /dev/null +++ b/lib/guessit/test/rules/country.yml @@ -0,0 +1,13 @@ +# Multiple input strings having same expected results can be chained. +# Use $ marker to check inputs that should not match results. +? Us.this.is.title +? this.is.title.US +: country: US + title: this is title + +? This.is.Us +: title: This is Us + +? This.Is.Us +: options: --no-default-config + title: This Is Us diff --git a/lib/guessit/test/rules/date.yml b/lib/guessit/test/rules/date.yml new file mode 100644 index 00000000..d7379f03 --- /dev/null +++ b/lib/guessit/test/rules/date.yml @@ -0,0 +1,50 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? +09.03.08 +? +09.03.2008 +? +2008.03.09 +: date: 2008-03-09 + +? +31.01.15 +? +31.01.2015 +? +15.01.31 +? +2015.01.31 +: date: 2015-01-31 + +? +01.02.03 +: date: 2003-02-01 + +? +01.02.03 +: options: --date-year-first + date: 2001-02-03 + +? +01.02.03 +: options: --date-day-first + date: 2003-02-01 + +? 1919 +? 2030 +: !!map {} + +? 2029 +: year: 2029 + +? (1920) +: year: 1920 + +? 2012 +: year: 2012 + +? 2011 2013 (2012) (2015) # first marked year is guessed. +: title: "2011 2013" + year: 2012 + +? 2012 2009 S01E02 2015 # If no year is marked, the second one is guessed. +: title: "2012" + year: 2009 + episode_title: "2015" + +? Something 2 mar 2013) +: title: Something + date: 2013-03-02 + type: episode diff --git a/lib/guessit/test/rules/edition.yml b/lib/guessit/test/rules/edition.yml new file mode 100644 index 00000000..4b7fd986 --- /dev/null +++ b/lib/guessit/test/rules/edition.yml @@ -0,0 +1,63 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? Director's cut +? Edition Director's cut +: edition: Director's Cut + +? Collector +? Collector Edition +? Edition Collector +: edition: Collector + +? Special Edition +? Edition Special +? -Special +: edition: Special + +? Criterion Edition +? Edition Criterion +? CC +? -Criterion +: edition: Criterion + +? Deluxe +? Deluxe Edition +? Edition Deluxe +: edition: Deluxe + +? Super Movie Alternate XViD +? Super Movie Alternative XViD +? Super Movie Alternate Cut XViD +? Super Movie Alternative Cut XViD +: edition: Alternative Cut + +? ddc +: edition: Director's Definitive Cut + +? IMAX +? IMAX Edition +: edition: IMAX + +? ultimate edition +? -ultimate +: edition: Ultimate + +? ultimate collector edition +? ultimate collector's edition +? ultimate collectors edition +? -collectors edition +? -ultimate edition +: edition: [Ultimate, Collector] + +? ultimate collectors edition dc +: edition: [Ultimate, Collector, Director's Cut] + +? fan edit +? fan edition +? fan collection +: edition: Fan + +? ultimate fan edit +? ultimate fan edition +? ultimate fan collection +: edition: [Ultimate, Fan] diff --git a/lib/guessit/test/rules/episodes.yml b/lib/guessit/test/rules/episodes.yml new file mode 100644 index 00000000..44e06a3b --- /dev/null +++ b/lib/guessit/test/rules/episodes.yml @@ -0,0 +1,331 @@ +# Multiple input strings having same expected results can be chained. +# Use $ marker to check inputs that should not match results. +? +2x5 +? +2X5 +? +02x05 +? +2X05 +? +02x5 +? S02E05 +? s02e05 +? s02e5 +? s2e05 +? s02ep05 +? s2EP5 +? -s03e05 +? -s02e06 +? -3x05 +? -2x06 +: season: 2 + episode: 5 + +? "+0102" +? "+102" +: season: 1 + episode: 2 + +? "0102 S03E04" +? "S03E04 102" +: season: 3 + episode: 4 + +? +serie Saison 2 other +? +serie Season 2 other +? +serie Saisons 2 other +? +serie Seasons 2 other +? +serie Season Two other +? +serie Season II other +: season: 2 + +? Some Series.S02E01.Episode.title.mkv +? Some Series/Season 02/E01-Episode title.mkv +? Some Series/Season 02/Some Series-E01-Episode title.mkv +? Some Dummy Directory/Season 02/Some Series-E01-Episode title.mkv +? -Some Dummy Directory/Season 02/E01-Episode title.mkv +? Some Series/Unsafe Season 02/Some Series-E01-Episode title.mkv +? -Some Series/Unsafe Season 02/E01-Episode title.mkv +? Some Series/Season 02/E01-Episode title.mkv +? Some Series/ Season 02/E01-Episode title.mkv +? Some Dummy Directory/Some Series S02/E01-Episode title.mkv +? Some Dummy Directory/S02 Some Series/E01-Episode title.mkv +: title: Some Series + episode_title: Episode title + season: 2 + episode: 1 + +? Some Series.S02E01.mkv +? Some Series/Season 02/E01.mkv +? Some Series/Season 02/Some Series-E01.mkv +? Some Dummy Directory/Season 02/Some Series-E01.mkv +? -Some Dummy Directory/Season 02/E01.mkv +? Some Series/Unsafe Season 02/Some Series-E01.mkv +? -Some Series/Unsafe Season 02/E01.mkv +? Some Series/Season 02/E01.mkv +? Some Series/ Season 02/E01.mkv +? Some Dummy Directory/Some Series S02/E01-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.mkv +: title: Some Series + season: 2 + episode: 1 + +? Some Series S03E01E02 +: title: Some Series + season: 3 + episode: [1, 2] + +? Some Series S01S02S03 +? Some Series S01-02-03 +? Some Series S01 S02 S03 +? Some Series S01 02 03 +: title: Some Series + season: [1, 2, 3] + +? Some Series E01E02E03 +? Some Series E01-02-03 +? Some Series E01-03 +? Some Series E01 E02 E03 +? Some Series E01 02 03 +: title: Some Series + episode: [1, 2, 3] + +? Some Series E01E02E04 +? Some Series E01 E02 E04 +? Some Series E01 02 04 +: title: Some Series + episode: [1, 2, 4] + +? Some Series E01-02-04 +? Some Series E01-04 +? Some Series E01-04 +: title: Some Series + episode: [1, 2, 3, 4] + +? Some Series E01-02-E04 +: title: Some Series + episode: [1, 2, 3, 4] + +? Episode 3 +? -Episode III +: episode: 3 + +? Episode 3 +? Episode III +: options: -t episode + episode: 3 + +? -A very special movie +: episode_details: Special + +? -A very special episode +: options: -t episode + episode_details: Special + +? A very special episode s06 special +: options: -t episode + title: A very special episode + episode_details: Special + +? 12 Monkeys\Season 01\Episode 05\12 Monkeys - S01E05 - The Night Room.mkv +: container: mkv + title: 12 Monkeys + episode: 5 + season: 1 + +? S03E02.X.1080p +: episode: 2 + screen_size: 1080p + season: 3 + +? Something 1 x 2-FlexGet +: options: -t episode + title: Something + season: 1 + episode: 2 + episode_title: FlexGet + +? Show.Name.-.Season.1.to.3.-.Mp4.1080p +? Show.Name.-.Season.1~3.-.Mp4.1080p +? Show.Name.-.Saison.1.a.3.-.Mp4.1080p +: container: mp4 + screen_size: 1080p + season: + - 1 + - 2 + - 3 + title: Show Name + +? Show.Name.Season.1.3&5.HDTV.XviD-GoodGroup[SomeTrash] +? Show.Name.Season.1.3 and 5.HDTV.XviD-GoodGroup[SomeTrash] +: source: HDTV + release_group: GoodGroup[SomeTrash] + season: + - 1 + - 3 + - 5 + title: Show Name + type: episode + video_codec: Xvid + +? Show.Name.Season.1.2.3-5.HDTV.XviD-GoodGroup[SomeTrash] +? Show.Name.Season.1.2.3~5.HDTV.XviD-GoodGroup[SomeTrash] +? Show.Name.Season.1.2.3 to 5.HDTV.XviD-GoodGroup[SomeTrash] +: source: HDTV + release_group: GoodGroup[SomeTrash] + season: + - 1 + - 2 + - 3 + - 4 + - 5 + title: Show Name + type: episode + video_codec: Xvid + +? The.Get.Down.S01EP01.FRENCH.720p.WEBRIP.XVID-STR +: episode: 1 + source: Web + other: Rip + language: fr + release_group: STR + screen_size: 720p + season: 1 + title: The Get Down + type: episode + video_codec: Xvid + +? My.Name.Is.Earl.S01E01-S01E21.SWE-SUB +: episode: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + - 11 + - 12 + - 13 + - 14 + - 15 + - 16 + - 17 + - 18 + - 19 + - 20 + - 21 + season: 1 + subtitle_language: sv + title: My Name Is Earl + type: episode + +? Show.Name.Season.4.Episodes.1-12 +: episode: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + - 11 + - 12 + season: 4 + title: Show Name + type: episode + +? show name s01.to.s04 +: season: + - 1 + - 2 + - 3 + - 4 + title: show name + type: episode + +? epi +: options: -t episode + title: epi + +? Episode20 +? Episode 20 +: episode: 20 + +? Episode50 +? Episode 50 +: episode: 50 + +? Episode51 +? Episode 51 +: episode: 51 + +? Episode70 +? Episode 70 +: episode: 70 + +? Episode71 +? Episode 71 +: episode: 71 + +? S01D02.3-5-GROUP +: disc: [2, 3, 4, 5] + +? S01D02&4-6&8 +: disc: [2, 4, 5, 6, 8] + +? Something.4x05-06 +? Something - 4x05-06 +? Something:4x05-06 +? Something 4x05-06 +? Something-4x05-06 +: title: Something + season: 4 + episode: + - 5 + - 6 + +? Something.4x05-06 +? Something - 4x05-06 +? Something:4x05-06 +? Something 4x05-06 +? Something-4x05-06 +: options: -T something + title: something + season: 4 + episode: + - 5 + - 6 + +? Colony 23/S01E01.Some.title.mkv +: title: Colony 23 + season: 1 + episode: 1 + episode_title: Some title + +? Show.Name.E02.2010.mkv +: options: -t episode + title: Show Name + year: 2010 + episode: 2 + +? Show.Name.E02.S2010.mkv +: options: -t episode + title: Show Name + year: 2010 + season: 2010 + episode: 2 + + +? Show.Name.E02.2010.mkv +: title: Show Name + year: 2010 + episode: 2 + +? Show.Name.E02.S2010.mkv +: title: Show Name + year: 2010 + season: 2010 + episode: 2 diff --git a/lib/guessit/test/rules/film.yml b/lib/guessit/test/rules/film.yml new file mode 100644 index 00000000..1f774331 --- /dev/null +++ b/lib/guessit/test/rules/film.yml @@ -0,0 +1,9 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? Film Title-f01-Series Title.mkv +? Film Title-f01-Series Title +? directory/Film Title-f01-Series Title/file.mkv +: title: Series Title + film_title: Film Title + film: 1 + diff --git a/lib/guessit/test/rules/language.yml b/lib/guessit/test/rules/language.yml new file mode 100644 index 00000000..10e5b9c0 --- /dev/null +++ b/lib/guessit/test/rules/language.yml @@ -0,0 +1,47 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? +English +? .ENG. +: language: English + +? +French +: language: French + +? +SubFrench +? +SubFr +? +STFr +? ST.FR +: subtitle_language: French + +? +ENG.-.sub.FR +? ENG.-.FR Sub +? +ENG.-.SubFR +? +ENG.-.FRSUB +? +ENG.-.FRSUBS +? +ENG.-.FR-SUBS +: language: English + subtitle_language: French + +? "{Fr-Eng}.St{Fr-Eng}" +? "Le.Prestige[x264.{Fr-Eng}.St{Fr-Eng}.Chaps].mkv" +: language: [French, English] + subtitle_language: [French, English] + +? +ENG.-.sub.SWE +? ENG.-.SWE Sub +? +ENG.-.SubSWE +? +ENG.-.SWESUB +? +ENG.-.sub.SV +? ENG.-.SV Sub +? +ENG.-.SubSV +? +ENG.-.SVSUB +: language: English + subtitle_language: Swedish + +? The English Patient (1996) +: title: The English Patient + -language: english + +? French.Kiss.1995.1080p +: title: French Kiss + -language: french diff --git a/lib/guessit/test/rules/other.yml b/lib/guessit/test/rules/other.yml new file mode 100644 index 00000000..447f1787 --- /dev/null +++ b/lib/guessit/test/rules/other.yml @@ -0,0 +1,169 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? +DVDSCR +? +DVDScreener +? +DVD-SCR +? +DVD Screener +? +DVD AnythingElse Screener +? -DVD AnythingElse SCR +: other: Screener + +? +AudioFix +? +AudioFixed +? +Audio Fix +? +Audio Fixed +: other: Audio Fixed + +? +SyncFix +? +SyncFixed +? +Sync Fix +? +Sync Fixed +: other: Sync Fixed + +? +DualAudio +? +Dual Audio +: other: Dual Audio + +? +ws +? +WideScreen +? +Wide Screen +: other: Widescreen + +# Fix must be surround by others properties to be matched. +? DVD.fix.XViD +? -DVD.Fix +? -Fix.XViD +: other: Fix + -proper_count: 1 + +? -DVD.BlablaBla.Fix.Blablabla.XVID +? -DVD.BlablaBla.Fix.XVID +? -DVD.Fix.Blablabla.XVID +: other: Fix + -proper_count: 1 + + +? DVD.Real.PROPER.REPACK +: other: Proper + proper_count: 3 + + +? Proper.720p +? +Repack +? +Rerip +: other: Proper + proper_count: 1 + +? XViD.Fansub +: other: Fan Subtitled + +? XViD.Fastsub +: other: Fast Subtitled + +? +Season Complete +? -Complete +: other: Complete + +? R5 +: other: Region 5 + +? RC +: other: Region C + +? PreAir +? Pre Air +: other: Preair + +? Screener +: other: Screener + +? Remux +: other: Remux + +? 3D.2019 +: other: 3D + +? HD +: other: HD + +? FHD +? FullHD +? Full HD +: other: Full HD + +? UHD +? Ultra +? UltraHD +? Ultra HD +: other: Ultra HD + +? mHD # ?? +? HDLight +: other: Micro HD + +? HQ +: other: High Quality + +? hr +: other: High Resolution + +? PAL +: other: PAL + +? SECAM +: other: SECAM + +? NTSC +: other: NTSC + +? LDTV +: other: Low Definition + +? LD +: other: Line Dubbed + +? MD +: other: Mic Dubbed + +? -The complete movie +: other: Complete + +? +The complete movie +: title: The complete movie + +? +AC3-HQ +: audio_profile: High Quality + +? Other-HQ +: other: High Quality + +? reenc +? re-enc +? re-encoded +? reencoded +: other: Reencoded + +? CONVERT XViD +: other: Converted + +? +HDRIP # it's a Rip from non specified HD source +: other: [HD, Rip] + +? SDR +: other: Standard Dynamic Range + +? HDR +? HDR10 +? -HDR100 +: other: HDR10 + +? BT2020 +? BT.2020 +? -BT.20200 +? -BT.2021 +: other: BT.2020 + +? Upscaled +? Upscale +: other: Upscaled + diff --git a/lib/guessit/test/rules/part.yml b/lib/guessit/test/rules/part.yml new file mode 100644 index 00000000..72f3d98a --- /dev/null +++ b/lib/guessit/test/rules/part.yml @@ -0,0 +1,18 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? Filename Part 3.mkv +? Filename Part III.mkv +? Filename Part Three.mkv +? Filename Part Trois.mkv +: title: Filename + part: 3 + +? Part 3 +? Part III +? Part Three +? Part Trois +? Part3 +: part: 3 + +? -Something.Apt.1 +: part: 1 \ No newline at end of file diff --git a/lib/guessit/test/rules/processors.yml b/lib/guessit/test/rules/processors.yml new file mode 100644 index 00000000..ee906b2c --- /dev/null +++ b/lib/guessit/test/rules/processors.yml @@ -0,0 +1,8 @@ +# Multiple input strings having same expected results can be chained. +# Use $ marker to check inputs that should not match results. + +# Prefer information for last path. +? Some movie (2000)/Some movie (2001).mkv +? Some movie (2001)/Some movie.mkv +: year: 2001 + container: mkv diff --git a/lib/guessit/test/rules/processors_test.py b/lib/guessit/test/rules/processors_test.py new file mode 100644 index 00000000..c22e968c --- /dev/null +++ b/lib/guessit/test/rules/processors_test.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# pylint: disable=no-self-use, pointless-statement, missing-docstring, invalid-name, pointless-string-statement + +from rebulk.match import Matches, Match + +from ...rules.processors import StripSeparators + + +def test_strip_separators(): + strip_separators = StripSeparators() + + matches = Matches() + + m = Match(3, 11, input_string="pre.ABCDEF.post") + + assert m.raw == '.ABCDEF.' + matches.append(m) + + returned_matches = strip_separators.when(matches, None) + assert returned_matches == matches + + strip_separators.then(matches, returned_matches, None) + + assert m.raw == 'ABCDEF' + + +def test_strip_separators_keep_acronyms(): + strip_separators = StripSeparators() + + matches = Matches() + + m = Match(0, 13, input_string=".S.H.I.E.L.D.") + m2 = Match(0, 22, input_string=".Agent.Of.S.H.I.E.L.D.") + + assert m.raw == '.S.H.I.E.L.D.' + matches.append(m) + matches.append(m2) + + returned_matches = strip_separators.when(matches, None) + assert returned_matches == matches + + strip_separators.then(matches, returned_matches, None) + + assert m.raw == '.S.H.I.E.L.D.' + assert m2.raw == 'Agent.Of.S.H.I.E.L.D.' diff --git a/lib/guessit/test/rules/release_group.yml b/lib/guessit/test/rules/release_group.yml new file mode 100644 index 00000000..c96383e9 --- /dev/null +++ b/lib/guessit/test/rules/release_group.yml @@ -0,0 +1,71 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? Some.Title.XViD-ReleaseGroup +? Some.Title.XViD-ReleaseGroup.mkv +: release_group: ReleaseGroup + +? Some.Title.XViD-by.Artik[SEDG].avi +: release_group: Artik[SEDG] + +? "[ABC] Some.Title.avi" +? some/folder/[ABC]Some.Title.avi +: release_group: ABC + +? "[ABC] Some.Title.XViD-GRP.avi" +? some/folder/[ABC]Some.Title.XViD-GRP.avi +: release_group: GRP + +? "[ABC] Some.Title.S01E02.avi" +? some/folder/[ABC]Some.Title.S01E02.avi +: release_group: ABC + +? Some.Title.XViD-S2E02.NoReleaseGroup.avi +: release_group: !!null + +? Test.S01E01-FooBar-Group +: options: -G group -G xxxx + episode: 1 + episode_title: FooBar + release_group: Group + season: 1 + title: Test + type: episode + +? Test.S01E01-FooBar-Group +: options: -G re:gr.?up -G xxxx + episode: 1 + episode_title: FooBar + release_group: Group + season: 1 + title: Test + type: episode + +? Show.Name.x264-byEMP +: title: Show Name + video_codec: H.264 + release_group: byEMP + +? Show.Name.x264-NovaRip +: title: Show Name + video_codec: H.264 + release_group: NovaRip + +? Show.Name.x264-PARTiCLE +: title: Show Name + video_codec: H.264 + release_group: PARTiCLE + +? Show.Name.x264-POURMOi +: title: Show Name + video_codec: H.264 + release_group: POURMOi + +? Show.Name.x264-RipPourBox +: title: Show Name + video_codec: H.264 + release_group: RipPourBox + +? Show.Name.x264-RiPRG +: title: Show Name + video_codec: H.264 + release_group: RiPRG diff --git a/lib/guessit/test/rules/screen_size.yml b/lib/guessit/test/rules/screen_size.yml new file mode 100644 index 00000000..25d8374f --- /dev/null +++ b/lib/guessit/test/rules/screen_size.yml @@ -0,0 +1,280 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? +360p +? +360px +? -360 +? +500x360 +? -250x360 +: screen_size: 360p + +? +640x360 +? -640x360i +? -684x360i +: screen_size: 360p + aspect_ratio: 1.778 + +? +360i +: screen_size: 360i + +? +480x360i +? -480x360p +? -450x360 +: screen_size: 360i + aspect_ratio: 1.333 + +? +368p +? +368px +? -368i +? -368 +? +500x368 +: screen_size: 368p + +? -490x368 +? -700x368 +: screen_size: 368p + +? +492x368p +: screen_size: + aspect_ratio: 1.337 + +? +654x368 +: screen_size: 368p + aspect_ratio: 1.777 + +? +698x368 +: screen_size: 368p + aspect_ratio: 1.897 + +? +368i +: -screen_size: 368i + +? +480p +? +480px +? -480i +? -480 +? -500x480 +? -638x480 +? -920x480 +: screen_size: 480p + +? +640x480 +: screen_size: 480p + aspect_ratio: 1.333 + +? +852x480 +: screen_size: 480p + aspect_ratio: 1.775 + +? +910x480 +: screen_size: 480p + aspect_ratio: 1.896 + +? +500x480 +? +500 x 480 +? +500 * 480 +? +500x480p +? +500X480i +: screen_size: 500x480 + aspect_ratio: 1.042 + +? +480i +? +852x480i +: screen_size: 480i + +? +576p +? +576px +? -576i +? -576 +? -500x576 +? -766x576 +? -1094x576 +: screen_size: 576p + +? +768x576 +: screen_size: 576p + aspect_ratio: 1.333 + +? +1024x576 +: screen_size: 576p + aspect_ratio: 1.778 + +? +1092x576 +: screen_size: 576p + aspect_ratio: 1.896 + +? +500x576 +: screen_size: 500x576 + aspect_ratio: 0.868 + +? +576i +: screen_size: 576i + +? +720p +? +720px +? -720i +? 720hd +? 720pHD +? -720 +? -500x720 +? -950x720 +? -1368x720 +: screen_size: 720p + +? +960x720 +: screen_size: 720p + aspect_ratio: 1.333 + +? +1280x720 +: screen_size: 720p + aspect_ratio: 1.778 + +? +1366x720 +: screen_size: 720p + aspect_ratio: 1.897 + +? +500x720 +: screen_size: 500x720 + aspect_ratio: 0.694 + +? +900p +? +900px +? -900i +? -900 +? -500x900 +? -1198x900 +? -1710x900 +: screen_size: 900p + +? +1200x900 +: screen_size: 900p + aspect_ratio: 1.333 + +? +1600x900 +: screen_size: 900p + aspect_ratio: 1.778 + +? +1708x900 +: screen_size: 900p + aspect_ratio: 1.898 + +? +500x900 +? +500x900p +? +500x900i +: screen_size: 500x900 + aspect_ratio: 0.556 + +? +900i +: screen_size: 900i + +? +1080p +? +1080px +? +1080hd +? +1080pHD +? -1080i +? -1080 +? -500x1080 +? -1438x1080 +? -2050x1080 +: screen_size: 1080p + +? +1440x1080 +: screen_size: 1080p + aspect_ratio: 1.333 + +? +1920x1080 +: screen_size: 1080p + aspect_ratio: 1.778 + +? +2048x1080 +: screen_size: 1080p + aspect_ratio: 1.896 + +? +1080i +? -1080p +: screen_size: 1080i + +? 1440p +: screen_size: 1440p + +? +500x1080 +: screen_size: 500x1080 + aspect_ratio: 0.463 + +? +2160p +? +2160px +? -2160i +? -2160 +? +4096x2160 +? +4k +? -2878x2160 +? -4100x2160 +: screen_size: 2160p + +? +2880x2160 +: screen_size: 2160p + aspect_ratio: 1.333 + +? +3840x2160 +: screen_size: 2160p + aspect_ratio: 1.778 + +? +4098x2160 +: screen_size: 2160p + aspect_ratio: 1.897 + +? +500x2160 +: screen_size: 500x2160 + aspect_ratio: 0.231 + +? +4320p +? +4320px +? -4320i +? -4320 +? -5758x2160 +? -8198x2160 +: screen_size: 4320p + +? +5760x4320 +: screen_size: 4320p + aspect_ratio: 1.333 + +? +7680x4320 +: screen_size: 4320p + aspect_ratio: 1.778 + +? +8196x4320 +: screen_size: 4320p + aspect_ratio: 1.897 + +? +500x4320 +: screen_size: 500x4320 + aspect_ratio: 0.116 + +? Test.File.720hd.bluray +? Test.File.720p24 +? Test.File.720p30 +? Test.File.720p50 +? Test.File.720p60 +? Test.File.720p120 +: screen_size: 720p + +? Test.File.400p +: options: + advanced_config: + screen_size: + progressive: ["400"] + screen_size: 400p + +? Test.File2.400p +: options: + advanced_config: + screen_size: + progressive: ["400"] + screen_size: 400p + +? Test.File.720p +: options: + advanced_config: + screen_size: + progressive: ["400"] + screen_size: 720p diff --git a/lib/guessit/test/rules/size.yml b/lib/guessit/test/rules/size.yml new file mode 100644 index 00000000..18b3cd49 --- /dev/null +++ b/lib/guessit/test/rules/size.yml @@ -0,0 +1,8 @@ +? 1.1tb +: size: 1.1TB + +? 123mb +: size: 123MB + +? 4.3gb +: size: 4.3GB diff --git a/lib/guessit/test/rules/source.yml b/lib/guessit/test/rules/source.yml new file mode 100644 index 00000000..cda8f1ac --- /dev/null +++ b/lib/guessit/test/rules/source.yml @@ -0,0 +1,323 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? +VHS +? -VHSAnythingElse +? -SomeVHS stuff +? -VH +? -VHx +: source: VHS + -other: Rip + +? +VHSRip +? +VHS-Rip +? +VhS_rip +? +VHS.RIP +? -VHS +? -VHxRip +: source: VHS + other: Rip + +? +Cam +: source: Camera + -other: Rip + +? +CamRip +? +CaM Rip +? +Cam_Rip +? +cam.rip +? -Cam +: source: Camera + other: Rip + +? +HDCam +? +HD-Cam +: source: HD Camera + -other: Rip + +? +HDCamRip +? +HD-Cam.rip +? -HDCam +? -HD-Cam +: source: HD Camera + other: Rip + +? +Telesync +? +TS +: source: Telesync + -other: Rip + +? +TelesyncRip +? +TSRip +? -Telesync +? -TS +: source: Telesync + other: Rip + +? +HD TS +? -Hd.Ts # ts file extension +? -HD.TS # ts file extension +? +Hd-Ts +: source: HD Telesync + -other: Rip + +? +HD TS Rip +? +Hd-Ts-Rip +? -HD TS +? -Hd-Ts +: source: HD Telesync + other: Rip + +? +Workprint +? +workPrint +? +WorkPrint +? +WP +? -Work Print +: source: Workprint + -other: Rip + +? +Telecine +? +teleCine +? +TC +? -Tele Cine +: source: Telecine + -other: Rip + +? +Telecine Rip +? +teleCine-Rip +? +TC-Rip +? -Telecine +? -TC +: source: Telecine + other: Rip + +? +HD-TELECINE +? +HDTC +: source: HD Telecine + -other: Rip + +? +HD-TCRip +? +HD TELECINE RIP +? -HD-TELECINE +? -HDTC +: source: HD Telecine + other: Rip + +? +PPV +: source: Pay-per-view + -other: Rip + +? +ppv-rip +? -PPV +: source: Pay-per-view + other: Rip + +? -TV +? +SDTV +? +TV-Dub +: source: TV + -other: Rip + +? +SDTVRIP +? +Rip sd tv +? +TvRip +? +Rip TV +? -TV +? -SDTV +: source: TV + other: Rip + +? +DVB +? +pdTV +? +Pd Tv +: source: Digital TV + -other: Rip + +? +DVB-Rip +? +DvBRiP +? +pdtvRiP +? +pd tv RiP +? -DVB +? -pdTV +? -Pd Tv +: source: Digital TV + other: Rip + +? +DVD +? +video ts +? +DVDR +? +DVD 9 +? +dvd 5 +? -dvd ts +: source: DVD + -source: Telesync + -other: Rip + +? +DVD-RIP +? -video ts +? -DVD +? -DVDR +? -DVD 9 +? -dvd 5 +: source: DVD + other: Rip + +? +HDTV +: source: HDTV + -other: Rip + +? +tv rip hd +? +HDtv Rip +? -HdRip # it's a Rip from non specified HD source +? -HDTV +: source: HDTV + other: Rip + +? +VOD +: source: Video on Demand + -other: Rip + +? +VodRip +? +vod rip +? -VOD +: source: Video on Demand + other: Rip + +? +webrip +? +Web Rip +? +webdlrip +? +web dl rip +? +webcap +? +web cap +? +webcaprip +? +web cap rip +: source: Web + other: Rip + +? +webdl +? +Web DL +? +webHD +? +WEB hd +? +web +: source: Web + -other: Rip + +? +HDDVD +? +hd dvd +: source: HD-DVD + -other: Rip + +? +hdDvdRip +? -HDDVD +? -hd dvd +: source: HD-DVD + other: Rip + +? +BluRay +? +BD +? +BD5 +? +BD9 +? +BD25 +? +bd50 +: source: Blu-ray + -other: Rip + +? +BR-Scr +? +BR.Screener +: source: Blu-ray + other: [Reencoded, Screener] + -language: pt-BR + +? +BR-Rip +? +BRRip +: source: Blu-ray + other: [Reencoded, Rip] + -language: pt-BR + +? +BluRay rip +? +BDRip +? -BluRay +? -BD +? -BR +? -BR rip +? -BD5 +? -BD9 +? -BD25 +? -bd50 +: source: Blu-ray + other: Rip + +? XVID.NTSC.DVDR.nfo +: source: DVD + -other: Rip + +? +AHDTV +: source: Analog HDTV + -other: Rip + +? +dsr +? +dth +: source: Satellite + -other: Rip + +? +dsrip +? +ds rip +? +dsrrip +? +dsr rip +? +satrip +? +sat rip +? +dthrip +? +dth rip +? -dsr +? -dth +: source: Satellite + other: Rip + +? +UHDTV +: source: Ultra HDTV + -other: Rip + +? +UHDRip +? +UHDTV Rip +? -UHDTV +: source: Ultra HDTV + other: Rip + +? UHD Bluray +? UHD 2160p Bluray +? UHD 8bit Bluray +? UHD HQ 8bit Bluray +? Ultra Bluray +? Ultra HD Bluray +? Bluray ULTRA +? Bluray Ultra HD +? Bluray UHD +? 4K Bluray +? 2160p Bluray +? UHD 10bit HDR Bluray +? UHD HDR10 Bluray +? -HD Bluray +? -AMERICAN ULTRA (2015) 1080p Bluray +? -American.Ultra.2015.BRRip +? -BRRip XviD AC3-ULTRAS +? -UHD Proper Bluray +: source: Ultra HD Blu-ray + +? UHD.BRRip +? UHD.2160p.BRRip +? BRRip.2160p.UHD +? BRRip.[4K-2160p-UHD] +: source: Ultra HD Blu-ray + other: [Reencoded, Rip] + +? UHD.2160p.BDRip +? BDRip.[4K-2160p-UHD] +: source: Ultra HD Blu-ray + other: Rip + +? DM +: source: Digital Master + +? DMRIP +? DM-RIP +: source: Digital Master + other: Rip diff --git a/lib/guessit/test/rules/title.yml b/lib/guessit/test/rules/title.yml new file mode 100644 index 00000000..05c7f208 --- /dev/null +++ b/lib/guessit/test/rules/title.yml @@ -0,0 +1,43 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? Title Only +? -Title XViD 720p Only +? sub/folder/Title Only +? -sub/folder/Title XViD 720p Only +? Title Only.mkv +? Title Only.avi +: title: Title Only + +? Title Only/title_only.mkv +: title: Title Only + +? title_only.mkv +: title: title only + +? Some Title/some.title.mkv +? some.title/Some.Title.mkv +: title: Some Title + +? SOME TITLE/Some.title.mkv +? Some.title/SOME TITLE.mkv +: title: Some title + +? some title/Some.title.mkv +? Some.title/some title.mkv +: title: Some title + +? Some other title/Some.Other.title.mkv +? Some.Other title/Some other title.mkv +: title: Some Other title + +? This T.I.T.L.E. has dots +? This.T.I.T.L.E..has.dots +: title: This T.I.T.L.E has dots + +? This.T.I.T.L.E..has.dots.S01E02.This E.P.T.I.T.L.E.has.dots +: title: This T.I.T.L.E has dots + season: 1 + episode: 2 + episode_title: This E.P.T.I.T.L.E has dots + type: episode + diff --git a/lib/guessit/test/rules/video_codec.yml b/lib/guessit/test/rules/video_codec.yml new file mode 100644 index 00000000..ae43bc43 --- /dev/null +++ b/lib/guessit/test/rules/video_codec.yml @@ -0,0 +1,98 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? rv10 +? rv13 +? RV20 +? Rv30 +? rv40 +? -xrv40 +: video_codec: RealVideo + +? mpeg2 +? MPEG2 +? MPEG-2 +? mpg2 +? H262 +? H.262 +? x262 +? -mpeg +? -xmpeg2 +? -mpeg2x +: video_codec: MPEG-2 + +? DivX +? -div X +? divx +? dvdivx +? DVDivX +: video_codec: DivX + +? XviD +? xvid +? -x vid +: video_codec: Xvid + +? h263 +? x263 +? h.263 +: video_codec: H.263 + +? h264 +? x264 +? h.264 +? x.264 +? AVC +? AVCHD +? -MPEG-4 +? -mpeg4 +? -mpeg +? -h 265 +? -x265 +: video_codec: H.264 + +? h265 +? x265 +? h.265 +? x.265 +? hevc +? -h 264 +? -x264 +: video_codec: H.265 + +? hevc10 +? HEVC-YUV420P10 +: video_codec: H.265 + color_depth: 10-bit + +? h265-HP +: video_codec: H.265 + video_profile: High + +? H.264-SC +: video_codec: H.264 + video_profile: Scalable Video Coding + +? mpeg4-AVC +: video_codec: H.264 + video_profile: Advanced Video Codec High Definition + +? AVCHD-SC +? H.264-AVCHD-SC +: video_codec: H.264 + video_profile: + - Scalable Video Coding + - Advanced Video Codec High Definition + +? VC1 +? VC-1 +: video_codec: VC-1 + +? VP7 +: video_codec: VP7 + +? VP8 +? VP80 +: video_codec: VP8 + +? VP9 +: video_codec: VP9 diff --git a/lib/guessit/test/rules/website.yml b/lib/guessit/test/rules/website.yml new file mode 100644 index 00000000..11d434d2 --- /dev/null +++ b/lib/guessit/test/rules/website.yml @@ -0,0 +1,23 @@ +# Multiple input strings having same expected results can be chained. +# Use - marker to check inputs that should not match results. +? +tvu.org.ru +? -tvu.unsafe.ru +: website: tvu.org.ru + +? +www.nimp.na +? -somewww.nimp.na +? -www.nimp.nawouak +? -nimp.na +: website: www.nimp.na + +? +wawa.co.uk +? -wawa.uk +: website: wawa.co.uk + +? -Dark.Net.S01E06.720p.HDTV.x264-BATV + -Dark.Net.2015.720p.HDTV.x264-BATV +: website: Dark.Net + +? Dark.Net.S01E06.720p.HDTV.x264-BATV + Dark.Net.2015.720p.HDTV.x264-BATV +: title: Dark Net diff --git a/lib/guessit/test/streaming_services.yaml b/lib/guessit/test/streaming_services.yaml new file mode 100644 index 00000000..adf52e71 --- /dev/null +++ b/lib/guessit/test/streaming_services.yaml @@ -0,0 +1,1934 @@ +? House.of.Cards.2013.S02E03.1080p.NF.WEBRip.DD5.1.x264-NTb.mkv +? House.of.Cards.2013.S02E03.1080p.Netflix.WEBRip.DD5.1.x264-NTb.mkv +: title: House of Cards + year: 2013 + season: 2 + episode: 3 + screen_size: 1080p + streaming_service: Netflix + source: Web + other: Rip + audio_channels: "5.1" + audio_codec: Dolby Digital + video_codec: H.264 + release_group: NTb + +? The.Daily.Show.2015.07.01.Kirsten.Gillibrand.Extended.720p.CC.WEBRip.AAC2.0.x264-BTW.mkv +? The.Daily.Show.2015.07.01.Kirsten.Gillibrand.Extended.720p.ComedyCentral.WEBRip.AAC2.0.x264-BTW.mkv +? The.Daily.Show.2015.07.01.Kirsten.Gillibrand.Extended.720p.Comedy.Central.WEBRip.AAC2.0.x264-BTW.mkv +: audio_channels: '2.0' + audio_codec: AAC + date: 2015-07-01 + edition: Extended + source: Web + other: Rip + release_group: BTW + screen_size: 720p + streaming_service: Comedy Central + title: The Daily Show + episode_title: Kirsten Gillibrand + video_codec: H.264 + +? The.Daily.Show.2015.07.01.Kirsten.Gillibrand.Extended.Interview.720p.CC.WEBRip.AAC2.0.x264-BTW.mkv +: audio_channels: '2.0' + audio_codec: AAC + date: 2015-07-01 + source: Web + release_group: BTW + screen_size: 720p + streaming_service: Comedy Central + title: The Daily Show + episode_title: Kirsten Gillibrand Extended Interview + video_codec: H.264 + +? The.Daily.Show.2015.07.02.Sarah.Vowell.CC.WEBRip.AAC2.0.x264-BTW.mkv +: audio_channels: '2.0' + audio_codec: AAC + date: 2015-07-02 + source: Web + release_group: BTW + streaming_service: Comedy Central + title: The Daily Show + episode_title: Sarah Vowell + video_codec: H.264 + +# Streaming service: Amazon +? Show.Name.S07E04.Service.1080p.AMZN.WEBRip.DD+5.1.x264 +? Show.Name.S07E04.Service.1080p.AmazonPrime.WEBRip.DD+5.1.x264 +: title: Show Name + season: 7 + episode: 4 + episode_title: Service + screen_size: 1080p + streaming_service: Amazon Prime + source: Web + other: Rip + audio_codec: Dolby Digital Plus + audio_channels: '5.1' + video_codec: H.264 + type: episode + +# Streaming service: Comedy Central +? Show.Name.2016.09.28.Nice.Title.Extended.1080p.CC.WEBRip.AAC2.0.x264-monkee +: title: Show Name + date: 2016-09-28 + episode_title: Nice Title + edition: Extended + other: Rip + screen_size: 1080p + streaming_service: Comedy Central + source: Web + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: The CW +? Show.Name.US.S12E20.Nice.Title.720p.CW.WEBRip.AAC2.0.x264-monkee +? Show.Name.US.S12E20.Nice.Title.720p.TheCW.WEBRip.AAC2.0.x264-monkee +: title: Show Name + country: US + season: 12 + episode: 20 + episode_title: Nice Title + screen_size: 720p + streaming_service: The CW + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: AMBC +? Show.Name.2016.09.27.Nice.Title.720p.AMBC.WEBRip.AAC2.0.x264-monkee +: title: Show Name + date: 2016-09-27 + episode_title: Nice Title + screen_size: 720p + streaming_service: ABC + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: HIST +? Show.Name.720p.HIST.WEBRip.AAC2.0.H.264-monkee +? Show.Name.720p.History.WEBRip.AAC2.0.H.264-monkee +: options: -t episode + title: Show Name + screen_size: 720p + streaming_service: History + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: PBS +? Show.Name.2015.Nice.Title.1080p.PBS.WEBRip.AAC2.0.H264-monkee +: options: -t episode + title: Show Name + year: 2015 + episode_title: Nice Title + screen_size: 1080p + streaming_service: PBS + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: SeeSo +? Show.Name.2016.Nice.Title.1080p.SESO.WEBRip.AAC2.0.x264-monkee +: options: -t episode + title: Show Name + year: 2016 + episode_title: Nice Title + screen_size: 1080p + streaming_service: SeeSo + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: Discovery +? Show.Name.S01E03.Nice.Title.720p.DISC.WEBRip.AAC2.0.x264-NTb +? Show.Name.S01E03.Nice.Title.720p.Discovery.WEBRip.AAC2.0.x264-NTb +: title: Show Name + season: 1 + episode: 3 + episode_title: Nice Title + screen_size: 720p + streaming_service: Discovery + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: NTb + type: episode + +# Streaming service: BBC iPlayer +? Show.Name.2016.08.18.Nice.Title.720p.iP.WEBRip.AAC2.0.H.264-monkee +? Show.Name.2016.08.18.Nice.Title.720p.BBCiPlayer.WEBRip.AAC2.0.H.264-monkee +: title: Show Name + date: 2016-08-18 + episode_title: Nice Title + streaming_service: BBC iPlayer + screen_size: 720p + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: A&E +? Show.Name.S15E18.Nice.Title.720p.AE.WEBRip.AAC2.0.H.264-monkee +? Show.Name.S15E18.Nice.Title.720p.A&E.WEBRip.AAC2.0.H.264-monkee +: title: Show Name + season: 15 + episode: 18 + episode_title: Nice Title + screen_size: 720p + streaming_service: A&E + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: Adult Swim +? Show.Name.S04E01.Nice.Title.1080p.AS.WEBRip.AAC2.0.H.264-monkee +? Show.Name.S04E01.Nice.Title.1080p.AdultSwim.WEBRip.AAC2.0.H.264-monkee +: title: Show Name + season: 4 + episode: 1 + episode_title: Nice Title + screen_size: 1080p + streaming_service: Adult Swim + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: Netflix +? Show.Name.2013.S02E03.1080p.NF.WEBRip.DD5.1.x264-NTb.mkv +: title: Show Name + year: 2013 + season: 2 + episode: 3 + screen_size: 1080p + streaming_service: Netflix + source: Web + other: Rip + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: NTb + container: mkv + type: episode + +# Streaming service: CBS +? Show.Name.2016.05.10.Nice.Title.720p.CBS.WEBRip.AAC2.0.x264-monkee +: title: Show Name + date: 2016-05-10 + episode_title: Nice Title + screen_size: 720p + streaming_service: CBS + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: NBA TV +? NBA.2016.02.27.Team.A.vs.Team.B.720p.NBA.WEBRip.AAC2.0.H.264-monkee +? NBA.2016.02.27.Team.A.vs.Team.B.720p.NBATV.WEBRip.AAC2.0.H.264-monkee +: title: NBA + date: 2016-02-27 + episode_title: Team A vs Team B + screen_size: 720p + streaming_service: NBA TV + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: ePix +? Show.Name.S05E04.Nice.Title.Part4.720p.EPIX.WEBRip.AAC2.0.H.264-monkee +? Show.Name.S05E04.Nice.Title.Part4.720p.ePix.WEBRip.AAC2.0.H.264-monkee +: title: Show Name + season: 5 + episode: 4 + episode_title: Nice Title + part: 4 + screen_size: 720p + streaming_service: ePix + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: NBC +? Show.Name.S41E03.Nice.Title.720p.NBC.WEBRip.AAC2.0.x264-monkee +: title: Show Name + season: 41 + episode: 3 + episode_title: Nice Title + screen_size: 720p + streaming_service: NBC + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: Syfy +? Show.Name.S01E02.Nice.Title.720p.SYFY.WEBRip.AAC2.0.x264-group +? Show.Name.S01E02.Nice.Title.720p.Syfy.WEBRip.AAC2.0.x264-group +: title: Show Name + season: 1 + episode: 2 + episode_title: Nice Title + screen_size: 720p + streaming_service: Syfy + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: group + type: episode + +# Streaming service: Spike TV +? Show.Name.S01E02.Nice.Title.720p.SPKE.WEBRip.AAC2.0.x264-group +? Show.Name.S01E02.Nice.Title.720p.Spike TV.WEBRip.AAC2.0.x264-group +? Show.Name.S01E02.Nice.Title.720p.SpikeTV.WEBRip.AAC2.0.x264-group +: title: Show Name + season: 1 + episode: 2 + episode_title: Nice Title + screen_size: 720p + streaming_service: Spike TV + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: group + type: episode + +# Streaming service: IFC +? Show.Name.S01E02.Nice.Title.720p.IFC.WEBRip.AAC2.0.x264-group +: title: Show Name + season: 1 + episode: 2 + episode_title: Nice Title + screen_size: 720p + streaming_service: IFC + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: group + type: episode + +# Streaming service: NATG +? Show.Name.S01E02.Nice.Title.720p.NATG.WEBRip.AAC2.0.x264-group +? Show.Name.S01E02.Nice.Title.720p.NationalGeographic.WEBRip.AAC2.0.x264-group +: title: Show Name + season: 1 + episode: 2 + episode_title: Nice Title + screen_size: 720p + streaming_service: National Geographic + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: group + type: episode + +# Streaming service: NFL +? Show.Name.S01E02.Nice.Title.720p.NFL.WEBRip.AAC2.0.x264-group +: title: Show Name + season: 1 + episode: 2 + episode_title: Nice Title + screen_size: 720p + streaming_service: NFL + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: group + type: episode + +# Streaming service: UFC +? Show.Name.S01E02.Nice.Title.720p.UFC.WEBRip.AAC2.0.x264-group +: title: Show Name + season: 1 + episode: 2 + episode_title: Nice Title + screen_size: 720p + streaming_service: UFC + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: group + type: episode + +# Streaming service: TV Land +? Show.Name.S01E02.Nice.Title.720p.TVL.WEBRip.AAC2.0.x264-group +? Show.Name.S01E02.Nice.Title.720p.TVLand.WEBRip.AAC2.0.x264-group +? Show.Name.S01E02.Nice.Title.720p.TV Land.WEBRip.AAC2.0.x264-group +: title: Show Name + season: 1 + episode: 2 + episode_title: Nice Title + screen_size: 720p + streaming_service: TV Land + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: group + type: episode + +# Streaming service: Crunchy Roll +? Show.Name.S01.1080p.CR.WEBRip.AAC.2.0.x264-monkee +: title: Show Name + season: 1 + screen_size: 1080p + streaming_service: Crunchy Roll + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: Disney +? Show.Name.S01.1080p.DSNY.WEBRip.AAC.2.0.x264-monkee +? Show.Name.S01.1080p.Disney.WEBRip.AAC.2.0.x264-monkee +: title: Show Name + season: 1 + screen_size: 1080p + streaming_service: Disney + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: Nickelodeon +? Show.Name.S01.1080p.NICK.WEBRip.AAC.2.0.x264-monkee +? Show.Name.S01.1080p.Nickelodeon.WEBRip.AAC.2.0.x264-monkee +: title: Show Name + season: 1 + screen_size: 1080p + streaming_service: Nickelodeon + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: TFou +? Show.Name.S01.1080p.TFOU.WEBRip.AAC.2.0.x264-monkee +? Show.Name.S01.1080p.TFou.WEBRip.AAC.2.0.x264-monkee +: title: Show Name + season: 1 + screen_size: 1080p + streaming_service: TFou + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: monkee + type: episode + +# Streaming service: DIY Network +? Show.Name.S01.720p.DIY.WEBRip.AAC2.0.H.264-BTN +: title: Show Name + season: 1 + screen_size: 720p + streaming_service: DIY Network + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: BTN + type: episode + +# Streaming service: USA Network +? Show.Name.S01E02.Exfil.1080p.USAN.WEBRip.AAC2.0.x264-AJP69 +: title: Show Name + season: 1 + episode: 2 + screen_size: 1080p + streaming_service: USA Network + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: AJP69 + type: episode + +# Streaming service: TV3 Ireland +? Show.Name.S01E08.576p.TV3.WEBRip.AAC2.0.x264-HARiKEN +: title: Show Name + season: 1 + episode: 8 + screen_size: 576p + streaming_service: TV3 Ireland + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: HARiKEN + type: episode + +# Streaming service: TV4 Sweeden +? Show.Name.S05.720p.TV4.WEBRip.AAC2.0.H.264-BTW +: title: Show Name + season: 5 + screen_size: 720p + streaming_service: TV4 Sweeden + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: BTW + type: episode + +# Streaming service: TLC +? Show.Name.S02.720p.TLC.WEBRip.AAC2.0.x264-BTW +: title: Show Name + season: 2 + screen_size: 720p + streaming_service: TLC + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: BTW + type: episode + +# Streaming service: Investigation Discovery +? Show.Name.S01E01.720p.ID.WEBRip.AAC2.0.x264-BTW +: title: Show Name + season: 1 + episode: 1 + screen_size: 720p + streaming_service: Investigation Discovery + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: BTW + type: episode + +# Streaming service: RTÉ One +? Show.Name.S10E01.576p.RTE.WEBRip.AAC2.0.H.264-RTN +: title: Show Name + season: 10 + episode: 1 + screen_size: 576p + streaming_service: RTÉ One + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: RTN + type: episode + +# Streaming service: AMC +? Show.Name.S01E01.1080p.AMC.WEBRip.H.264.AAC2.0-CasStudio +: title: Show Name + season: 1 + episode: 1 + screen_size: 1080p + streaming_service: AMC + source: Web + other: Rip + audio_codec: AAC + audio_channels: '2.0' + video_codec: H.264 + release_group: CasStudio + type: episode + +? Suits.S07E01.1080p.iT.WEB-DL.DD5.1.H.264-VLAD.mkv +? Suits.S07E01.1080p.iTunes.WEB-DL.DD5.1.H.264-VLAD.mkv +: title: Suits + season: 7 + episode: 1 + screen_size: 1080p + source: Web + streaming_service: iTunes + audio_codec: Dolby Digital + audio_channels: '5.1' + video_codec: H.264 + release_group: VLAD + container: mkv + type: episode + +? UpFront.S01.720p.AJAZ.WEBRip.AAC2.0.x264-BTW +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTW + screen_size: 720p + season: 1 + source: Web + streaming_service: Al Jazeera English + title: UpFront + type: episode + video_codec: H.264 + +? Smack.The.Pony.S01.4OD.WEBRip.AAC2.0.x264-BTW +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTW + season: 1 + source: Web + streaming_service: Channel 4 + title: Smack The Pony + type: episode + video_codec: H.264 + +? The.Toy.Box.S01E01.720p.AMBC.WEBRip.AAC2.0.x264-BTN +: audio_channels: '2.0' + audio_codec: AAC + episode: 1 + other: Rip + release_group: BTN + screen_size: 720p + season: 1 + source: Web + streaming_service: ABC + title: The Toy Box + type: episode + video_codec: H.264 + +? Gundam.Reconguista.in.G.S01.720p.ANLB.WEBRip.AAC2.0.x264-HorribleSubs +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: HorribleSubs + screen_size: 720p + season: 1 + source: Web + streaming_service: AnimeLab + title: Gundam Reconguista in G + type: episode + video_codec: H.264 + +? Animal.Nation.with.Anthony.Anderson.S01E01.1080p.ANPL.WEBRip.AAC2.0.x264-RTN +: audio_channels: '2.0' + audio_codec: AAC + episode: 1 + other: Rip + release_group: RTN + screen_size: 1080p + season: 1 + source: Web + streaming_service: Animal Planet + title: Animal Nation with Anthony Anderson + type: episode + video_codec: H.264 + +? Park.Bench.S01.1080p.AOL.WEBRip.AAC2.0.H.264-BTW +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTW + screen_size: 1080p + season: 1 + source: Web + streaming_service: AOL + title: Park Bench + type: episode + video_codec: H.264 + +? Crime.Scene.Cleaner.S05.720p.ARD.WEBRip.AAC2.0.H.264-BTN +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTN + screen_size: 720p + season: 5 + source: Web + streaming_service: ARD + title: Crime Scene Cleaner + type: episode + video_codec: H.264 + +? Decker.S03.720p.AS.WEB-DL.AAC2.0.H.264-RTN +: audio_channels: '2.0' + audio_codec: AAC + release_group: RTN + screen_size: 720p + season: 3 + source: Web + streaming_service: Adult Swim + title: Decker + type: episode + video_codec: H.264 + +? Southern.Charm.Savannah.S01E04.Hurricane.On.The.Horizon.1080p.BRAV.WEBRip.AAC2.0.x264-BTW +: audio_channels: '2.0' + audio_codec: AAC + episode: 4 + episode_title: Hurricane On The Horizon + other: Rip + release_group: BTW + screen_size: 1080p + season: 1 + source: Web + streaming_service: BravoTV + title: Southern Charm Savannah + type: episode + video_codec: H.264 + +? Four.in.the.Morning.S01E01.Pig.RERip.720p.CBC.WEBRip.AAC2.0.H.264-RTN +: audio_channels: '2.0' + audio_codec: AAC + episode: 1 + episode_title: Pig + other: + - Proper + - Rip + proper_count: 1 + release_group: RTN + screen_size: 720p + season: 1 + source: Web + streaming_service: CBC + title: Four in the Morning + type: episode + video_codec: H.264 + +? Rio.Olympics.2016.08.07.Mens.Football.Group.C.Germany.vs.South.Korea.720p.CBC.WEBRip.AAC2.0.H.264-BTW +: audio_channels: '2.0' + audio_codec: AAC + date: 2016-08-07 + episode_title: Mens Football Group C Germany vs South Korea + other: Rip + release_group: BTW + screen_size: 720p + source: Web + streaming_service: CBC + title: Rio Olympics + type: episode + video_codec: H.264 + +? Comedians.In.Cars.Getting.Coffee.S01.720p.CCGC.WEBRip.AAC2.0.x264-monkee +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: monkee + screen_size: 720p + season: 1 + source: Web + streaming_service: Comedians in Cars Getting Coffee + title: Comedians In Cars Getting Coffee + type: episode + video_codec: H.264 + +? Life.on.Top.S02.720p.CMAX.WEBRip.AAC2.0.x264-CMAX +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: CMAX + screen_size: 720p + season: 2 + source: Web + streaming_service: Cinemax + title: Life on Top + type: episode + video_codec: H.264 + +? Sun.Records.S01.720p.CMT.WEBRip.AAC2.0.x264-BTW +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTW + screen_size: 720p + season: 1 + source: Web + streaming_service: Country Music Television + title: Sun Records + type: episode + video_codec: H.264 + +? Infinity.Train.S01E00.Pilot.REPACK.720p.CN.WEBRip.AAC2.0.H.264-monkee +: audio_channels: '2.0' + audio_codec: AAC + episode: 0 + episode_details: Pilot + episode_title: Pilot + language: zh + other: + - Proper + - Rip + proper_count: 1 + release_group: monkee + screen_size: 720p + season: 1 + source: Web + streaming_service: Cartoon Network + title: Infinity Train + type: episode + video_codec: H.264 + +? Jay.Lenos.Garage.2015.S03E02.1080p.CNBC.WEB-DL.x264-TOPKEK +: episode: 2 + release_group: TOPKEK + screen_size: 1080p + season: 3 + source: Web + streaming_service: CNBC + title: Jay Lenos Garage + type: episode + video_codec: H.264 + year: 2015 + +? US.Presidential.Debates.2015.10.28.Third.Republican.Debate.720p.CNBC.WEBRip.AAC2.0.H.264-monkee +: audio_channels: '2.0' + audio_codec: AAC + country: US + date: 2015-10-28 + episode_title: Third Republican Debate + other: Rip + release_group: monkee + screen_size: 720p + source: Web + streaming_service: CNBC + title: Presidential Debates + type: episode + video_codec: H.264 + +? What.The.Fuck.France.S01E01.Le.doublage.CNLP.WEBRip.AAC2.0.x264-TURTLE +: audio_channels: '2.0' + audio_codec: AAC + country: FR + episode: 1 + episode_title: Le doublage + other: Rip + release_group: TURTLE + season: 1 + source: Web + streaming_service: Canal+ + title: What The Fuck + type: episode + video_codec: H.264 + +? SuperMansion.S02.720p.CRKL.WEBRip.AAC2.0.x264-VLAD +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: VLAD + screen_size: 720p + season: 2 + source: Web + streaming_service: Crackle + title: SuperMansion + type: episode + video_codec: H.264 + +? Chosen.S02.1080p.CRKL.WEBRip.AAC2.0.x264-AJP69 +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: AJP69 + screen_size: 1080p + season: 2 + source: Web + streaming_service: Crackle + title: Chosen + type: episode + video_codec: H.264 + +? Chosen.S03.1080p.CRKL.WEBRip.AAC2.0.x264-AJP69 +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: AJP69 + screen_size: 1080p + season: 3 + source: Web + streaming_service: Crackle + title: Chosen + type: episode + video_codec: H.264 + +? Snatch.S01.1080p.CRKL.WEBRip.AAC2.0.x264-DEFLATE +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: DEFLATE + screen_size: 1080p + season: 1 + source: Web + streaming_service: Crackle + title: Snatch + type: episode + video_codec: H.264 + +? White.House.Correspondents.Dinner.2015.Complete.CSPN.WEBRip.AAC2.0.H.264-BTW +: audio_channels: '2.0' + audio_codec: AAC + other: + - Complete + - Rip + release_group: BTW + source: Web + streaming_service: CSpan + title: White House Correspondents Dinner + type: movie + video_codec: H.264 + year: 2015 + +? The.Amazing.Race.Canada.S03.720p.CTV.WEBRip.AAC2.0.H.264-BTW +: audio_channels: '2.0' + audio_codec: AAC + country: CA + other: Rip + release_group: BTW + screen_size: 720p + season: 3 + source: Web + streaming_service: CTV + title: The Amazing Race + type: episode + video_codec: H.264 + +? Miniverse.S01E01.Explore.the.Solar.System.2160p.CUR.WEB-DL.DDP2.0.x264-monkee +: audio_channels: '2.0' + audio_codec: Dolby Digital Plus + episode: 1 + episode_title: Explore the Solar System + release_group: monkee + screen_size: 2160p + season: 1 + source: Web + streaming_service: CuriosityStream + title: Miniverse + type: episode + video_codec: H.264 + +? Vixen.S02.720p.CWS.WEBRip.AAC2.0.x264-BMF +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BMF + screen_size: 720p + season: 2 + source: Web + streaming_service: CWSeed + title: Vixen + type: episode + video_codec: H.264 + +? Abidin.Dino.DDY.WEBRip.AAC2.0.H.264-BTN +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTN + source: Web + streaming_service: Digiturk Diledigin Yerde + title: Abidin Dino + type: movie + video_codec: H.264 + +? Fast.N.Loud.S08.1080p.DISC.WEBRip.AAC2.0.x264-RTN +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: RTN + screen_size: 1080p + season: 8 + source: Web + streaming_service: Discovery + title: Fast N Loud + type: episode + video_codec: H.264 + +? Bake.Off.Italia.S04.1080p.DPLY.WEBRip.AAC2.0.x264-Threshold +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: Threshold + screen_size: 1080p + season: 4 + source: Web + streaming_service: DPlay + title: Bake Off Italia + type: episode + video_codec: H.264 + +? Long.Riders.S01.DSKI.WEBRip.AAC2.0.x264-HorribleSubs +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: HorribleSubs + season: 1 + source: Web + streaming_service: Daisuki + title: Long Riders + type: episode + video_codec: H.264 + +? Milo.Murphys.Law.S01.720p.DSNY.WEB-DL.AAC2.0.x264-TVSmash +: audio_channels: '2.0' + audio_codec: AAC + release_group: TVSmash + screen_size: 720p + season: 1 + source: Web + streaming_service: Disney + title: Milo Murphys Law + type: episode + video_codec: H.264 + +? 30.for.30.S03E15.Doc.and.Darryl.720p.ESPN.WEBRip.AAC2.0.x264-BTW +: audio_channels: '2.0' + audio_codec: AAC + episode: 15 + episode_title: Doc and Darryl + other: Rip + release_group: BTW + screen_size: 720p + season: 3 + source: Web + streaming_service: ESPN + title: 30 for 30 + type: episode + video_codec: H.264 + +? Boundless.S03.720p.ESQ.WEBRip.AAC2.0.x264-RTN +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: RTN + screen_size: 720p + season: 3 + source: Web + streaming_service: Esquire + title: Boundless + type: episode + video_codec: H.264 + +? Periodismo.Para.Todos.S2016E01.720p.ETTV.WEBRip.AAC2.0.H.264-braggart74 +: audio_channels: '2.0' + audio_codec: AAC + episode: 1 + other: Rip + release_group: braggart74 + screen_size: 720p + season: 2016 + source: Web + streaming_service: El Trece + title: Periodismo Para Todos + type: episode + video_codec: H.264 + year: 2016 + +? Just.Jillian.S01E01.1080p.ETV.WEBRip.AAC2.0.x264-GoApe +: audio_channels: '2.0' + audio_codec: AAC + episode: 1 + other: Rip + release_group: GoApe + screen_size: 1080p + season: 1 + source: Web + streaming_service: E! + title: Just Jillian + type: episode + video_codec: H.264 + +? New.Money.S01.1080p.ETV.WEBRip.AAC2.0.x264-BTW +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTW + screen_size: 1080p + season: 1 + source: Web + streaming_service: E! + title: New Money + type: episode + video_codec: H.264 + +? Gaming.Show.In.My.Parents.Garage.S02E01.The.Power.Up1000.FAM.WEBRip.AAC2.0.x264-RTN +: audio_channels: '2.0' + audio_codec: AAC + episode: 1 + episode_title: The Power Up1000 + other: Rip + release_group: RTN + season: 2 + source: Web + streaming_service: Family + title: Gaming Show In My Parents Garage + type: episode + video_codec: H.264 + +? Little.People.2016.S01E03.Proud.to.Be.You.and.Me.720p.FJR.WEBRip.AAC2.0.x264-RTN +: audio_channels: '2.0' + audio_codec: AAC + episode: 3 + episode_title: Proud to Be You and Me + other: Rip + release_group: RTN + screen_size: 720p + season: 1 + source: Web + streaming_service: Family Jr + title: Little People + type: episode + video_codec: H.264 + year: 2016 + +? The.Pioneer.Woman.S00E08.Summer.Summer.Summer.720p.FOOD.WEB-DL.AAC2.0.x264-AJP69 +: audio_channels: '2.0' + audio_codec: AAC + episode: 8 + episode_title: Summer Summer Summer + release_group: AJP69 + screen_size: 720p + season: 0 + source: Web + streaming_service: Food Network + title: The Pioneer Woman + type: episode + video_codec: H.264 + +? Prata.da.Casa.S01E01.720p.FOX.WEBRip.AAC2.0.H.264-BARRY +: audio_channels: '2.0' + audio_codec: AAC + episode: 1 + other: Rip + release_group: BARRY + screen_size: 720p + season: 1 + source: Web + streaming_service: Fox + title: Prata da Casa + type: episode + video_codec: H.264 + +? Grandfathered.S01.720p.FOX.WEBRip.AAC2.0.H.264-BTW +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTW + screen_size: 720p + season: 1 + source: Web + streaming_service: Fox + title: Grandfathered + type: episode + video_codec: H.264 + +? Truth.and.Iliza.S01E01.FREE.WEBRip.AAC2.0.x264-BTN +: audio_channels: '2.0' + audio_codec: AAC + episode: 1 + other: Rip + release_group: BTN + season: 1 + source: Web + streaming_service: Freeform + title: Truth and Iliza + type: episode + video_codec: H.264 + +? Seven.Year.Switch.S01.720p.FYI.WEBRip.AAC2.0.x264-BTW +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTW + screen_size: 720p + season: 1 + source: Web + streaming_service: FYI Network + title: Seven Year Switch + type: episode + video_codec: H.264 + +? NHL.2015.10.09.Leafs.vs.Red.Wings.Condensed.Game.720p.Away.Feed.GC.WEBRip.AAC2.0.H.264-BTW +: audio_channels: '2.0' + audio_codec: AAC + date: 2015-10-09 + episode_title: Leafs vs Red Wings Condensed Game + other: Rip + release_group: BTW + screen_size: 720p + source: Web + streaming_service: NHL GameCenter + title: NHL + type: episode + video_codec: H.264 + +? NHL.2016.01.26.Maple.Leafs.vs.Panthers.720p.Home.Feed.GC.WEBRip.AAC2.0.H.264-BTW +: audio_channels: '2.0' + audio_codec: AAC + date: 2016-01-26 + episode_title: Maple Leafs vs Panthers + other: Rip + release_group: BTW + screen_size: 720p + source: Web + streaming_service: NHL GameCenter + title: NHL + type: episode + video_codec: H.264 + +? Big.Brother.Canada.S05.GLBL.WEBRip.AAC2.0.H.264-RTN +: audio_channels: '2.0' + audio_codec: AAC + country: CA + other: Rip + release_group: RTN + season: 5 + source: Web + streaming_service: Global + title: Big Brother + type: episode + video_codec: H.264 + +? Pornolandia.S01.720p.GLOB.WEBRip.AAC2.0.x264-GeneX +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: GeneX + screen_size: 720p + season: 1 + source: Web + streaming_service: GloboSat Play + title: Pornolandia + type: episode + video_codec: H.264 + +? Transando.com.Laerte.S01.720p.GLOB.WEBRip.AAC2.0.x264-GeneX +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: GeneX + screen_size: 720p + season: 1 + source: Web + streaming_service: GloboSat Play + title: Transando com Laerte + type: episode + video_codec: H.264 + +? Flip.or.Flop.S01.720p.HGTV.WEBRip.AAC2.0.H.264-AJP69 +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: AJP69 + screen_size: 720p + season: 1 + source: Web + streaming_service: HGTV + title: Flip or Flop + type: episode + video_codec: H.264 + +? Kitten.Bowl.2014.720p.HLMK.WEBRip.AAC2.0.x264-monkee +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: monkee + screen_size: 720p + source: Web + streaming_service: Hallmark + title: Kitten Bowl + type: movie + video_codec: H.264 + year: 2014 + +? Still.Star-Crossed.S01E05.720p.HULU.WEB-DL.AAC2.0.H.264-VLAD +: audio_channels: '2.0' + audio_codec: AAC + episode: 5 + release_group: VLAD + screen_size: 720p + season: 1 + source: Web + streaming_service: Hulu + title: Still Star-Crossed + type: episode + video_codec: H.264 + +? EastEnders.2017.07.17.720p.iP.WEB-DL.AAC2.0.H.264-BTN +: audio_channels: '2.0' + audio_codec: AAC + date: 2017-07-17 + release_group: BTN + screen_size: 720p + source: Web + streaming_service: BBC iPlayer + title: EastEnders + type: episode + video_codec: H.264 + +? Handmade.in.Japan.S01E01.720p.iP.WEBRip.AAC2.0.H.264-SUP +: audio_channels: '2.0' + audio_codec: AAC + country: JP + episode: 1 + other: Rip + release_group: SUP + screen_size: 720p + season: 1 + source: Web + streaming_service: BBC iPlayer + title: Handmade in + type: episode + video_codec: H.264 + +? The.Chillenden.Murders.S01.720p.iP.WEBRip.AAC2.0.H.264-HAX +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: HAX + screen_size: 720p + season: 1 + source: Web + streaming_service: BBC iPlayer + title: The Chillenden Murders + type: episode + video_codec: H.264 + +? The.Street.S01.ITV.WEB-DL.AAC2.0.x264-RTN +: audio_channels: '2.0' + audio_codec: AAC + release_group: RTN + season: 1 + source: Web + streaming_service: ITV + title: The Street + type: episode + video_codec: H.264 + +? Hope.for.Wildlife.S04.1080p.KNOW.WEBRip.AAC2.0.x264-BTW +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTW + screen_size: 1080p + season: 4 + source: Web + streaming_service: Knowledge Network + title: Hope for Wildlife + type: episode + video_codec: H.264 + +? Kim.of.Queens.S02.720p.LIFE.WEBRip.AAC2.0.H.264-RTN +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: RTN + screen_size: 720p + season: 2 + source: Web + streaming_service: Lifetime + title: Kim of Queens + type: episode + video_codec: H.264 + +? The.Rachel.Maddow.Show.2017.02.22.720p.MNBC.WEBRip.AAC2.0.x264-BTW +: audio_channels: '2.0' + audio_codec: AAC + date: 2017-02-22 + other: Rip + release_group: BTW + screen_size: 720p + source: Web + streaming_service: MSNBC + title: The Rachel Maddow Show + type: episode + video_codec: H.264 + +? Ignition.S06E12.720p.MTOD.WEB-DL.AAC2.0.x264-RTN +: audio_channels: '2.0' + audio_codec: AAC + episode: 12 + release_group: RTN + screen_size: 720p + season: 6 + source: Web + streaming_service: Motor Trend OnDemand + title: Ignition + type: episode + video_codec: H.264 + +? Teen.Mom.UK.S01E01.Life.as.a.Teen.Mum.1080p.MTV.WEB-DL.AAC2.0.x264-BTW +: audio_channels: '2.0' + audio_codec: AAC + country: GB + episode: 1 + episode_title: Life as a Teen Mum + release_group: BTW + screen_size: 1080p + season: 1 + source: Web + streaming_service: MTV + title: Teen Mom + type: episode + video_codec: H.264 + +? Undrafted.S01.720p.NFLN.WEBRip.AAC2.0.H.264-TTYL +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: TTYL + screen_size: 720p + season: 1 + source: Web + streaming_service: NFL Now + title: Undrafted + type: episode + video_codec: H.264 + +? NFL.2016.08.25.PreSeason.Cowboys.vs.Seahawks.720p.NFL.WEBRip.AAC2.0.H.264-BTW +: audio_channels: '2.0' + audio_codec: AAC + date: 2016-08-25 + episode_title: PreSeason Cowboys vs Seahawks + other: Rip + release_group: BTW + screen_size: 720p + source: Web + streaming_service: NFL + title: NFL + type: episode + video_codec: H.264 + +? Bunsen.is.a.Beast.S01E23.Guinea.Some.Lovin.1080p.NICK.WEBRip.AAC2.0.x264-TVSmash +: audio_channels: '2.0' + audio_codec: AAC + country: GN + episode: 23 + episode_title: Some Lovin + other: Rip + release_group: TVSmash + screen_size: 1080p + season: 1 + source: Web + streaming_service: Nickelodeon + title: Bunsen is a Beast + type: episode + video_codec: H.264 + +? Valkyrie.S01.720p.NRK.WEBRip.AAC2.0.x264-BTN +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTN + screen_size: 720p + season: 1 + source: Web + streaming_service: Norsk Rikskringkasting + title: Valkyrie + type: episode + video_codec: H.264 + +? Food.Forward.S01.720p.PBS.WEBRip.AAC2.0.x264-RTN +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: RTN + screen_size: 720p + season: 1 + source: Web + streaming_service: PBS + title: Food Forward + type: episode + video_codec: H.264 + +? SciGirls.S01E01.Turtle.Mania.720p.PBSK.WEBRip.AAC2.0.x264-RTN +: audio_channels: '2.0' + audio_codec: AAC + episode: 1 + episode_title: Turtle Mania + other: Rip + release_group: RTN + screen_size: 720p + season: 1 + source: Web + streaming_service: PBS Kids + title: SciGirls + type: episode + video_codec: H.264 + +? Powers.2015.S01.1080p.PSN.WEBRip.DD5.1.x264-NTb +: audio_channels: '5.1' + audio_codec: Dolby Digital + other: Rip + release_group: NTb + screen_size: 1080p + season: 1 + source: Web + streaming_service: Playstation Network + title: Powers + type: episode + video_codec: H.264 + year: 2015 + +? Escape.The.Night.S02E02.The.Masquerade.Part.II.1080p.RED.WEBRip.AAC5.1.VP9-BTW +: audio_channels: '5.1' + audio_codec: AAC + episode: 2 + episode_title: The Masquerade + other: Rip + part: 2 + release_group: VP9-BTW + screen_size: 1080p + season: 2 + source: Web + streaming_service: YouTube Red + title: Escape The Night + type: episode + +? Escape.The.Night.S02E02.The.Masquerade.Part.II.2160p.RED.WEBRip.AAC5.1.VP9-BTW +: audio_channels: '5.1' + audio_codec: AAC + episode: 2 + episode_title: The Masquerade + other: Rip + part: 2 + release_group: VP9-BTW + screen_size: 2160p + season: 2 + source: Web + streaming_service: YouTube Red + title: Escape The Night + type: episode + +? Escape.The.Night.S02E02.The.Masquerade.Part.II.720p.RED.WEBRip.AAC5.1.VP9-BTW +: audio_channels: '5.1' + audio_codec: AAC + episode: 2 + episode_title: The Masquerade + other: Rip + part: 2 + release_group: VP9-BTW + screen_size: 720p + season: 2 + source: Web + streaming_service: YouTube Red + title: Escape The Night + type: episode + +? The.Family.Law.S02E01.720p.SBS.WEB-DL.AAC2.0.H.264-BTN +: audio_channels: '2.0' + audio_codec: AAC + episode: 1 + release_group: BTN + screen_size: 720p + season: 2 + source: Web + streaming_service: SBS (AU) + title: The Family Law + type: episode + video_codec: H.264 + +? Theres.No.Joy.In.Beachville.The.True.Story.of.Baseballs.Origin.720p.SNET.WEBRip.AAC2.0.x264-BTW +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTW + screen_size: 720p + source: Web + streaming_service: Sportsnet + title: Theres No Joy In Beachville The True Story of Baseballs Origin + type: movie + video_codec: H.264 + +? One.Night.Only.Alec.Baldwin.720p.SPIK.WEB-DL.AAC2.0.x264-NOGRP +: audio_channels: '2.0' + audio_codec: AAC + release_group: NOGRP + screen_size: 720p + source: Web + streaming_service: Spike + title: One Night Only Alec Baldwin + type: movie + video_codec: H.264 + +? Ink.Master.S08.720p.SPIK.WEBRip.AAC2.0.x264-BTW +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTW + screen_size: 720p + season: 8 + source: Web + streaming_service: Spike + title: Ink Master + type: episode + video_codec: H.264 + +? Jungle.Bunch.S01E01.Deep.Chasm.1080p.SPRT.WEBRip.AAC2.0.x264-RTN +: audio_channels: '2.0' + audio_codec: AAC + episode: 1 + episode_title: Deep Chasm + other: Rip + release_group: RTN + screen_size: 1080p + season: 1 + source: Web + streaming_service: Sprout + title: Jungle Bunch + type: episode + video_codec: H.264 + +? Ash.vs.Evil.Dead.S01.720p.STZ.WEBRip.AAC2.0.x264-NTb +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: NTb + screen_size: 720p + season: 1 + source: Web + streaming_service: Starz + title: Ash vs Evil Dead + type: episode + video_codec: H.264 + +? WWE.Swerved.S01.720p.WWEN.WEBRip.AAC2.0.H.264-PPKORE +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: PPKORE + screen_size: 720p + season: 1 + source: Web + streaming_service: WWE Network + title: WWE Swerved + type: episode + video_codec: H.264 + +? Face.Off.S11.1080p.SYFY.WEBRip.AAC2.0.x264-BTW +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTW + screen_size: 1080p + season: 11 + source: Web + streaming_service: Syfy + title: Face Off + type: episode + video_codec: H.264 + +? Conan.2016.09.22.Jeff.Garlin.720p.TBS.WEBRip.AAC2.0.H.264-NOGRP +: audio_channels: '2.0' + audio_codec: AAC + date: 2016-09-22 + episode_title: Jeff Garlin + other: Rip + release_group: NOGRP + screen_size: 720p + source: Web + streaming_service: TBS + title: Conan + type: episode + video_codec: H.264 + +? Swans.Crossing.S01.TUBI.WEBRip.AAC2.0.x264-RTN +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: RTN + season: 1 + source: Web + streaming_service: TubiTV + title: Swans Crossing + type: episode + video_codec: H.264 + +? The.Joy.of.Techs.S01.UKTV.WEB-DL.AAC2.0.x264-RTN +: audio_channels: '2.0' + audio_codec: AAC + release_group: RTN + season: 1 + source: Web + streaming_service: UKTV + title: The Joy of Techs + type: episode + video_codec: H.264 + +? Rock.Icons.S01.720p.VH1.WEB-DL.AAC2.0.H.264-RTN +: audio_channels: '2.0' + audio_codec: AAC + release_group: RTN + screen_size: 720p + season: 1 + source: Web + streaming_service: VH1 + title: Rock Icons + type: episode + video_codec: H.264 + +? Desus.and.Mero.S01E130.2017.07.18.1080p.VICE.WEB-DL.AAC2.0.x264-RTN +: audio_channels: '2.0' + audio_codec: AAC + date: 2017-07-18 + episode: 130 + release_group: RTN + screen_size: 1080p + season: 1 + source: Web + streaming_service: Viceland + title: Desus and Mero + type: episode + video_codec: H.264 + +? Graveyard.Carz.S07.1080p.VLCT.WEBRip.AAC2.0.x264-RTN +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: RTN + screen_size: 1080p + season: 7 + source: Web + streaming_service: Velocity + title: Graveyard Carz + type: episode + video_codec: H.264 + +? Other.Space.S01E01.1080p.YHOO.WEBRip.AAC2.0.x264-BTW +: audio_channels: '2.0' + audio_codec: AAC + episode: 1 + other: Rip + release_group: BTW + screen_size: 1080p + season: 1 + source: Web + streaming_service: Yahoo + title: Other Space + type: episode + video_codec: H.264 + +? Americas.Test.Kitchen.S17.720p.ATK.WEB-DL.AAC2.0.x264-BTN +: audio_channels: '2.0' + audio_codec: AAC + release_group: BTN + screen_size: 720p + season: 17 + source: Web + streaming_service: America's Test Kitchen + title: Americas Test Kitchen + type: episode + video_codec: H.264 + +? Bushwhacked.Bugs.S01.AUBC.WEBRip.AAC2.0.H.264-DAWN +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: DAWN + season: 1 + source: Web + streaming_service: ABC Australia + title: Bushwhacked Bugs + type: episode + video_codec: H.264 + +? VICE.S05E12.1080p.HBO.WEB-DL.AAC2.0.H.264-monkee +? VICE.S05E12.1080p.HBO-Go.WEB-DL.AAC2.0.H.264-monkee +? VICE.S05E12.1080p.HBOGo.WEB-DL.AAC2.0.H.264-monkee +: audio_channels: '2.0' + audio_codec: AAC + episode: 12 + release_group: monkee + screen_size: 1080p + season: 5 + source: Web + streaming_service: HBO Go + title: VICE + type: episode + video_codec: H.264 + +? Dix.Pour.Cent.S02.PLUZ.WEBRip.AAC2.0.H.264-TURTLE +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: TURTLE + season: 2 + source: Web + streaming_service: Pluzz + title: Dix Pour Cent + type: episode + video_codec: H.264 + +? Ulveson.och.Herngren.S01.720p.SVT.WEBRip.AAC2.0.H.264-BTN +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTN + screen_size: 720p + season: 1 + source: Web + streaming_service: Sveriges Television + title: Ulveson och Herngren + type: episode + video_codec: H.264 + +? Bravest.Warriors.S03.1080p.VRV.WEBRip.AAC2.0.x264-BTN +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTN + screen_size: 1080p + season: 3 + source: Web + streaming_service: VRV + title: Bravest Warriors + type: episode + video_codec: H.264 + +? The.Late.Night.Big.Breakfast.S02.WME.WEBRip.AAC2.0.x264-BTN +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTN + season: 2 + source: Web + streaming_service: WatchMe + title: The Late Night Big Breakfast + type: episode + video_codec: H.264 + +? Hockey.Wives.S02.WNET.WEBRip.AAC2.0.H.264-BTW +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTW + season: 2 + source: Web + streaming_service: W Network + title: Hockey Wives + type: episode + video_codec: H.264 + +? Sin.City.Saints.S01.1080p.YHOO.WEBRip.AAC2.0.x264-NTb +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: NTb + screen_size: 1080p + season: 1 + source: Web + streaming_service: Yahoo + title: Sin City Saints + type: episode + video_codec: H.264 + +? 555.S01.1080p.VMEO.WEBRip.AAC2.0.x264-BTN +: audio_channels: '2.0' + audio_codec: AAC + other: Rip + release_group: BTN + screen_size: 1080p + season: 1 + source: Web + streaming_service: Vimeo + title: '555' + type: episode + video_codec: H.264 + +# All this below shouldn't match any streaming services +? London.2012.Olympics.CTV.Preview.Show.HDTV.x264-2HD +: alternative_title: Olympics CTV Preview Show + release_group: 2HD + source: HDTV + title: London + type: movie + video_codec: H.264 + year: 2012 + +? UFC.on.FOX.24.1080p.HDTV.x264-VERUM +: episode: 24 + release_group: VERUM + screen_size: 1080p + source: HDTV + title: UFC on FOX + type: episode + video_codec: H.264 + +? ESPN.E.60.2016.10.04.HDTV.x264-LoTV +: date: 2016-10-04 + episode: 60 + release_group: LoTV + source: HDTV + title: ESPN E + type: episode + video_codec: H.264 + +? GTTV.E3.All.Access.Live.Day.1.Xbox.Showcase.Preshow.HDTV.x264-SYS +: episode: 3 + episode_title: All Access Live Day 1 Xbox Showcase Preshow + release_group: SYS + source: HDTV + title: GTTV + type: episode + video_codec: H.264 diff --git a/lib/guessit/test/suggested.json b/lib/guessit/test/suggested.json new file mode 100644 index 00000000..dc838ad0 --- /dev/null +++ b/lib/guessit/test/suggested.json @@ -0,0 +1,21 @@ +{ + "titles": [ + "13 Reasons Why", + "Star Wars: Episode VII - The Force Awakens", + "3%", + "The 100", + "3 Percent", + "This is Us", + "Open Season 2", + "Game of Thrones", + "The X-Files", + "11.22.63" + ], + "suggested": [ + "13 Reasons Why", + "Star Wars: Episode VII - The Force Awakens", + "The 100", + "Open Season 2", + "11.22.63" + ] +} \ No newline at end of file diff --git a/lib/guessit/test/test-input-file.txt b/lib/guessit/test/test-input-file.txt new file mode 100644 index 00000000..656bc931 --- /dev/null +++ b/lib/guessit/test/test-input-file.txt @@ -0,0 +1,2 @@ +Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv +SecondFile.avi \ No newline at end of file diff --git a/lib/guessit/test/test_api.py b/lib/guessit/test/test_api.py new file mode 100644 index 00000000..391dbced --- /dev/null +++ b/lib/guessit/test/test_api.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# pylint: disable=no-self-use, pointless-statement, missing-docstring, invalid-name, pointless-string-statement +import json +import os +import sys + +import pytest +import six + +from ..api import guessit, properties, suggested_expected, GuessitException + +__location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))) + + +def test_default(): + ret = guessit('Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv') + assert ret and 'title' in ret + + +def test_forced_unicode(): + ret = guessit(u'Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv') + assert ret and 'title' in ret and isinstance(ret['title'], six.text_type) + + +def test_forced_binary(): + ret = guessit(b'Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv') + assert ret and 'title' in ret and isinstance(ret['title'], six.binary_type) + + +@pytest.mark.skipif(sys.version_info < (3, 4), reason="Path is not available") +def test_pathlike_object(): + try: + from pathlib import Path + + path = Path('Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv') + ret = guessit(path) + assert ret and 'title' in ret + except ImportError: # pragma: no-cover + pass + + +def test_unicode_japanese(): + ret = guessit('[阿维达].Avida.2006.FRENCH.DVDRiP.XViD-PROD.avi') + assert ret and 'title' in ret + + +def test_unicode_japanese_options(): + ret = guessit("[阿维达].Avida.2006.FRENCH.DVDRiP.XViD-PROD.avi", options={"expected_title": ["阿维达"]}) + assert ret and 'title' in ret and ret['title'] == "阿维达" + + +def test_forced_unicode_japanese_options(): + ret = guessit(u"[阿维达].Avida.2006.FRENCH.DVDRiP.XViD-PROD.avi", options={"expected_title": [u"阿维达"]}) + assert ret and 'title' in ret and ret['title'] == u"阿维达" + +# TODO: This doesn't compile on python 3, but should be tested on python 2. +""" +if six.PY2: + def test_forced_binary_japanese_options(): + ret = guessit(b"[阿维达].Avida.2006.FRENCH.DVDRiP.XViD-PROD.avi", options={"expected_title": [b"阿维达"]}) + assert ret and 'title' in ret and ret['title'] == b"阿维达" +""" + + +def test_properties(): + props = properties() + assert 'video_codec' in props.keys() + + +def test_exception(): + with pytest.raises(GuessitException) as excinfo: + guessit(object()) + assert "An internal error has occured in guessit" in str(excinfo.value) + assert "Guessit Exception Report" in str(excinfo.value) + assert "Please report at https://github.com/guessit-io/guessit/issues" in str(excinfo.value) + + +def test_suggested_expected(): + with open(os.path.join(__location__, 'suggested.json'), 'r') as f: + content = json.load(f) + actual = suggested_expected(content['titles']) + assert actual == content['suggested'] diff --git a/lib/guessit/test/test_api_unicode_literals.py b/lib/guessit/test/test_api_unicode_literals.py new file mode 100644 index 00000000..826f7cd1 --- /dev/null +++ b/lib/guessit/test/test_api_unicode_literals.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# pylint: disable=no-self-use, pointless-statement, missing-docstring, invalid-name, pointless-string-statement + + +from __future__ import unicode_literals + +import os + +import pytest +import six + +from ..api import guessit, properties, GuessitException + +__location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))) + + +def test_default(): + ret = guessit('Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv') + assert ret and 'title' in ret + + +def test_forced_unicode(): + ret = guessit(u'Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv') + assert ret and 'title' in ret and isinstance(ret['title'], six.text_type) + + +def test_forced_binary(): + ret = guessit(b'Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv') + assert ret and 'title' in ret and isinstance(ret['title'], six.binary_type) + + +def test_unicode_japanese(): + ret = guessit('[阿维达].Avida.2006.FRENCH.DVDRiP.XViD-PROD.avi') + assert ret and 'title' in ret + + +def test_unicode_japanese_options(): + ret = guessit("[阿维达].Avida.2006.FRENCH.DVDRiP.XViD-PROD.avi", options={"expected_title": ["阿维达"]}) + assert ret and 'title' in ret and ret['title'] == "阿维达" + + +def test_forced_unicode_japanese_options(): + ret = guessit(u"[阿维达].Avida.2006.FRENCH.DVDRiP.XViD-PROD.avi", options={"expected_title": [u"阿维达"]}) + assert ret and 'title' in ret and ret['title'] == u"阿维达" + +# TODO: This doesn't compile on python 3, but should be tested on python 2. +""" +if six.PY2: + def test_forced_binary_japanese_options(): + ret = guessit(b"[阿维达].Avida.2006.FRENCH.DVDRiP.XViD-PROD.avi", options={"expected_title": [b"阿维达"]}) + assert ret and 'title' in ret and ret['title'] == b"阿维达" +""" + + +def test_ensure_standard_string_class(): + class CustomStr(str): + pass + + ret = guessit(CustomStr('1080p'), options={'advanced': True}) + assert ret and 'screen_size' in ret and not isinstance(ret['screen_size'].input_string, CustomStr) + + +def test_properties(): + props = properties() + assert 'video_codec' in props.keys() + + +def test_exception(): + with pytest.raises(GuessitException) as excinfo: + guessit(object()) + assert "An internal error has occured in guessit" in str(excinfo.value) + assert "Guessit Exception Report" in str(excinfo.value) + assert "Please report at https://github.com/guessit-io/guessit/issues" in str(excinfo.value) diff --git a/lib/guessit/test/test_benchmark.py b/lib/guessit/test/test_benchmark.py new file mode 100644 index 00000000..34386e30 --- /dev/null +++ b/lib/guessit/test/test_benchmark.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# pylint: disable=no-self-use,pointless-statement,missing-docstring,invalid-name,line-too-long +import time + +import pytest + +from ..api import guessit + + +def case1(): + return guessit('Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv') + + +def case2(): + return guessit('Movies/Fantastic Mr Fox/Fantastic.Mr.Fox.2009.DVDRip.{x264+LC-AAC.5.1}{Fr-Eng}{Sub.Fr-Eng}-™.[sharethefiles.com].mkv') + + +def case3(): + return guessit('Series/dexter/Dexter.5x02.Hello,.Bandit.ENG.-.sub.FR.HDTV.XviD-AlFleNi-TeaM.[tvu.org.ru].avi') + + +def case4(): + return guessit('Movies/The Doors (1991)/09.03.08.The.Doors.(1991).BDRip.720p.AC3.X264-HiS@SiLUHD-English.[sharethefiles.com].mkv') + + +@pytest.mark.benchmark( + group="Performance Tests", + min_time=1, + max_time=2, + min_rounds=5, + timer=time.time, + disable_gc=True, + warmup=False +) +@pytest.mark.skipif(True, reason="Disabled") +class TestBenchmark(object): + def test_case1(self, benchmark): + ret = benchmark(case1) + assert ret + + def test_case2(self, benchmark): + ret = benchmark(case2) + assert ret + + def test_case3(self, benchmark): + ret = benchmark(case3) + assert ret + + def test_case4(self, benchmark): + ret = benchmark(case4) + assert ret diff --git a/lib/guessit/test/test_main.py b/lib/guessit/test/test_main.py new file mode 100644 index 00000000..cbdba7aa --- /dev/null +++ b/lib/guessit/test/test_main.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# pylint: disable=no-self-use, pointless-statement, missing-docstring, invalid-name + +import os + +import pytest + +from ..__main__ import main + +__location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))) + + +def test_main_no_args(): + main([]) + + +def test_main(): + main(['Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv']) + + +def test_main_unicode(): + main(['[阿维达].Avida.2006.FRENCH.DVDRiP.XViD-PROD.avi']) + + +def test_main_forced_unicode(): + main([u'Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv']) + + +def test_main_verbose(): + main(['Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv', '--verbose']) + + +def test_main_yaml(): + main(['Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv', '--yaml']) + + +def test_main_json(): + main(['Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv', '--json']) + + +def test_main_show_property(): + main(['Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv', '-P', 'title']) + + +def test_main_advanced(): + main(['Fear.and.Loathing.in.Las.Vegas.FRENCH.ENGLISH.720p.HDDVD.DTS.x264-ESiR.mkv', '-a']) + + +def test_main_input(): + main(['--input', os.path.join(__location__, 'test-input-file.txt')]) + + +def test_main_properties(): + main(['-p']) + main(['-p', '--json']) + main(['-p', '--yaml']) + + +def test_main_values(): + main(['-V']) + main(['-V', '--json']) + main(['-V', '--yaml']) + + +def test_main_help(): + with pytest.raises(SystemExit): + main(['--help']) + + +def test_main_version(): + main(['--version']) diff --git a/lib/guessit/test/test_options.py b/lib/guessit/test/test_options.py new file mode 100644 index 00000000..4f019b34 --- /dev/null +++ b/lib/guessit/test/test_options.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# pylint: disable=no-self-use, pointless-statement, missing-docstring, invalid-name, pointless-string-statement +import os + +import pytest + +from ..options import get_options_file_locations, merge_options, load_config_file, ConfigurationException, \ + load_config + +__location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))) + + +def test_config_locations(): + homedir = '/root' + cwd = '/root/cwd' + + locations = get_options_file_locations(homedir, cwd, True) + assert len(locations) == 9 + + assert '/root/.guessit/options.json' in locations + assert '/root/.guessit/options.yml' in locations + assert '/root/.guessit/options.yaml' in locations + assert '/root/.config/guessit/options.json' in locations + assert '/root/.config/guessit/options.yml' in locations + assert '/root/.config/guessit/options.yaml' in locations + assert '/root/cwd/guessit.options.json' in locations + assert '/root/cwd/guessit.options.yml' in locations + assert '/root/cwd/guessit.options.yaml' in locations + + +def test_merge_configurations(): + c1 = {'param1': True, 'param2': True, 'param3': False} + c2 = {'param1': False, 'param2': True, 'param3': False} + c3 = {'param1': False, 'param2': True, 'param3': False} + + merged = merge_options(c1, c2, c3) + assert not merged['param1'] + assert merged['param2'] + assert not merged['param3'] + + merged = merge_options(c3, c2, c1) + assert merged['param1'] + assert merged['param2'] + assert not merged['param3'] + + +def test_merge_configurations_lists(): + c1 = {'param1': [1], 'param2': True, 'param3': False} + c2 = {'param1': [2], 'param2': True, 'param3': False} + c3 = {'param1': [3], 'param2': True, 'param3': False} + + merged = merge_options(c1, c2, c3) + assert merged['param1'] == [1, 2, 3] + assert merged['param2'] + assert not merged['param3'] + + merged = merge_options(c3, c2, c1) + assert merged['param1'] == [3, 2, 1] + assert merged['param2'] + assert not merged['param3'] + + +def test_merge_configurations_deep(): + c1 = {'param1': [1], 'param2': {'d1': [1]}, 'param3': False} + c2 = {'param1': [2], 'param2': {'d1': [2]}, 'param3': False} + c3 = {'param1': [3], 'param2': {'d3': [3]}, 'param3': False} + + merged = merge_options(c1, c2, c3) + assert merged['param1'] == [1, 2, 3] + assert merged['param2']['d1'] == [1, 2] + assert merged['param2']['d3'] == [3] + assert 'd2' not in merged['param2'] + assert not merged['param3'] + + merged = merge_options(c3, c2, c1) + assert merged['param1'] == [3, 2, 1] + assert merged['param2'] + assert merged['param2']['d1'] == [2, 1] + assert 'd2' not in merged['param2'] + assert merged['param2']['d3'] == [3] + assert not merged['param3'] + + +def test_merge_configurations_pristine_all(): + c1 = {'param1': [1], 'param2': True, 'param3': False} + c2 = {'param1': [2], 'param2': True, 'param3': False, 'pristine': True} + c3 = {'param1': [3], 'param2': True, 'param3': False} + + merged = merge_options(c1, c2, c3) + assert merged['param1'] == [2, 3] + assert merged['param2'] + assert not merged['param3'] + + merged = merge_options(c3, c2, c1) + assert merged['param1'] == [2, 1] + assert merged['param2'] + assert not merged['param3'] + + +def test_merge_configurations_pristine_properties(): + c1 = {'param1': [1], 'param2': False, 'param3': True} + c2 = {'param1': [2], 'param2': True, 'param3': False, 'pristine': ['param2', 'param3']} + c3 = {'param1': [3], 'param2': True, 'param3': False} + + merged = merge_options(c1, c2, c3) + assert merged['param1'] == [1, 2, 3] + assert merged['param2'] + assert not merged['param3'] + + +def test_merge_configurations_pristine_properties_deep(): + c1 = {'param1': [1], 'param2': {'d1': False}, 'param3': True} + c2 = {'param1': [2], 'param2': {'d1': True}, 'param3': False, 'pristine': ['param2', 'param3']} + c3 = {'param1': [3], 'param2': {'d1': True}, 'param3': False} + + merged = merge_options(c1, c2, c3) + assert merged['param1'] == [1, 2, 3] + assert merged['param2'] + assert not merged['param3'] + + +def test_merge_configurations_pristine_properties2(): + c1 = {'param1': [1], 'param2': False, 'param3': True} + c2 = {'param1': [2], 'param2': True, 'param3': False, 'pristine': ['param1', 'param2', 'param3']} + c3 = {'param1': [3], 'param2': True, 'param3': False} + + merged = merge_options(c1, c2, c3) + assert merged['param1'] == [2, 3] + assert merged['param2'] + assert not merged['param3'] + + +def test_load_config_file(): + json_config = load_config_file(os.path.join(__location__, 'config', 'test.json')) + yml_config = load_config_file(os.path.join(__location__, 'config', 'test.yml')) + yaml_config = load_config_file(os.path.join(__location__, 'config', 'test.yaml')) + + assert json_config['expected_title'] == ['The 100', 'OSS 117'] + assert yml_config['expected_title'] == ['The 100', 'OSS 117'] + assert yaml_config['expected_title'] == ['The 100', 'OSS 117'] + + assert json_config['yaml'] is False + assert yml_config['yaml'] is True + assert yaml_config['yaml'] is True + + with pytest.raises(ConfigurationException) as excinfo: + load_config_file(os.path.join(__location__, 'config', 'dummy.txt')) + + assert excinfo.match('Configuration file extension is not supported for ".*?dummy.txt" file\\.') + + +def test_load_config(): + config = load_config({'no_default_config': True, 'param1': 'test', + 'config': [os.path.join(__location__, 'config', 'test.yml')]}) + + assert not config.get('param1') + + assert config.get('advanced_config') # advanced_config is still loaded from default + assert config['expected_title'] == ['The 100', 'OSS 117'] + assert config['yaml'] is True + + config = load_config({'no_default_config': True, 'param1': 'test'}) + + assert not config.get('param1') + + assert 'expected_title' not in config + assert 'yaml' not in config + + config = load_config({'no_default_config': True, 'param1': 'test', 'config': ['false']}) + + assert not config.get('param1') + + assert 'expected_title' not in config + assert 'yaml' not in config diff --git a/lib/guessit/test/test_yml.py b/lib/guessit/test/test_yml.py new file mode 100644 index 00000000..040796de --- /dev/null +++ b/lib/guessit/test/test_yml.py @@ -0,0 +1,297 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# pylint: disable=no-self-use, pointless-statement, missing-docstring, invalid-name +import logging +import os +# io.open supports encoding= in python 2.7 +from io import open # pylint: disable=redefined-builtin + +import babelfish +import six # pylint:disable=wrong-import-order +import yaml # pylint:disable=wrong-import-order +from rebulk.remodule import re +from rebulk.utils import is_iterable + +from .. import guessit +from ..options import parse_options +from ..yamlutils import OrderedDictYAMLLoader + +logger = logging.getLogger(__name__) + +__location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))) + + +class EntryResult(object): + def __init__(self, string, negates=False): + self.string = string + self.negates = negates + self.valid = [] + self.missing = [] + self.different = [] + self.extra = [] + self.others = [] + + @property + def ok(self): + if self.negates: + return self.missing or self.different + return not self.missing and not self.different and not self.extra and not self.others + + @property + def warning(self): + if self.negates: + return False + return not self.missing and not self.different and self.extra + + @property + def error(self): + if self.negates: + return not self.missing and not self.different and not self.others + return self.missing or self.different or self.others + + def __repr__(self): + if self.ok: + return self.string + ': OK!' + if self.warning: + return '%s%s: WARNING! (valid=%i, extra=%i)' % ('-' if self.negates else '', self.string, len(self.valid), + len(self.extra)) + if self.error: + return '%s%s: ERROR! (valid=%i, missing=%i, different=%i, extra=%i, others=%i)' % \ + ('-' if self.negates else '', self.string, len(self.valid), len(self.missing), len(self.different), + len(self.extra), len(self.others)) + + return '%s%s: UNKOWN! (valid=%i, missing=%i, different=%i, extra=%i, others=%i)' % \ + ('-' if self.negates else '', self.string, len(self.valid), len(self.missing), len(self.different), + len(self.extra), len(self.others)) + + @property + def details(self): + ret = [] + if self.valid: + ret.append('valid=' + str(len(self.valid))) + for valid in self.valid: + ret.append(' ' * 4 + str(valid)) + if self.missing: + ret.append('missing=' + str(len(self.missing))) + for missing in self.missing: + ret.append(' ' * 4 + str(missing)) + if self.different: + ret.append('different=' + str(len(self.different))) + for different in self.different: + ret.append(' ' * 4 + str(different)) + if self.extra: + ret.append('extra=' + str(len(self.extra))) + for extra in self.extra: + ret.append(' ' * 4 + str(extra)) + if self.others: + ret.append('others=' + str(len(self.others))) + for other in self.others: + ret.append(' ' * 4 + str(other)) + return ret + + +class Results(list): + def assert_ok(self): + errors = [entry for entry in self if entry.error] + assert not errors + + +def files_and_ids(predicate=None): + files = [] + ids = [] + + for (dirpath, _, filenames) in os.walk(__location__): + if os.path.split(dirpath)[-1] == 'config': + continue + if dirpath == __location__: + dirpath_rel = '' + else: + dirpath_rel = os.path.relpath(dirpath, __location__) + for filename in filenames: + name, ext = os.path.splitext(filename) + filepath = os.path.join(dirpath_rel, filename) + if ext == '.yml' and (not predicate or predicate(filepath)): + files.append(filepath) + ids.append(os.path.join(dirpath_rel, name)) + + return files, ids + + +class TestYml(object): + """ + Run tests from yaml files. + Multiple input strings having same expected results can be chained. + Use $ marker to check inputs that should not match results. + """ + + options_re = re.compile(r'^([ +-]+)(.*)') + + def _get_unique_id(self, collection, base_id): + ret = base_id + i = 2 + while ret in collection: + suffix = "-" + str(i) + ret = base_id + suffix + i += 1 + return ret + + def pytest_generate_tests(self, metafunc): + if 'yml_test_case' in metafunc.fixturenames: + entries = [] + entry_ids = [] + entry_set = set() + + for filename, _ in zip(*files_and_ids()): + with open(os.path.join(__location__, filename), 'r', encoding='utf-8') as infile: + data = yaml.load(infile, OrderedDictYAMLLoader) + + last_expected = None + for string, expected in reversed(list(data.items())): + if expected is None: + data[string] = last_expected + else: + last_expected = expected + + default = None + try: + default = data['__default__'] + del data['__default__'] + except KeyError: + pass + + for string, expected in data.items(): + TestYml.set_default(expected, default) + string = TestYml.fix_encoding(string, expected) + + entries.append((filename, string, expected)) + unique_id = self._get_unique_id(entry_set, '[' + filename + '] ' + str(string)) + entry_set.add(unique_id) + entry_ids.append(unique_id) + + metafunc.parametrize('yml_test_case', entries, ids=entry_ids) + + @staticmethod + def set_default(expected, default): + if default: + for k, v in default.items(): + if k not in expected: + expected[k] = v + + @classmethod + def fix_encoding(cls, string, expected): + if six.PY2: + if isinstance(string, six.text_type): + string = string.encode('utf-8') + converts = [] + for k, v in expected.items(): + if isinstance(v, six.text_type): + v = v.encode('utf-8') + converts.append((k, v)) + for k, v in converts: + expected[k] = v + if not isinstance(string, str): + string = str(string) + return string + + def test_entry(self, yml_test_case): + filename, string, expected = yml_test_case + result = self.check_data(filename, string, expected) + assert not result.error + + def check_data(self, filename, string, expected): + entry = self.check(string, expected) + if entry.ok: + logger.debug('[%s] %s', filename, entry) + elif entry.warning: + logger.warning('[%s] %s', filename, entry) + elif entry.error: + logger.error('[%s] %s', filename, entry) + for line in entry.details: + logger.error('[%s] %s', filename, ' ' * 4 + line) + return entry + + def check(self, string, expected): + negates, global_, string = self.parse_token_options(string) + + options = expected.get('options') + if options is None: + options = {} + if not isinstance(options, dict): + options = parse_options(options) + try: + result = guessit(string, options) + except Exception as exc: + logger.error('[%s] Exception: %s', string, exc) + raise exc + + entry = EntryResult(string, negates) + + if global_: + self.check_global(string, result, entry) + + self.check_expected(result, expected, entry) + + return entry + + def parse_token_options(self, string): + matches = self.options_re.search(string) + negates = False + global_ = False + if matches: + string = matches.group(2) + for opt in matches.group(1): + if '-' in opt: + negates = True + if '+' in opt: + global_ = True + return negates, global_, string + + def check_global(self, string, result, entry): + global_span = [] + for result_matches in result.matches.values(): + for result_match in result_matches: + if not global_span: + global_span = list(result_match.span) + else: + if global_span[0] > result_match.span[0]: + global_span[0] = result_match.span[0] + if global_span[1] < result_match.span[1]: + global_span[1] = result_match.span[1] + if global_span and global_span[1] - global_span[0] < len(string): + entry.others.append("Match is not global") + + def is_same(self, value, expected): + values = set(value) if is_iterable(value) else set((value,)) + expecteds = set(expected) if is_iterable(expected) else set((expected,)) + if len(values) != len(expecteds): + return False + if isinstance(next(iter(values)), babelfish.Language): + # pylint: disable=no-member + expecteds = {babelfish.Language.fromguessit(expected) for expected in expecteds} + elif isinstance(next(iter(values)), babelfish.Country): + # pylint: disable=no-member + expecteds = {babelfish.Country.fromguessit(expected) for expected in expecteds} + return values == expecteds + + def check_expected(self, result, expected, entry): + if expected: + for expected_key, expected_value in expected.items(): + if expected_key and expected_key != 'options' and expected_value is not None: + negates_key, _, result_key = self.parse_token_options(expected_key) + if result_key in result.keys(): + if not self.is_same(result[result_key], expected_value): + if negates_key: + entry.valid.append((expected_key, expected_value)) + else: + entry.different.append((expected_key, expected_value, result[result_key])) + else: + if negates_key: + entry.different.append((expected_key, expected_value, result[result_key])) + else: + entry.valid.append((expected_key, expected_value)) + elif not negates_key: + entry.missing.append((expected_key, expected_value)) + + for result_key, result_value in result.items(): + if result_key not in expected.keys(): + entry.extra.append((result_key, result_value)) diff --git a/lib/guessit/test/various.yml b/lib/guessit/test/various.yml new file mode 100644 index 00000000..6fb58deb --- /dev/null +++ b/lib/guessit/test/various.yml @@ -0,0 +1,1199 @@ +? Movies/Fear and Loathing in Las Vegas (1998)/Fear.and.Loathing.in.Las.Vegas.720p.HDDVD.DTS.x264-ESiR.mkv +: type: movie + title: Fear and Loathing in Las Vegas + year: 1998 + screen_size: 720p + source: HD-DVD + audio_codec: DTS + video_codec: H.264 + release_group: ESiR + +? Series/Duckman/Duckman - 101 (01) - 20021107 - I, Duckman.avi +: type: episode + title: Duckman + season: 1 + episode: 1 + episode_title: I, Duckman + date: 2002-11-07 + +? Series/Neverwhere/Neverwhere.05.Down.Street.[tvu.org.ru].avi +: type: episode + title: Neverwhere + episode: 5 + episode_title: Down Street + website: tvu.org.ru + +? Neverwhere.05.Down.Street.[tvu.org.ru].avi +: type: episode + title: Neverwhere + episode: 5 + episode_title: Down Street + website: tvu.org.ru + +? Series/Breaking Bad/Minisodes/Breaking.Bad.(Minisodes).01.Good.Cop.Bad.Cop.WEBRip.XviD.avi +: type: episode + title: Breaking Bad + episode_format: Minisode + episode: 1 + episode_title: Good Cop Bad Cop + source: Web + other: Rip + video_codec: Xvid + +? Series/Kaamelott/Kaamelott - Livre V - Ep 23 - Le Forfait.avi +: type: episode + title: Kaamelott + episode: 23 + episode_title: Le Forfait + +? Movies/The Doors (1991)/09.03.08.The.Doors.(1991).BDRip.720p.AC3.X264-HiS@SiLUHD-English.[sharethefiles.com].mkv +: type: movie + title: The Doors + year: 1991 + date: 2008-03-09 + source: Blu-ray + screen_size: 720p + audio_codec: Dolby Digital + video_codec: H.264 + release_group: HiS@SiLUHD + language: english + website: sharethefiles.com + +? Movies/M.A.S.H. (1970)/MASH.(1970).[Divx.5.02][Dual-Subtitulos][DVDRip].ogm +: type: movie + title: MASH + year: 1970 + video_codec: DivX + source: DVD + other: [Dual Audio, Rip] + +? the.mentalist.501.hdtv-lol.mp4 +: type: episode + title: the mentalist + season: 5 + episode: 1 + source: HDTV + release_group: lol + +? the.simpsons.2401.hdtv-lol.mp4 +: type: episode + title: the simpsons + season: 24 + episode: 1 + source: HDTV + release_group: lol + +? Homeland.S02E01.HDTV.x264-EVOLVE.mp4 +: type: episode + title: Homeland + season: 2 + episode: 1 + source: HDTV + video_codec: H.264 + release_group: EVOLVE + +? /media/Band_of_Brothers-e01-Currahee.mkv +: type: episode + title: Band of Brothers + episode: 1 + episode_title: Currahee + +? /media/Band_of_Brothers-x02-We_Stand_Alone_Together.mkv +: type: episode + title: Band of Brothers + bonus: 2 + bonus_title: We Stand Alone Together + +? /movies/James_Bond-f21-Casino_Royale-x02-Stunts.mkv +: type: movie + title: Casino Royale + film_title: James Bond + film: 21 + bonus: 2 + bonus_title: Stunts + +? /TV Shows/new.girl.117.hdtv-lol.mp4 +: type: episode + title: new girl + season: 1 + episode: 17 + source: HDTV + release_group: lol + +? The.Office.(US).1x03.Health.Care.HDTV.XviD-LOL.avi +: type: episode + title: The Office + country: US + season: 1 + episode: 3 + episode_title: Health Care + source: HDTV + video_codec: Xvid + release_group: LOL + +? The_Insider-(1999)-x02-60_Minutes_Interview-1996.mp4 +: type: movie + title: The Insider + year: 1999 + bonus: 2 + bonus_title: 60 Minutes Interview-1996 + +? OSS_117--Cairo,_Nest_of_Spies.mkv +: type: movie + title: OSS 117 + alternative_title: Cairo, Nest of Spies + +? Rush.._Beyond_The_Lighted_Stage-x09-Between_Sun_and_Moon-2002_Hartford.mkv +: type: movie + title: Rush Beyond The Lighted Stage + bonus: 9 + bonus_title: Between Sun and Moon + year: 2002 + +? House.Hunters.International.S56E06.720p.hdtv.x264.mp4 +: type: episode + title: House Hunters International + season: 56 + episode: 6 + screen_size: 720p + source: HDTV + video_codec: H.264 + +? White.House.Down.2013.1080p.BluRay.DTS-HD.MA.5.1.x264-PublicHD.mkv +: type: movie + title: White House Down + year: 2013 + screen_size: 1080p + source: Blu-ray + audio_codec: DTS-HD + audio_profile: Master Audio + video_codec: H.264 + release_group: PublicHD + audio_channels: "5.1" + +? White.House.Down.2013.1080p.BluRay.DTSHD.MA.5.1.x264-PublicHD.mkv +: type: movie + title: White House Down + year: 2013 + screen_size: 1080p + source: Blu-ray + audio_codec: DTS-HD + audio_profile: Master Audio + video_codec: H.264 + release_group: PublicHD + audio_channels: "5.1" + +? Hostages.S01E01.Pilot.for.Air.720p.WEB-DL.DD5.1.H.264-NTb.nfo +: type: episode + title: Hostages + episode_title: Pilot for Air + season: 1 + episode: 1 + screen_size: 720p + source: Web + audio_channels: "5.1" + video_codec: H.264 + audio_codec: Dolby Digital + release_group: NTb + +? Despicable.Me.2.2013.1080p.BluRay.x264-VeDeTT.nfo +: type: movie + title: Despicable Me 2 + year: 2013 + screen_size: 1080p + source: Blu-ray + video_codec: H.264 + release_group: VeDeTT + +? Le Cinquieme Commando 1971 SUBFORCED FRENCH DVDRiP XViD AC3 Bandix.mkv +: type: movie + audio_codec: Dolby Digital + source: DVD + other: Rip + release_group: Bandix + subtitle_language: French + title: Le Cinquieme Commando + video_codec: Xvid + year: 1971 + +? Le Seigneur des Anneaux - La Communauté de l'Anneau - Version Longue - BDRip.mkv +: type: movie + title: Le Seigneur des Anneaux + source: Blu-ray + other: Rip + +? La petite bande (Michel Deville - 1983) VF PAL MP4 x264 AAC.mkv +: type: movie + audio_codec: AAC + language: French + title: La petite bande + video_codec: H.264 + year: 1983 + other: PAL + +? Retour de Flammes (Gregor Schnitzler 2003) FULL DVD.iso +: type: movie + source: DVD + title: Retour de Flammes + type: movie + year: 2003 + +? A.Common.Title.Special.2014.avi +: type: movie + year: 2014 + title: A Common Title Special + +? A.Common.Title.2014.Special.avi +: type: episode + year: 2014 + title: A Common Title + episode_title: Special + episode_details: Special + +? A.Common.Title.2014.Special.Edition.avi +: type: movie + year: 2014 + title: A Common Title + edition: Special + +? Downton.Abbey.2013.Christmas.Special.HDTV.x264-FoV.mp4 +: type: episode + year: 2013 + title: Downton Abbey + episode_title: Christmas Special + video_codec: H.264 + release_group: FoV + source: HDTV + episode_details: Special + +? Doctor_Who_2013_Christmas_Special.The_Time_of_The_Doctor.HD +: type: episode + title: Doctor Who + other: HD + episode_details: Special + episode_title: Christmas Special The Time of The Doctor + year: 2013 + +? Doctor Who 2005 50th Anniversary Special The Day of the Doctor 3.avi +: type: episode + title: Doctor Who + episode_details: Special + episode_title: 50th Anniversary Special The Day of the Doctor 3 + year: 2005 + +? Robot Chicken S06-Born Again Virgin Christmas Special HDTV x264.avi +: type: episode + title: Robot Chicken + source: HDTV + season: 6 + episode_title: Born Again Virgin Christmas Special + video_codec: H.264 + episode_details: Special + +? Wicked.Tuna.S03E00.Head.To.Tail.Special.HDTV.x264-YesTV +: type: episode + title: Wicked Tuna + episode_title: Head To Tail Special + release_group: YesTV + season: 3 + episode: 0 + video_codec: H.264 + source: HDTV + episode_details: Special + +? The.Voice.UK.S03E12.HDTV.x264-C4TV +: episode: 12 + video_codec: H.264 + source: HDTV + title: The Voice + release_group: C4TV + season: 3 + country: United Kingdom + type: episode + +? /tmp/star.trek.9/star.trek.9.mkv +: type: movie + title: star trek 9 + +? star.trek.9.mkv +: type: movie + title: star trek 9 + +? FlexGet.S01E02.TheName.HDTV.xvid +: episode: 2 + source: HDTV + season: 1 + title: FlexGet + episode_title: TheName + type: episode + video_codec: Xvid + +? FlexGet.S01E02.TheName.HDTV.xvid +: episode: 2 + source: HDTV + season: 1 + title: FlexGet + episode_title: TheName + type: episode + video_codec: Xvid + +? some.series.S03E14.Title.Here.720p +: episode: 14 + screen_size: 720p + season: 3 + title: some series + episode_title: Title Here + type: episode + +? '[the.group] Some.Series.S03E15.Title.Two.720p' +: episode: 15 + release_group: the.group + screen_size: 720p + season: 3 + title: Some Series + episode_title: Title Two + type: episode + +? 'HD 720p: Some series.S03E16.Title.Three' +: episode: 16 + other: HD + screen_size: 720p + season: 3 + title: Some series + episode_title: Title Three + type: episode + +? Something.Season.2.1of4.Ep.Title.HDTV.torrent +: episode_count: 4 + episode: 1 + source: HDTV + season: 2 + title: Something + episode_title: Title + type: episode + container: torrent + +? Show-A (US) - Episode Title S02E09 hdtv +: country: US + episode: 9 + source: HDTV + season: 2 + title: Show-A + type: episode + +? Jack's.Show.S03E01.blah.1080p +: episode: 1 + screen_size: 1080p + season: 3 + title: Jack's Show + episode_title: blah + type: episode + +? FlexGet.epic +: title: FlexGet epic + type: movie + +? FlexGet.Apt.1 +: title: FlexGet Apt 1 + type: movie + +? FlexGet.aptitude +: title: FlexGet aptitude + type: movie + +? FlexGet.Step1 +: title: FlexGet Step1 + type: movie + +? Movies/El Bosque Animado (1987)/El.Bosque.Animado.[Jose.Luis.Cuerda.1987].[Xvid-Dvdrip-720 * 432].avi +: source: DVD + other: Rip + screen_size: 720x432 + title: El Bosque Animado + video_codec: Xvid + year: 1987 + type: movie + +? Movies/El Bosque Animado (1987)/El.Bosque.Animado.[Jose.Luis.Cuerda.1987].[Xvid-Dvdrip-720x432].avi +: source: DVD + other: Rip + screen_size: 720x432 + title: El Bosque Animado + video_codec: Xvid + year: 1987 + type: movie + +? 2009.shoot.fruit.chan.multi.dvd9.pal +: source: DVD + language: mul + other: PAL + title: shoot fruit chan + type: movie + year: 2009 + +? 2009.shoot.fruit.chan.multi.dvd5.pal +: source: DVD + language: mul + other: PAL + title: shoot fruit chan + type: movie + year: 2009 + +? The.Flash.2014.S01E01.PREAIR.WEBRip.XviD-EVO.avi +: episode: 1 + source: Web + other: [Preair, Rip] + release_group: EVO + season: 1 + title: The Flash + type: episode + video_codec: Xvid + year: 2014 + +? Ice.Lake.Rebels.S01E06.Ice.Lake.Games.720p.HDTV.x264-DHD +: episode: 6 + source: HDTV + release_group: DHD + screen_size: 720p + season: 1 + title: Ice Lake Rebels + episode_title: Ice Lake Games + type: episode + video_codec: H.264 + +? The League - S06E10 - Epi Sexy.mkv +: episode: 10 + season: 6 + title: The League + episode_title: Epi Sexy + type: episode + +? Stay (2005) [1080p]/Stay.2005.1080p.BluRay.x264.YIFY.mp4 +: source: Blu-ray + release_group: YIFY + screen_size: 1080p + title: Stay + type: movie + video_codec: H.264 + year: 2005 + +? /media/live/A/Anger.Management.S02E82.720p.HDTV.X264-DIMENSION.mkv +: source: HDTV + release_group: DIMENSION + screen_size: 720p + title: Anger Management + type: episode + season: 2 + episode: 82 + video_codec: H.264 + +? "[Figmentos] Monster 34 - At the End of Darkness [781219F1].mkv" +: type: episode + release_group: Figmentos + title: Monster + episode: 34 + episode_title: At the End of Darkness + crc32: 781219F1 + +? Game.of.Thrones.S05E07.720p.HDTV-KILLERS.mkv +: type: episode + episode: 7 + source: HDTV + release_group: KILLERS + screen_size: 720p + season: 5 + title: Game of Thrones + +? Game.of.Thrones.S05E07.HDTV.720p-KILLERS.mkv +: type: episode + episode: 7 + source: HDTV + release_group: KILLERS + screen_size: 720p + season: 5 + title: Game of Thrones + +? Parks and Recreation - [04x12] - Ad Campaign.avi +: type: episode + title: Parks and Recreation + season: 4 + episode: 12 + episode_title: Ad Campaign + +? Star Trek Into Darkness (2013)/star.trek.into.darkness.2013.720p.web-dl.h264-publichd.mkv +: type: movie + title: Star Trek Into Darkness + year: 2013 + screen_size: 720p + source: Web + video_codec: H.264 + release_group: publichd + +? /var/medias/series/The Originals/Season 02/The.Originals.S02E15.720p.HDTV.X264-DIMENSION.mkv +: type: episode + title: The Originals + season: 2 + episode: 15 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: DIMENSION + +? Test.S01E01E07-FooBar-Group.avi +: container: avi + episode: + - 1 + - 7 + episode_title: FooBar-Group # Make sure it doesn't conflict with uuid + season: 1 + title: Test + type: episode + +? TEST.S01E02.2160p.NF.WEBRip.x264.DD5.1-ABC +: audio_channels: '5.1' + audio_codec: Dolby Digital + episode: 2 + source: Web + other: Rip + release_group: ABC + screen_size: 2160p + season: 1 + streaming_service: Netflix + title: TEST + type: episode + video_codec: H.264 + +? TEST.2015.12.30.720p.WEBRip.h264-ABC +: date: 2015-12-30 + source: Web + other: Rip + release_group: ABC + screen_size: 720p + title: TEST + type: episode + video_codec: H.264 + +? TEST.S01E10.24.1080p.NF.WEBRip.AAC2.0.x264-ABC +: audio_channels: '2.0' + audio_codec: AAC + episode: 10 + episode_title: '24' + source: Web + other: Rip + release_group: ABC + screen_size: 1080p + season: 1 + streaming_service: Netflix + title: TEST + type: episode + video_codec: H.264 + +? TEST.S01E10.24.1080p.NF.WEBRip.AAC2.0.x264-ABC +: audio_channels: '2.0' + audio_codec: AAC + episode: 10 + episode_title: '24' + source: Web + other: Rip + release_group: ABC + screen_size: 1080p + season: 1 + streaming_service: Netflix + title: TEST + type: episode + video_codec: H.264 + +? TEST.S01E10.24.1080p.NF.WEBRip.AAC.2.0.x264-ABC +: audio_channels: '2.0' + audio_codec: AAC + episode: 10 + episode_title: '24' + source: Web + other: Rip + release_group: ABC + screen_size: 1080p + season: 1 + streaming_service: Netflix + title: TEST + type: episode + video_codec: H.264 + +? TEST.S05E02.720p.iP.WEBRip.AAC2.0.H264-ABC +: audio_channels: '2.0' + audio_codec: AAC + episode: 2 + source: Web + other: Rip + release_group: ABC + screen_size: 720p + season: 5 + title: TEST + type: episode + video_codec: H.264 + +? TEST.S03E07.720p.WEBRip.AAC2.0.x264-ABC +: audio_channels: '2.0' + audio_codec: AAC + episode: 7 + source: Web + other: Rip + release_group: ABC + screen_size: 720p + season: 3 + title: TEST + type: episode + video_codec: H.264 + +? TEST.S15E15.24.1080p.FREE.WEBRip.AAC2.0.x264-ABC +: audio_channels: '2.0' + audio_codec: AAC + episode: 15 + episode_title: '24' + source: Web + other: Rip + release_group: ABC + screen_size: 1080p + season: 15 + title: TEST + type: episode + video_codec: H.264 + +? TEST.S11E11.24.720p.ETV.WEBRip.AAC2.0.x264-ABC +: audio_channels: '2.0' + audio_codec: AAC + episode: 11 + episode_title: '24' + source: Web + other: Rip + release_group: ABC + screen_size: 720p + season: 11 + title: TEST + type: episode + video_codec: H.264 + +? TEST.2015.1080p.HC.WEBRip.x264.AAC2.0-ABC +: audio_channels: '2.0' + audio_codec: AAC + source: Web + other: Rip + release_group: ABC + screen_size: 1080p + title: TEST + type: movie + video_codec: H.264 + year: 2015 + +? TEST.2015.1080p.3D.BluRay.Half-SBS.x264.DTS-HD.MA.7.1-ABC +: audio_channels: '7.1' + audio_codec: DTS-HD + audio_profile: Master Audio + source: Blu-ray + other: 3D + release_group: ABC + screen_size: 1080p + title: TEST + type: movie + video_codec: H.264 + year: 2015 + +? TEST.2015.1080p.3D.BluRay.Half-OU.x264.DTS-HD.MA.7.1-ABC +: audio_channels: '7.1' + audio_codec: DTS-HD + audio_profile: Master Audio + source: Blu-ray + other: 3D + release_group: ABC + screen_size: 1080p + title: TEST + type: movie + video_codec: H.264 + year: 2015 + +? TEST.2015.1080p.3D.BluRay.Half-OU.x264.DTS-HD.MA.TrueHD.7.1.Atmos-ABC +: audio_channels: '7.1' + audio_codec: + - DTS-HD + - Dolby TrueHD + - Dolby Atmos + audio_profile: Master Audio + source: Blu-ray + other: 3D + release_group: ABC + screen_size: 1080p + title: TEST + type: movie + video_codec: H.264 + year: 2015 + +? TEST.2015.1080p.3D.BluRay.Half-SBS.x264.DTS-HD.MA.TrueHD.7.1.Atmos-ABC +: audio_channels: '7.1' + audio_codec: + - DTS-HD + - Dolby TrueHD + - Dolby Atmos + audio_profile: Master Audio + source: Blu-ray + other: 3D + release_group: ABC + screen_size: 1080p + title: TEST + type: movie + video_codec: H.264 + year: 2015 + +? TEST.2015.1080p.BluRay.REMUX.AVC.DTS-HD.MA.TrueHD.7.1.Atmos-ABC +: audio_channels: '7.1' + audio_codec: + - DTS-HD + - Dolby TrueHD + - Dolby Atmos + audio_profile: Master Audio + source: Blu-ray + other: Remux + release_group: ABC + screen_size: 1080p + title: TEST + type: movie + year: 2015 + +? Gangs of New York 2002 REMASTERED 1080p BluRay x264-AVCHD +: source: Blu-ray + edition: Remastered + screen_size: 1080p + title: Gangs of New York + type: movie + video_codec: H.264 + video_profile: Advanced Video Codec High Definition + year: 2002 + +? Peep.Show.S06E02.DVDrip.x264-faks86.mkv +: container: mkv + episode: 2 + source: DVD + other: Rip + release_group: faks86 + season: 6 + title: Peep Show + type: episode + video_codec: H.264 + +# Episode title is indeed 'October 8, 2014' +# https://thetvdb.com/?tab=episode&seriesid=82483&seasonid=569935&id=4997362&lid=7 +? The Soup - 11x41 - October 8, 2014.mp4 +: container: mp4 + episode: 41 + episode_title: October 8, 2014 + season: 11 + title: The Soup + type: episode + +? Red.Rock.S02E59.WEB-DLx264-JIVE +: episode: 59 + season: 2 + source: Web + release_group: JIVE + title: Red Rock + type: episode + video_codec: H.264 + +? Pawn.Stars.S12E31.Deals.On.Wheels.PDTVx264-JIVE +: episode: 31 + episode_title: Deals On Wheels + season: 12 + source: Digital TV + release_group: JIVE + title: Pawn Stars + type: episode + video_codec: H.264 + +? Duck.Dynasty.S09E09.Van.He-llsing.HDTVx264-JIVE +: episode: 9 + episode_title: Van He-llsing + season: 9 + source: HDTV + release_group: JIVE + title: Duck Dynasty + type: episode + video_codec: H.264 + +? ATKExotics.16.01.24.Ava.Alba.Watersports.XXX.1080p.MP4-KTR +: title: ATKExotics + episode_title: Ava Alba Watersports + other: XXX + screen_size: 1080p + container: mp4 + release_group: KTR + type: episode + +? PutaLocura.15.12.22.Spanish.Luzzy.XXX.720p.MP4-oRo +: title: PutaLocura + episode_title: Spanish Luzzy + other: XXX + screen_size: 720p + container: mp4 + release_group: oRo + type: episode + +? French Maid Services - Lola At Your Service WEB-DL SPLIT SCENES MP4-RARBG +: title: French Maid Services + alternative_title: Lola At Your Service + source: Web + container: mp4 + release_group: RARBG + type: movie + +? French Maid Services - Lola At Your Service - Marc Dorcel WEB-DL SPLIT SCENES MP4-RARBG +: title: French Maid Services + alternative_title: [Lola At Your Service, Marc Dorcel] + source: Web + container: mp4 + release_group: RARBG + type: movie + +? PlayboyPlus.com_16.01.23.Eleni.Corfiate.Playboy.Romania.XXX.iMAGESET-OHRLY +: episode_title: Eleni Corfiate Playboy Romania + other: XXX + type: episode + +? TeenPornoPass - Anna - Beautiful Ass Deep Penetrated 720p mp4 +: title: TeenPornoPass + alternative_title: + - Anna + - Beautiful Ass Deep Penetrated + screen_size: 720p + container: mp4 + type: movie + +? SexInJeans.Gina.Gerson.Super.Nasty.Asshole.Pounding.With.Gina.In.Jeans.A.Devil.In.Denim.The.Finest.Ass.Fuck.Frolicking.mp4 +: title: SexInJeans Gina Gerson Super Nasty Asshole Pounding With Gina In Jeans A Devil In Denim The Finest Ass Fuck Frolicking + container: mp4 + type: movie + +? TNA Impact Wrestling HDTV 2017-06-22 720p H264 AVCHD-SC-SDH +: title: TNA Impact Wrestling + source: HDTV + date: 2017-06-22 + screen_size: 720p + video_codec: H.264 + video_profile: + - Advanced Video Codec High Definition + - Scalable Video Coding + release_group: SDH + type: episode + +? Katy Perry - Pepsi & Billboard Summer Beats Concert Series 2012 1080i HDTV 20 Mbps DD2.0 MPEG2-TrollHD.ts +: title: Katy Perry + alternative_title: Pepsi & Billboard Summer Beats Concert Series + year: 2012 + screen_size: 1080i + source: HDTV + video_bit_rate: 20Mbps + audio_codec: Dolby Digital + audio_channels: '2.0' + video_codec: MPEG-2 + release_group: TrollHD + container: ts + +? Justin Timberlake - MTV Video Music Awards 2013 1080i 32 Mbps DTS-HD 5.1.ts +: title: Justin Timberlake + alternative_title: MTV Video Music Awards + year: 2013 + screen_size: 1080i + video_bit_rate: 32Mbps + audio_codec: DTS-HD + audio_channels: '5.1' + container: ts + type: movie + +? Chuck Berry The Very Best Of Chuck Berry(2010)[320 Kbps] +: title: Chuck Berry The Very Best Of Chuck Berry + year: 2010 + audio_bit_rate: 320Kbps + type: movie + +? Title Name [480p][1.5Mbps][.mp4] +: title: Title Name + screen_size: 480p + video_bit_rate: 1.5Mbps + container: mp4 + type: movie + +? This.is.Us +: options: --no-default-config + title: This is Us + type: movie + +? This.is.Us +: options: --excludes country + title: This is Us + type: movie + +? MotoGP.2016x03.USA.Race.BTSportHD.1080p25 +: title: MotoGP + season: 2016 + year: 2016 + episode: 3 + screen_size: 1080p + frame_rate: 25fps + type: episode + +? BBC.Earth.South.Pacific.2010.D2.1080p.24p.BD25.DTS-HD +: title: BBC Earth South Pacific + year: 2010 + screen_size: 1080p + frame_rate: 24fps + source: Blu-ray + audio_codec: DTS-HD + type: movie + +? Mr Robot - S03E01 - eps3 0 power-saver-mode h (1080p AMZN WEB-DL x265 HEVC 10bit EAC3 6.0 RCVR).mkv +: title: Mr Robot + season: 3 + episode: 1 + episode_title: eps3 0 power-saver-mode h + screen_size: 1080p + streaming_service: Amazon Prime + source: Web + video_codec: H.265 + video_profile: High Efficiency Video Coding + color_depth: 10-bit + audio_codec: Dolby Digital Plus + audio_channels: '5.1' + release_group: RCVR + container: mkv + type: episode + +? Panorama.15-05-2018.Web-DL.540p.H264.AAC.Subs.mp4 +: title: Panorama + date: 2018-05-15 + source: Web + screen_size: 540p + video_codec: H.264 + audio_codec: AAC + subtitle_language: und + container: mp4 + type: episode + +? Shaolin 2011.720p.BluRay.x264-x0r.mkv +: title: Shaolin + year: 2011 + screen_size: 720p + source: Blu-ray + video_codec: H.264 + release_group: x0r + container: mkv + type: movie + +? '[ Engineering Catastrophes S02E10 1080p AMZN WEB-DL DD+ 2.0 x264-TrollHD ]' +: title: Engineering Catastrophes + season: 2 + episode: 10 + screen_size: 1080p + streaming_service: Amazon Prime + source: Web + audio_codec: Dolby Digital Plus + audio_channels: '2.0' + video_codec: H.264 + release_group: TrollHD + type: episode + +? A Very Harold & Kumar 3D Christmas (2011).mkv +: title: A Very Harold & Kumar 3D Christmas + year: 2011 + container: mkv + type: movie + +? Cleveland.Hustles.S01E03.Downward.Dogs.and.Proper.Pigs.720p.HDTV.x264-W4F +: title: Cleveland Hustles + season: 1 + episode: 3 + episode_title: Downward Dogs and Proper Pigs + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: W4F + type: episode + +? Pawn.Stars.S12E20.The.Pawn.Awakens.REAL.READ.NFO.720p.HDTV.x264-DHD +: title: Pawn Stars + season: 12 + episode: 20 + episode_title: The Pawn Awakens + other: + - Proper + - Read NFO + proper_count: 2 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: DHD + type: episode + +? Pawn.Stars.S12E22.Racing.Revolution.REAL.720p.HDTV.x264-DHD +: title: Pawn Stars + season: 12 + episode: 22 + episode_title: Racing Revolution + other: Proper + proper_count: 2 + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: DHD + type: episode + +? Luksusfellen.S18E02.REAL.NORWEGiAN.720p.WEB.h264-NORPiLT +: title: Luksusfellen + season: 18 + episode: 2 + other: Proper + proper_count: 2 + language: Norwegian + screen_size: 720p + source: Web + video_codec: H.264 + release_group: NORPiLT + type: episode + +? The.Exorcist.S02E07.REAL.FRENCH.720p.HDTV.x264-SH0W +: title: The Exorcist + season: 2 + episode: 7 + other: Proper + proper_count: 2 + language: fr + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: SH0W + type: episode + +? Outrageous.Acts.of.Science.S05E02.Is.This.for.Real.720p.HDTV.x264-DHD +: title: Outrageous Acts of Science + season: 5 + episode: 2 +# corner case +# episode_title: Is This for Real + screen_size: 720p + source: HDTV + video_codec: H.264 + release_group: DHD + type: episode + +? How.the.Universe.Works.S06E08.Strange.Lives.of.Dwarf.Planets.REAL.720p.WEB.x264-DHD +: title: How the Universe Works + season: 6 + episode: 8 + episode_title: Strange Lives of Dwarf Planets + other: Proper + proper_count: 2 + screen_size: 720p + source: Web + video_codec: H.264 + release_group: DHD + type: episode + +? Vampirina.S01E16.REAL.HDTV.x264-W4F +: title: Vampirina + season: 1 + episode: 16 + other: Proper + proper_count: 2 + source: HDTV + video_codec: H.264 + release_group: W4F + type: episode + +? Test.S01E16.Some Real Episode Title.HDTV.x264-W4F +: title: Test + season: 1 + episode: 16 + episode_title: Some Real Episode Title + source: HDTV + video_codec: H.264 + release_group: W4F + type: episode + +? NOS4A2.S01E01.The.Shorter.Way.REPACK.720p.AMZN.WEB-DL.DDP5.1.H.264-NTG.mkv +: title: NOS4A2 + season: 1 + episode: 1 + episode_title: The Shorter Way + other: Proper + proper_count: 1 + screen_size: 720p + streaming_service: Amazon Prime + source: Web + audio_codec: Dolby Digital Plus + audio_channels: '5.1' + video_codec: H.264 + release_group: NTG + container: mkv + type: episode + +? Star Trek DS9 Ep 2x03 The Siege (Part III) +: title: Star Trek DS9 + season: 2 + episode: 3 + episode_title: The Siege + part: 3 + type: episode + +? The.Red.Line.S01E01 +: title: The Red Line + season: 1 + episode: 1 + type: episode + +? Show.S01E01.WEB.x264-METCON.mkv +: title: Show + season: 1 + episode: 1 + source: Web + video_codec: H.264 + release_group: METCON + container: mkv + type: episode + +? Show.S01E01.WEB.x264-TCMEON.mkv +: title: Show + season: 1 + episode: 1 + source: Web + video_codec: H.264 + release_group: TCMEON + container: mkv + type: episode + +? Show.S01E01.WEB.x264-MEONTC.mkv +: title: Show + season: 1 + episode: 1 + source: Web + video_codec: H.264 + release_group: MEONTC + container: mkv + type: episode + +? '[TorrentCouch.com].Westworld.S02.Complete.720p.WEB-DL.x264.[MP4].[5.3GB].[Season.2.Full]/[TorrentCouch.com].Westworld.S02E03.720p.WEB-DL.x264.mp4' +: website: TorrentCouch.com + title: Westworld + season: 2 + other: Complete + screen_size: 720p + source: Web + video_codec: H.264 + container: mp4 + size: 5.3GB + episode: 3 + type: episode + +? Vita.&.Virginia.2018.720p.H.264.YTS.LT.mp4 +: title: Vita & Virginia + year: 2018 + screen_size: 720p + video_codec: H.264 + release_group: YTS.LT + container: mp4 + type: movie \ No newline at end of file diff --git a/lib/guessit/tlds-alpha-by-domain.txt b/lib/guessit/tlds-alpha-by-domain.txt new file mode 100644 index 00000000..280c794c --- /dev/null +++ b/lib/guessit/tlds-alpha-by-domain.txt @@ -0,0 +1,341 @@ +# Version 2013112900, Last Updated Fri Nov 29 07:07:01 2013 UTC +AC +AD +AE +AERO +AF +AG +AI +AL +AM +AN +AO +AQ +AR +ARPA +AS +ASIA +AT +AU +AW +AX +AZ +BA +BB +BD +BE +BF +BG +BH +BI +BIKE +BIZ +BJ +BM +BN +BO +BR +BS +BT +BV +BW +BY +BZ +CA +CAMERA +CAT +CC +CD +CF +CG +CH +CI +CK +CL +CLOTHING +CM +CN +CO +COM +CONSTRUCTION +CONTRACTORS +COOP +CR +CU +CV +CW +CX +CY +CZ +DE +DIAMONDS +DIRECTORY +DJ +DK +DM +DO +DZ +EC +EDU +EE +EG +ENTERPRISES +EQUIPMENT +ER +ES +ESTATE +ET +EU +FI +FJ +FK +FM +FO +FR +GA +GALLERY +GB +GD +GE +GF +GG +GH +GI +GL +GM +GN +GOV +GP +GQ +GR +GRAPHICS +GS +GT +GU +GURU +GW +GY +HK +HM +HN +HOLDINGS +HR +HT +HU +ID +IE +IL +IM +IN +INFO +INT +IO +IQ +IR +IS +IT +JE +JM +JO +JOBS +JP +KE +KG +KH +KI +KITCHEN +KM +KN +KP +KR +KW +KY +KZ +LA +LAND +LB +LC +LI +LIGHTING +LK +LR +LS +LT +LU +LV +LY +MA +MC +MD +ME +MG +MH +MIL +MK +ML +MM +MN +MO +MOBI +MP +MQ +MR +MS +MT +MU +MUSEUM +MV +MW +MX +MY +MZ +NA +NAME +NC +NE +NET +NF +NG +NI +NL +NO +NP +NR +NU +NZ +OM +ORG +PA +PE +PF +PG +PH +PHOTOGRAPHY +PK +PL +PLUMBING +PM +PN +POST +PR +PRO +PS +PT +PW +PY +QA +RE +RO +RS +RU +RW +SA +SB +SC +SD +SE +SEXY +SG +SH +SI +SINGLES +SJ +SK +SL +SM +SN +SO +SR +ST +SU +SV +SX +SY +SZ +TATTOO +TC +TD +TECHNOLOGY +TEL +TF +TG +TH +TIPS +TJ +TK +TL +TM +TN +TO +TODAY +TP +TR +TRAVEL +TT +TV +TW +TZ +UA +UG +UK +US +UY +UZ +VA +VC +VE +VENTURES +VG +VI +VN +VOYAGE +VU +WF +WS +XN--3E0B707E +XN--45BRJ9C +XN--80AO21A +XN--80ASEHDB +XN--80ASWG +XN--90A3AC +XN--CLCHC0EA0B2G2A9GCD +XN--FIQS8S +XN--FIQZ9S +XN--FPCRJ9C3D +XN--FZC2C9E2C +XN--GECRJ9C +XN--H2BRJ9C +XN--J1AMH +XN--J6W193G +XN--KPRW13D +XN--KPRY57D +XN--L1ACC +XN--LGBBAT1AD8J +XN--MGB9AWBF +XN--MGBA3A4F16A +XN--MGBAAM7A8H +XN--MGBAYH7GPA +XN--MGBBH1A71E +XN--MGBC0A9AZCG +XN--MGBERP4A5D4AR +XN--MGBX4CD0AB +XN--NGBC5AZD +XN--O3CW4H +XN--OGBPF8FL +XN--P1AI +XN--PGBS0DH +XN--Q9JYB4C +XN--S9BRJ9C +XN--UNUP4Y +XN--WGBH1C +XN--WGBL6A +XN--XKC2AL3HYE2A +XN--XKC2DL3A5EE0H +XN--YFRO4I67O +XN--YGBI2AMMX +XXX +YE +YT +ZA +ZM +ZW diff --git a/lib/guessit/yamlutils.py b/lib/guessit/yamlutils.py new file mode 100644 index 00000000..d04be641 --- /dev/null +++ b/lib/guessit/yamlutils.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Options +""" + +try: + from collections import OrderedDict +except ImportError: # pragma: no-cover + from ordereddict import OrderedDict # pylint:disable=import-error +import babelfish + +import yaml # pylint:disable=wrong-import-order + +from .rules.common.quantity import BitRate, FrameRate, Size + + +class OrderedDictYAMLLoader(yaml.SafeLoader): + """ + A YAML loader that loads mappings into ordered dictionaries. + From https://gist.github.com/enaeseth/844388 + """ + + def __init__(self, *args, **kwargs): + yaml.SafeLoader.__init__(self, *args, **kwargs) + + self.add_constructor(u'tag:yaml.org,2002:map', type(self).construct_yaml_map) + self.add_constructor(u'tag:yaml.org,2002:omap', type(self).construct_yaml_map) + + def construct_yaml_map(self, node): + data = OrderedDict() + yield data + value = self.construct_mapping(node) + data.update(value) + + def construct_mapping(self, node, deep=False): + if isinstance(node, yaml.MappingNode): + self.flatten_mapping(node) + else: # pragma: no cover + raise yaml.constructor.ConstructorError(None, None, + 'expected a mapping node, but found %s' % node.id, node.start_mark) + + mapping = OrderedDict() + for key_node, value_node in node.value: + key = self.construct_object(key_node, deep=deep) + try: + hash(key) + except TypeError as exc: # pragma: no cover + raise yaml.constructor.ConstructorError('while constructing a mapping', + node.start_mark, 'found unacceptable key (%s)' + % exc, key_node.start_mark) + value = self.construct_object(value_node, deep=deep) + mapping[key] = value + return mapping + + +class CustomDumper(yaml.SafeDumper): + """ + Custom YAML Dumper. + """ + pass # pylint:disable=unnecessary-pass + + +def default_representer(dumper, data): + """Default representer""" + return dumper.represent_str(str(data)) + + +CustomDumper.add_representer(babelfish.Language, default_representer) +CustomDumper.add_representer(babelfish.Country, default_representer) +CustomDumper.add_representer(BitRate, default_representer) +CustomDumper.add_representer(FrameRate, default_representer) +CustomDumper.add_representer(Size, default_representer) + + +def ordered_dict_representer(dumper, data): + """OrderedDict representer""" + return dumper.represent_mapping('tag:yaml.org,2002:map', data.items()) + + +CustomDumper.add_representer(OrderedDict, ordered_dict_representer) diff --git a/lib/libtorrent.pyd b/lib/libtorrent.pyd deleted file mode 100644 index 1068c833341f667f68877729fcf5bc1eadfc9e03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2427392 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ⅆ{3&vgcI2k61_#zz1mP81eW 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�mEqMv5k>RSY<k`rDObX4MLE?Lrb2q6S=GMZ@ZhFI(Bj%-D zo_bRIaqW;0`a~IQv9(JAd1>!*z!(KB+4*)?_47b*y?oY<&6g5SOwK5Y8(qYkeBOw) zh{TMxQ6YMt7V|h*Vu~rU(Am{>KTaYjim&FLZNwwQ^wy`&LpX~~Pq<)>Y2!1=$#;A_ zkRq;u4sY_QAI`=5u~A)5GJBKktWkYBxmNjGjX<09@QU}v^;R4Ek}mMgRzY`0#pGG@ z)TDm9Q|75jPvHBzWS;z2O4VtEL_}1O?eKpq!CyPd-<9p}ikpatw<Q=Lt`ak})%ED7 zg67CFl3&-Pc~m%D!K$j~33^=I<A^#N5~}-YewB2HD)=GDf{3@YW|u7Unhyk7IJ%Bh zHQH@9G}8C!$zHGg6F7#%<XHk~;6n&oz8+&q5tIy_52=;YPL{D)mhpkR2v-}}`et+q z8$u<G*xW@|QF^_D`cUy2S(=g-^}Rh}$t7<#iMQoY{b<h0ww)&S>;<|2VRF9D#Am0O z-tI)Fl~pHfZI;m@tH}#lbUmY46x32MJ``~kyp}POA_2xRw)U9m<vwbzy<-n+KUMug zB8YFz2^Xv~<*bFy%tKQ#*<Qt}YeVG(<-bF(eEtT(#8qOh)Ay5;k%U0ws6bbCpsQz~ ztdoq;ON6G`!fTjAI`Xz2(((*?gVC~jY?QbLuUDVE538y^Yt?JQJxM!(h^?%oly|DV z>`5dOV#u5$c{c4Um;D;k^L2gveUFUqm*7t%sO37h|4Rw?GxA9D1+^z@g>}|SGn74x z2V`!$XIpZSdYcAjZrj3bCv(ry&x75`3srC~ahc2r9g%Ztu#PLud2WbX+~ga)haX>$ z8|Nx2S-yd|NkyRzEK*BPfj02Jfp)Dx(+X8nWg$8<T&t#!IH66={euarm>+%UH;+(L z^U%`XPfV5${A6>8uEfB4oy}aMqDR_heJ-VPfcFAEC<;%2Cr2LyxEtW^c;JxWPh>y5 z`JN`8u`q}KBMZc3>%7cu<K_B?k7|LV!8U}`Cf<7II}~GA@r_d=KFr}nK8W{b(oull zehTohrw2af6yQx%J1y`}_^`vcLDYIyn|k%N+u_u*WN|&wqVjA}*||+=dH3#!arB-e z$%$mjR126lZ3yoIHG=iY=?$a{MJC?IcpriIb}bOcwMs7V;3KiYaBNoPda|_vHw;8N z4qRme|5H-~byIirZff8+Hsz+NzCBG9VIYCr_k`B+ipc)dXoa_4i8Mj(*8JyCHR-2u z5tN>vuIkWURReKV<q|r?GOzum)J773;|iwcrZ}LaH^S|W4Kj+rF-rmyf#cy}_4-Zl zgv^`k6UEthc%YT`G;2O2IEyd~^h14!?e9>1>F^cJQ0C4MyN;DDCgHa#{rW#t!UY<7 zD3zw0mGpILNsm)07ps6%xN;N#tI?+i0~?9>=c@iA6k9$1_E!<tE09F}`G<VgK1W&r zyHP!X3W+21yW9C=n<oyCNVDqQrh#v>1im|Ghqm`+v71z1ehW>~S#H*o<%T3V5r30U z-6oS~X2`}WW|2Eo&`fzrYW+7{eoV64td=&KC&?E2C1Avy^xQdOMCzq}`!9JtRkiJq z{x(ZqLWc9^N7CQ5Q2tF6U!g8B``i5%{UszwE0Is0(_J2EcKPr;Y{b>~X_ROB+^nYS z4z$weZrT*LOgVp=eM;0{cmrEQRo~I�d4U`dh<^$gOY!7s^BVZ1U+4bJC|iqlRAp zs67e}m}dOP15P|=i79=p(3Sl>nFt`F$rISX*hMrZT7QJh?uO*aLQ$}k`6U_WEOUPK zg#6B%Z`!%8#jqzhZ;5SYS#o_|MMAhThafS^r&jS^BGI};e=*S>Y;a8Se*|7!a}Z>r zQ3!*C3r3{E*(E`QV?nf{FP6G1Vo`+`Mk8#6mo+945240R+Br?v#ahOU-y2$OT8AUC zD=KvhQ!nv=;Yn=jK0bjuU#y6a2fRcgIRA%uz<;jS-gBqK12zGxAB(fU84q}gX>M!U za*6^jS(|l;C5|VhJm&6iPoHS#Qi{{xmtvvv4Fw0r3K~Vu>ODH*gE2leeX~iNiObvj zt)`=KVFbT4QY_;j{-R8FBPrS=#u~;=cA?=rJvX`+yYwd=6w{OMTu6ApgvE9pppgzn zqYH|*`ai)M_+P-XR-1qh?0?*Oi1`()O`i9hUiVKW%&>_Lj`H(k1td^V?Lezchjoh2 zD07Iab)K<v-d=^CV1<`0hhfh{{jh-k)bYUIqj9wyI475<3AMqA*qv;2Sq<W{+$o2X z+Y$lla)YDg22w88E=Aj|qOza_$}LB~$`neGdC$$Bqw!D2RpvsuvsZuq)z|FLKcf9{ zW_umd9|Bq=OP}yG>jH?!>*(DdU5@@xZlEq_b;&Fm?T@jn3AEPjucYmsdH50Snpg4o z`@2K^d{82Wy_T3Fju#4_CIEpxU3vl#B*P2Lxu;fQ2$_(-q55+|Uwf(#G^-E%Z>#U@ zU0t^>2PfeVk|q3s@N(bK11%por3V&>fffjGND$;ACOY7@l{=Vfy&i%qV5WGsf7F8} zn5H>82Es<T)xU%id))(x)L1`Id~e$6n&oUJ1aw(lGnXN4!uLQkM8`DY)2Cps&<e7v z7IRt1o}FJl3u4dhHCUe^Dl<&*((`oi1n*jz$!PF|o0gct6K+Cf*b_W~r}NDk(clUA z-DjxKU#NN$t`UQT?(2{V@9q`Cucr^D-;Wx$8;eFu`C%s1Mj@irZYSVZdsMMsEBv9z zR*4Vv^}_K;XYx}~K6|-&f}KWC*1O!#;>!g)NB3|J(0L<4xCiLkV12|aKd2dkOhT|0 zbHhfoHFIXi6(Xnq4i{-mVi16;pP7a3r%>46>3TVtqFX7Nhpq@y_bz|uY^Esl?Kx`G z9&3W|1B!1};`0&Rmbg|466+^n#ko?KnxB=y8i?ghv+}llC5|KN&j;vI!3k)n#9A(k zLX1OLEjUi?xqyf!hok*86LUhWEMgZGd;G*;#OZY|0(*t3^hGO82caer^!r{%GT#=1 zy_&*xm>?V~n?*Cf3+@J-w#6Um0=>G%TEsQE?~GmRUG89fIfN!XlP4R;WcXT{_AWPZ zIMp0F;(DbPE|CRl6=R3LF?oWfM!ihhmAhlha7IYQ5Q$=S&etHV>IJEzDT?uD#>+WC zI{ozb#>+F8>%C0>ZMpBq+6^z;2rZW@I*v?fYBMG*avE|13)QG|U?36QMB1a>>x39{ zi%9f3N?@eER%kiv4E?>Qc3@8-06J%ohyZpM>gH2ER*V)?gL&>_EQHt=q^kY37_8`! zM4CP8sW8x|wDpKt;nP@!-^5kW9W{jyB7i_gr18~F55M+_q^Zoge1ZuomQ3<wgC_$i z`i#_FT$;)3#+%=oZ~DlaIWVGxKAkNZDDBO3F>m3t@Mk(>%<!=~gr0JO1g8rdeoX8y zweHi>A}T~VkTkUh(3qi+duOI_$kU{y18NZxP&q1$ZrAeP!BZNO+ys8fb;6Dj@`xSy z+6ynda9OCJCB4b>w}nY+{%a>9iS?dtS8$K4?ylYKx<LAF&whAWT2B0usMCFnZek6n zAR0~WDCPv>OgL$Y*27i=tehz`2w~xE(MK@0%G@%zt+o+qgZt`2ry|B5{ccGlDi>!o z?|qSlf-vfC`7p_8<hs-Ao&x64FB7{Ep~CZ>L+>TnShA<i|E0kA`P(u{-nM%p$-*3V zCw37wFtpGe%5}ECPXB37Js@Qyw21osPNt+T-7AA9goURb%k70F;9NM+0u`dy012li zPa&4scBKvf9(0ScNWwT!Nk+$I8tVz<gT#p|68B#h!%A4_Hg44=)87*hX0?@zIq23g zE*xl!K`t`BEJ{Bqbso`E(GtqV1ewwU!D=1y)9Xy^nt^@2uAQd-NzbuiBLG;Xtms2L zvZAkv%+^}b=i*m%V01-S|2=C!sG!MO(P!`iIb}tq!0A^sg4T?92h54NqOkK{ThS)A zXrdfZ+4P&+X>3Kg-LaxgvZ7L;XGQ-cA7U#ioYko-IxxDT+qdf#-FHu9;5|nM_FmCf z^os6Nzm+n2MGx(WuINBn(Qu$yFRIDtvYrd4F%sa!7ImcbL>85xs(MlN0Kc}VLhGZ8 z+U&Cy)vbl)&W=m~_N?XK<b3isMc48^jCVA2Yb_6nzHV!px`dvxmJkm0CN*M)1c%;| z@oJ+H&Em-Q3jfJGcQIkfG@8OT$i_>Xfr!6beS*1#X{_W_`Lgr7Wxwqd8$`W%z5=*; zE$>!uP!<HkPq<rc5>1E%f7xbQMOqP`qb=#_>)ldSTuUjZX=yG<9BpY@TuV!PwG`|u z?WIXBEq#nttofZF^gzZQ3@k}74(OPW!$^S^d~k`a{EKCQavcZq5*GPxQJn60id24m zj9VQ>qSl;lm&lHvBNsN6r|I4bkGI^l>V4j*zfNVO8Qk8(59Syyqu7qs5So$n&j)WV zLnz;hfV*s*PxYV9x=CsqvJB5qIoQHrfP&5!-AdWL(&o+5rmbTodCSWBk<Az@r_3Xv z+)@-Lq1<~z{<R_hx{!Z;$iE@vf0n@0A^!^1KeKlflvVI^D_|F%B??NF#@-55`vx~~ zLZH;UsvR-{?}qpgDE~%EP}+$QAYAaQdZtFM|DK($<sVbo7;h0Sqc7RNsK0tQZ^KYK zZ<mmduy=w_U4iyZl6y^1k=I1XgFr^&MNd!%aQ_Z_YbYi1msAzmrJ2wtNi;6HirYXr zaSK=TLV-Kg@>j(rnUhpJvlsIqnsyz2^vQ_WU^S7H*{61j5+2881UwXMQH8o-3%{RK zM_<x<o>B7qr;|mxa~sl~I%;U?&e;+F8Ww_Bp~g<1ItL|hq@c@HeI<V_ujyyiv#;Pn z-DXY&xqyGnqtRH6ANB^QUiCKDa)|}bq%eH!Cd~sa+Y6M(<b8^0)Dy~5p=M!kMi~OI zv<8U9gZALuHqkHy8*Ucul54dju4fW;N(<&nbwPa%@4l6`72am^h9W1M7WYoFN4)z8 zFr{w05#2~ZlV`;~D!alL3kYUk=5@hdnP*nwFe)PnE;-zoM8M$*%j!e`<Woh_@B7T} zuH|yjO3lJoWx;BJAB8nSmz6a`8^;<>+Nsy9?PY7t=0R=eg}irKYqv@5z-ZoDw-)s# z59Yena_vCt1g0aH^I@YBziwOAPj$hqG@;aW8}+*3f~VAbjM7}UzSNL)^N)%lLKTQ0 zYnP|#AF{-ZGCLhjmD@zhhgf=u19_W=^;jih<kDsfr_aG5on>VCl4P02n_-}?VGeF{ zRsYLEbMq(z&6~-eySjz98ppw0nb{{H#3qgp279AZW}^AOFqR5?AEO{Pv`p$WM6*cH z(q+oJWWK_I3^^Xc3r8|@Io8azsGqzXo4HM@ng<31#zQTbIfR+D%%4w<mhh`FjNhte z>4N6WC1D_@XNZ|wdxOlJL@d6T8c~c#IT)R_X&{-#c+s|(Hd%A?<)6U#tro_2sZV%h zst9>~jH!|-lMI_irCY)fwGQikO(xBA%vF6zUO(U-)-4Y^^|Z1p+Q0<#6r79M-ZoeD z%kn<ixLmeGb0*`naka5;Wl!W{#CS7XB3tsZ)Pw>=RSHqKBhm0TX>uWxK8%BGW%A6K zD`Y>V<_SKA{7veiCYf)xP11ew=$;xy_uHf2|M3I;-L<@r^dmPbJ$H<yM44nKoA!W- zNjA?0b2~XHA?SV$i>6n1W4QWG=1K2?vo%0j;2{`E%WE}XB<qc8;znzYH=bdQ{{U`V zyJM63B@d@v<NS|%ukjLH&|Kq7UhLT&we;9rV-Gd-?zqeZ7`M(p5y}ROR8WJplc1zb zr6TH+71fA^S@l!4N5|k9Wo44c=EI-Rx}0-meRwQ_w~B@$dRD#2*7;f}qJmN^eqNR9 z%3tr5vz?p9M{>Bn#H)A-IR>f?$=%?V7+{w!VDNb(O>d*8C)53KVTSULknlJ8l49bf zEwC&4CU<%t$COii97opYj52*3;bKg0!WAjZ_8GkiCBq|Zk9ZTxO%T^#IALLIV35+c z_Oo0ly3{>?5YpPk(s!$0|54BW1sJmGTu89ai{3TkcKMSi(BXm~fpT@JE2UOJS1;!w zZP^x`o&T+~W`}V{t)Wle*b@n+{3D0WN?S33iPVt;uzT;}+lB$4#{g8{?Q#VsMwJhX zjX>rhD<lZI5`Vt=+g|QMYA}34k}d1Wr@`^^j541Z4tOhGMbtntTM#1tig&e+MoQir z5nZJbOj7-kwj}P;ZM~SQ+sx?e=XcBc*V3B<>XjRrXW@p7Nh6J^qvhTf@@9dGA^({4 z&tZfHA5%6EK(j*VjIRQhH6!Gz#u@_dWK1Y`q~Xm9<&G9QQ6utO9Q8)>EnKixopYC| zyRZ)JwQ7@JXqKwI4@zdTF>Be~zcJswAaBhReJv;YW9Hk(<*i8q;i=rA0O2-M)k5>* zV)<yE9RjGteEWTQYZ6KUG|_xJiMJBb&z}|w;1HLimfa_Nd|!By!^HHQ+lBPlgLi=A zD|Rptqi=BTP+O7+GJLStV+h;A%Smk2(LOa8r<nG|nih>w>wb)_O2&*3I5+Qo_KP?G zP32oz%1qhQ%j)HH4+kcMtIL^8Z1reV-P0iU5EIz-!$IJEY9K7L2={adtsUx78VeKe zM)GqsVBsb(|4CPZfuVQ0!e;|r3ks~nVy^1H^X<qZVh+*Af3fk%Mp~3hvFnwbw0YIF zi=5C(lSIA<A>5@N{X+`&LS3$xA9<cCN8cNKq)sIUTN8pG_37Uw#E3FqaXdvbv=RJU z%cMAofCkqFTkXUtu=nq>%%qc4*SY^DB={r06F|CvLqNdVLZ+9ZC=3Qx*!%+}NV=wQ zuQZ9NMQVpz=gAS8_ndx{LvWsm#xQrpJ2aA;-!U-aC$tmC;&3L2tMA)XWF7wYrT`cX z{4r|%@64%Tkzvd_4GQcl;>&1NNE$rDJ38bYXLvJM@YvjrR+-UH!}X_;9iDK(IQ8M9 zV!pXTOgy)3GkeWzj*@aLudoE)%y+`P?{e7ao3I$;)Y}hJMX%pDb*b)2`Agx28EoVc zID(1ZbcVYB21$WLx0o-&Z+}Q~Ds7^<RvjU@{;4LKw?VKSuM5Gx6S;P<bAGQqJRj%b znX-WoZ;}lx4EP2t2{NPGX@|J_&A4ChvRm$98<_DDcc|;lcX{&8++#b~Fr&@48S>WL zMms`&=4zxGXnr|YzL>jjhdPOQ1as3z-kIA=V2IHKZ#xMC74nXegbvo`iEW&$kbiV2 zkfX#hSZ|-9KGg!R-+rmyK3VGS)z<czpuXK=ZJ(1G)pI~~x1hRC|A>^wRs9b>Fu%Kg zC+4jaGzu>}0}88gV3S7R1l4!xX%X1w*+s7E@1=@s3BXop96m63Tkr!%e@qDS%TmG{ zWb@7p2PS{<+>xs2{;E2|{+g^_{Jroz8$iLy>Y)ZfqYWDQGeG{yKJ}X5uy>>&KL{*u z*6BB6*!TI$1}#U381d%7gAqWhbCZ-F3a~7-d7X*rZ-MC&W3TN(apQtOfSY=c_MIrf znMy<6d~pkv&}#WQIMd#hvNiI7TP*RaCoR!g6}fnrDwk3-IFr<ncbAj9(T6!RRtOpD zJWgU>`XcA@LgVj|+-Ov$9cnCVek%UX2Y>Tl6Z|blAwRTcm0)WgFT~4o35P>5%c-uN z09?uaXB5siW|SMva`13XXbA=OrGF_0&q4Kwm&KDiII+jyz;e(!c+R8#k)%=#+=#^z zJWKx&d1C2pyiy&x6l8nN#H-xU=TR_{;9C75NK<ngVM3ld8Y#Q;)>mu#b7{aVt)z=w zgPtw$5Mo`avK^KDX_YLM`_iuwfJRC4;0y2M2g!U9SISK~G`&@ArvK5tT^jA1f2j_; zP)Zj}*};`kF><Bu*az>+2*ks4Aos^#YuMiAUrULOVfrf3sjpw9GBc(jhcn?UDRy>} z6soGMfST<K<;^#|&7r(<oH_fe7Oq#=C)hfY)DPR>bzgp!gFjf8+TNUSB=QZq__Q<X z;?v|hD>^llQ*oAVX+`P@;K$p|rTsUSZqul=Lo@-WODmlgO)HIZKsqd$8AAhbn6j(U zjKP$B@gZE8suFn-6OGlr5@WGMv7qaU%N71s4kO<gtaXP7vo5~;4-AaL`G$f^SU0ml z7{T8P-qz6wcpI~Rd!mL$IaN=wej7fqxAoiiC<cGb^z~SxX^G?wd=Trm%>w++Q-Eik z9{9LZfbXH&X@Ph0LF^N?Ue}G(a)#>9h|ue%1?$s9tJ@LN>QY9hqBsYQd>TcApQg=F zV$Cj@D0+&;jLh<7YEENhc4Poo)tHgl)TB5gvp5yp>Gbi);UG$}gaB!v9Qyb)txy+x z1V_gJ(YQeA^XQfg00U6enu3>lgy(7<cV9iuW3Wzf<NQZ#oZqBW$La5Dy|9$(IMzeJ z95weY!8fS-B|!wW{85{PvAs-gBL(bNhswQ}Awzvc<CjG*@Ldz~qiy34oP~k?u$Ngb z6fc&U**Fd8^tNe+3{;z$eM%|wf)zK5(Rp_39}e}uy7=jIti2VP+hgU-d3A~-x#BR1 z&FZILHzw_^|NB!61he0f77UO)vOh9qFkDpv$W+1d9tG@&rUF)Lgri*z3Lb8?EG^Eg zwp^@>oo+<EyVI+jpt2cUDo@1sAn7T=rKUJfA6!Zzo{K)2r8zG9@t1#=HD+nz!Yg4U zCTZn`(``te#!gf#uhIA6G&T2Ju^ltH<C*-H+gBbZFLq{=!M{+RkDKy{jVvT!Eo-p* z-HT(!U%gVwi^<Sp_x-VtG0QN$WWh=TQWvHclTRm)d^!>mg;;z9O}$Fp`X`|0r6#2C z54eLtQH@iK$b=r|O+J#-KgT~*HH~9p7ZKb*qR~V$)DO(%KprLe(Iw}Oi2&ry1Ice} z#{24unMXf>WJRX<)J8BkSeuH<ZwkCdw@-b_6c|gezGC@}1R_MyaN_1cyXJ)QAiAks zrNt0T;;=}Zd3qWd8(D0pvjd~;8uk7@Vv!}A8SC^@RO=uX2Ps&d87Vslcl4V@B<|*Z zd+v&Uk>rUvD;>+XNgVp9LBfF-MI%nQ)y$91!_iP?1oI*8+JUs-+#PZuKx%3R-8Pal z59Nxlq1WwCM@B1mf)y8=;ZSk5N;Z=+6485t#Iz-PPjYs0d4D5$WkG6|!~cFqpA{Ed zwahvKyF`Z}wPMO5{`JxU8JJ|S3b-pr3AG}m9fmpQ0Um!9!mkQ=hT;jhE804eVb@5r zJzJvTTlD4}hQy&)=?GqD^LvGt(MfB?Fhl+JY2ue^lCw)KkQ-?n$(h#|MwZgr6Tzrj z3$HYSNyh>*)wm86Vqy|^g|e`OQ7dV}q%me_H5SvfI6QBjd22^zQdBC)q%96bsi{uP z)x7>PtW6DYUAGd=+;)Xg2zubultqKk(DC+kV(>Yh!XihorgYz4GA2wvp=wMR*8oFf z3fpg^<h;LhgAAGNCu0j&W^n)f(U;;$sNVS_r*611jW?y{n=SecPSsuAl0a0n=;}4< zoA~6GL<yks_RNUNopCaf-r!n(12d8DS}u9J`15N9lkck5!98Sg>TP#Ml2N@DQQBwZ z5Xea+N@o#Py@L=n-RhPW_IC~`D7enu0F_VdHZWFj*4wU*B+K`!`HpJ#CJ2z+^tuzf zxyT?cs~t)OiH@z`hAUDMROg4R5ZV2v(-M{uB9D6RXL8dwrC9H-5hlNUW&5jg%`y9S zukPEgqz0WZ`?i2O9fPIq#FRwoR-b4qwEbZvccblUzS#!%fG#yYu8jxGHa2(MOrb0a z0aZ*|fO0P*kRyok>A|6-SLX^CwGdX5Q80v#%dCFgt^3tJ4LT}hWrq50eC@g5_e5=W zsS}Z_REov8w?2P}ac`C(g_-VRGcjUl-wc@1+f1aLPol4_O@kO%W+K`MAKFR`G@z4u zIeN^#^Lq=Kz`#>Yz#Gjrpw5rb3%0=5OgYvgm!%O1H#rg-S%~;Mc(uGB4CqCY<^2b` z9Z6M3rjZ9gE(sxU5i?>`<4S4+`4RVa`bu|jbnuDWd1!i<dg*q(jjk@?&(9^>0<H+r zlFMJeK$oQ0YO~lNid_;=!Pf;M4oM<FtUlyg^*x%?dk&hgmDREK+^do6Y_`O@r-toL z++5c^z|-ssYh8-$&NiQVx~C)^iZz@1C)u4{>H@RPU(BLwQe$J?-v{91)TM5hdZfkX z-TK7if3f8t6eG=px>4Te+tblvsq}&_&-PG3*HSJ~U7|NsB1-gjnRyAZ(3#9C8O`WS zLCNrh#6GA%##Zpk+ocmJIhphv$)q&dI9puJe8DZrxE<MiktrD@?XZ;(FcwV~%@VfA zJ0rd<Q;xDp{oz)6+uPMOEUUy-^!494iNP<@ylujT;pZiex=%kyql+dR$s$MZG;;xV zya@7WQSFn|`35tb%(9!+iuHoSl2}+M791ZmhXYToN6FetKzo<)h1lSvQGrhAqgf1A z267-{1<$6zQeJ)b0^lS$UvM7T7YQ<Koyn4BgeqdE$!2u0clin3=vF6wCIU=^;@j14 zo)og-A66V$XqRK2L?Lg&nX{F6GP;>A^*HT>DhXUi9JFl+*2x0!prG)(v@3MCRUMYV z$C!*ZiyAcxf^RA~%k+KlRV;z}NxDT$eUj8&KgDdM0o)1>5iH!h`;+vyJlo+~4q*dy z(9?_!5Lf!C>J>nO*}~}Oi472!PHiy~oU61;1|35crTKoa*dbGaMWTe>Xz(f^+hk^D z@fvMmVuM)@y&{9+yBtZBB&`SEwONFi1j$W85Ca-bfWO*uVS7Xs`8bFw&>neSmd)FF z&!Mz?B58@uiQS>usZ0#4o=yh|q9qvqw#rnapw+-wg)2!XvKbu00U$@Zs?@QL3R*E` zIg*y>@3hLyP?t*+lpHQi6c?*oWNI;d#XKlF@Nhw+r@<9mLD$s;nQyPtc%QC>ory(e zM=b*)H4k8BW$F}}0F0e*qKWC<;F((;#F!*uw%b_b4wFnJ{R`2NL@U3BNd}AGaW^~+ z<DiE|kvp+z3jR8Yn|*2pRpmn3K9dfsO_(<@6~=7$R7q7A(5dQ-oxnoyWmE4`SORsx z-N|fcqhF=h(y7F5l!Q0wrqay4*rH~C&ZXzOOn_*cGHPBC6q~rtiOK_w6){wl?It#B zz{$S;0$Q?_sdZ-_A%%OM4>O4sC10p>??ph(v=pSKHy|+y2^W!7@<n-y`fDM<MEgo5 zH4LIC0R0k_Mg1PrN!ej9(~$50)WA>9WlT>sQu}$P5Ai4D1nbf~1zaFCzpo>?zW7_~ zjF9cC<_YeNRd@4prn*nyU@Lb}dLPo|$d!n77&_B5(V1eIDz(U@J6bGnI@NqOpyZ*C zZW(P2wo_Kh-z6xq8t@(C7G7<ZzMj&SuCYyB$pg-$EeQGAlz$w=0?#G3K&L)cHPQY8 zTrekisQT(NCirdow0Q`jHsRfj6C8sh$(fzO-{GRZR)mma`O{#qp=pj|3}WkVtikH3 zX-IAnsY0P0pBVgk<(6Y*numkWOI4x1@H_SDE@{P1bWR~zNMzPwstI$_lm8tOL;m+z zBXgpS04=IFTP-BNP$KCFiA+*k2@z@O&K!W3x|-+?le+(PB=-!}kII&2ESlEc%?kD+ zypMp`f)>93wxC530hf%enR`NWxlcNXUqirkpEKm+N2)rDj+!?Y1eK|_rPpeIm+-_0 zx1H;3i@#eOs!UZaYiU)7^ATUX@FQ~8KDF#aedNk%%cnG*vq{HmW!h9LU}J1g|L3IB zQF|`dZt9Hif;3{wv4>&O(xIwRqp6GejVcp&DY88wdOV?C)z)_>ObioRDq^}&pc})i zOUe?U@E0(CvwD|meL|`u-Nc~%Ftwxa8+jk)H4h<!7r86>Jcdjq0}!W%u@lzspsF0r z7TlliBmc?ZeB3FQIxCWb#}XGN;TG93LYGswP$oj)MnnP71!}5%-h_x(dozKqFwf_d z!LK^M#v}MQfr-=HJ$Pg+6BZ_VZ%8fc0|`)_-%hd-A>}aTIGn7T&-F%08leq8HgrZ^ z&r?rA@|PZ%s;2*1mVx`g?G9EUc-mEPGVxIMU?A02@tg4MG_e@PvQ^Jowl_8K6Jt?o zwm;2}2^XZ^UDrAwoa*rW&GqOarm@IyLF*D5i`21SaUye!Vn?@K%}Zxq3LI}xVreKt z_H3}uu9BwUV+}Qclu4oSQm8Rl=T_flf}y^$b2aWa9zRTiYOG)P*(CT#o4T4q8RJ!X zXi?wM4?Ufnfud9Hr<&f)n3;tC1?Zp*=t<jiNR0Wvg}vS_v|;N|k2lrI6#X&-XXy<H z&!SYOn;29ErbTv_WQ=xIzsuamu82e+*|3!tu1Bk=rG7h_sv>+AtEuRGg$g=BwEUym zoqC0raDvju%m^pB*xyW~qL{7Tcp0nDoV5AmX&g`HB-}hU60wLuw!f|Xs;a<ww(=2} zzU?bZ@~Q3Lv07w~6AL;AfwBcH+77P;K?j^e0X*w%=vs{eCG+Un2@R>j%sJLQ`Zf`Z z<W(ZQZO5vOV`05&v?t=~B^juNNl<kcaHXZTeEJIZe?vn1PbeuQL6f%0;xJAI4gY<o zUTc@m3RXI8<pkm4{;3my)^+zGLej!q5dMF$aE2acA!%8e(;wcLkY>XZh;%Ca*I+0< zdrREu&XWjUVCxGbQearvDwrGp3X2)+Ew^w_#q%2>^E@_)mG(~Torad%uc+-PjwZbu z^<(X}*I5=Ri&&R(_4mgZ72x;FQLgXT1f;;LaXas;Yb&KgKJ^{YqXX&C<f_~Hze%4R zOw)!0O`ghpHN*S}H`hHYdlTVZA8l#b!IbG6P5Hl;vAZXb5!KA0-J))v&q74`W@6O9 zgb!(dmGZzhdgX#!%S%yAu_e%gvcVA>!572eV;CSx$`=sp5>QIgOT&`4s1!i+w|xo~ zt?SZSbql;gsd*z>Yc#7#JQA<e^S*2Oh0^GDbth0nDL6nL3!I)^1fJxlnryv4BHZbA z<>gW0@1-dZztZ2Ay9pPz6?~oKS}vBulTa-3#5ug9EWxM7q%+Vg16zv6M_CA(xNFcB zxyw|#LCazvyF#5OA-YUwP#6_t)VPE~o=tnl*^kAY@kR3BRXQq$6W@ncv|T>+-HGUe zxowLjp{^9d#)>=DFiJ-mf*q^0)~|XZy^{$1`$W>5dfkag`<1*gu~MRs>{I`Ilr|<h z<)KZr$^#9S5Qak<#FMzyr(Vy~4f3128Q7*PlCMv_NO4VTsCtXl;yX->R!or|6XbpN z+7ppdxh9HbM_mCE+Kunv5Wc)WK^DP(Ha}bVX%P@2$!2c5q=4I=8$OIKz|lF<o6>hr zNvsphoS|CfM!!=n64vM*qcGnH$+?jIst}~5P9G+{JJo|6;T?tC2$#LuWaoWVA6p>F zSC-K6cVw^dwCP38x?_Eo9kcOq;SS-z)Pze@5RGWG+NU-k>tu2)q%|?tqy%f#Vg^AP z`en~(W))%}f-qdzR2zFHyg0)=X`dIyu)J`pF>&&;nphvMp>H#$5qeSFmtlsx@y4ZK zPZ9!Lw}>A~_*Z7-Wuaf%0Zs$+Z<K85TZ{y5Cn-Ml<8r(hwZK*)-t(eLUWmvzl&pjC zqu!F3^+w}U!4Fb&0_wk1F%^4{8v{s0z0&R|vn_AFdA93`S_yD1N-m?XnW&o2Ot$0` z{~+ZxUFVp?O&OpyBs=p5yCvDCT9}N+x={S1O(AJ;-bgN>qa|0nc43tY2!@fS-9Sm= zV>?NQrc37|#)QdiNYJqAoRJZdstf3pF&i+&qA>=j-<lW$B<?v5UDC{^O23_KCfEax zpFC2Cn?X}Ko#kw00x(s#*B2WHNVDzfTKFw)sv=%a6ekG`;l@UMX^E9~p@-)rKz8dL zsIu;VH_C~m+JtpEEENC$0CC7SL)41RX%eIOauWV5K%g!J-5t8$&O?spXyAgW$d`=s zgPR?p3yhie&@J{v{h>nLntn3jN95<xkxUSz=b*(Dsd<MZm_QnU#Ov*z`ijG-Gk#=G z?@m0KaJA7ly?zd1bFCWFhI7jar|#}ZP8@Hi5zkxqACUz^T)@;8hsV`pK(okBjD@i( z`)SR_$g~{2{}b9QGH$q6H3kx4x-@Gnp=>!v#8W^sjd;vC!_y^(q>+GufO}iiGeF7> zJ!3hiloMpt=&sK;4opvXT!Q$pom31a5{e+_8vC>h+>j4PWWOOBAe!hwk{P+l@~}Uc zXLsX8$DmJ5t+e3(o?1z|_6?0X7n_ZW>)z}$W{X%5my2nEKbDJW!5MNfEr{h}I#c?I z1?92y6AQ|%^b=9Ql73>r>C;avu+mSM{rSf96X%~|nmNBdXF<#~^Yqr7$){8qUY|3< ztfEPc&(0Qbkko2vzlvnT?KvCSPn~rMkFy>qFH*%%vH9bo?v(#G)&u8K$%?weNx~H# z`-!u4dJOVnz}kZM9qlDsO2sU=X0}{4u747C<^VC3<mB-?)02a9TQP-mt)44P!X#(# zfsr<(N46YnEFDJCNMm4VIw!NZfrKZdz}7~L8%9^XS_MGu7$>H7b*+iY$)!U;87)Lz z&B8g&$Z;C^BTMgujw<&!2MkDS$i5xXl1Bueo!X+ru#LhaWWsj)c+V~jPAVFuUcO|C zw-rOP{En$4appWm<hEL@K7(8AFaczs<uXh<+GX^?6HrSl5bQzI?3_9;RiU0cZ)W&) zF+st3M63zJ@>{*m7p?Om$3zmwwIr)Z<XTX9u2}XIAe+cNkq9-dvy(VPib6LN6Hq?M zKmgBJRI>*LVT&VD(B`TZEo*x+eIkl987vl_P*+nc-4hC=cGPogiH;pR(t%Wygl>&$ zyCX&4g$(Zwd@E#BVvcT<q>2>Y+ZGBmG1J)+2`f53n&^y$AEG17hn}49^nK7Aq<58x z3Eozj4cGF=Wh&lxJ-Uj&+zH_(+K@`^Q_n4xp|t5KQQSq4S?ej0-|7YVC~Cko8>wo` zl5|o~M0>PW(3ZZ1IA{A3xA@feH4Lt;%?Zh@SEQiHRXvU2o18+U8qKJz1<$d^(&%Ca zQrmGZycMvdCxd~KUeerAW8g>h9Dec<mHktFoz=X>81oP{3Nxy=`4f%8F}OFR<F%u2 zq@M1;kAia#+tf!V30dpK5Eu7(u6{d^C}lt$6OFtv631&FvWsw`uc&wmHg|Uq`zoTE zMW5z99NaoG)-nHxquwrC75F`*r#5lW)Nh7=6{+6CZQfp8yEu7bJ3KcWkYxQ4hQ#E6 zf^)kG75}9w(H%J<0%kFEI6PCD>6SKT&V2rXzDe%#%V(7JnXMM-a)-50fwCy@ln*)G z%$c*fPYtlD!vr}|st^j@bO7$`9X3FYa3oA)>b*x3)HN4ybu1i-9}}9x2?=t~G@4}t z8o!VYNX$2c8U!ou1`DpDVCj6>fRAR$2J8yicNuvj4O_MZHSVHy*@fsLM)5ph7rRjO z6BXN#{0}9dzTn%=Vla&hanI~s8v9CmRld4=eYMj`y3s92crIOujA@_~>KWRPc)PPp zx+^|e={*{r+lB;0`{1kW|3N=(vNOH>$O-M-Gw|aHYJy}9p+{gwx4Mc4=z<K!5uT7O zvjBmTX;==wD$@`QbV7?H)pp=;<uyj2D>@f-A1A7+s~onF{bFk_kN~xTPcj#6G8cz& zFbGY!*p8UM!$#bqTM?`^r<<rl($HWU;-$#E57Ushs}dcrHQhrs{NomU<V?WVHgp<3 zz>nL}ZXd4LDRYS|Q|`QsP5i@Rv;C%EQFVjA#4K~zEJKoxSP4Gn^a6k!1_03o;qxWE z>IyZD`^Zuqm#b``Q?|T{jOmt@Iy}~4qi>xRoqA-IXGg{ym-j8^`@<EVt@Iub&)pYW zzXyICw|*mgj1}V6&v;dGG^mHplNH2PV~hlDD%Vf4o)U*?9#2eD?*-L({b!hBVrG;y z6R{Ehn#wC<v;5kXg4CTM`+=T`ZnY*FE5%W=iU;huo|5K@?Y#lF$^zbE0d6JOD1ySc z-ST}6nB5Wu%x>Y#(z``jyF~+Tt=KMII~*$MMkNn27GPq{5t1!ZMQUiAq6SiW*>)PW zx;c}nvh<L-Hr-^w&`aOhv#@&UGY?faxT+<XWwvCBKWsI?Zq*HdaWv3k9iy=ZS|SiT zX`m(A0Ei=g)goz+!yGdtW_%YYK^J=P!&UtVi<T|v>Q5b9n{K=9)VAB$;kxa%XxrxC z+!}I}ih!1v$IwzVC%R`n?fM7B_li9sy#g0YngvZeEi^3{qtUckqiIR2eCo13U15G| zt?1m45T3guhNw-e1yP+g%x+f;C$x)a(bW%7tFfUm1{lqgRJl0N`_n{<m|CbdB88fX zHNVsNa@cVag0RUYmVBcis<&(K!Ndl5qfo)V>iTkM;nCg08pGw6b6^-<GgSRtuBpU~ zCnB8O(7<u728KgY^tAZoXcnDf?JYEX(CDf@v~(z^&XI)|$eC)I?lCj!aRFlNZ4a^% z>G=QCXo-5t*zS3YF3|SU%PQ>L_J(V}Oq7NqUxatynCXO&s~@3(z=36nofs+K)%;#6 zdOwmS4XGza$RayDmdXk{ZE}yptCQQ$7f4WP2Yq_4emHeM_M`N;pGlJ}U88GWlsPo0 zjRw}}uWl42Q~!LfpXz(1@ss#NG+=rXW%j-t7I0Wo*hGg0Z-#0!Dw)WAp#sH3_Om8( z!sX~0hZy~l^SaeO^jSjgljRr+O>Z+#*ikC&sIUVFHX4018oZ5gur@W9j0D=FtY7f0 zh_Si-e&HLxWmCU9A`%D`ICgc}oqBD|=x4%Ov9c@=oN3$A1r@|rQl5g=g?9z7wfS$S z2dvrj<|#git8#J9BOHr%#BFxu8dV7JxQ={FI@02|I&zUYnWzHDvgA;2-XV($km>Gr zks?Xw22h`D4muQ@L)IuY>;%nHLj`G`y7J+;6M9p%!mC(4V#v9Znz%&s_gi6)Q$5}^ z|9b{*a3EJR{p^&m0!m#i2I&8iBqc`o(u=^9;|sMSGP{HTGSZVPbx#_MzjgT1VLibv z|GuX@|5`edvfT?W6?u_NZK%YF<}(y%4EcAcZ?Pw$IEC|}aZCmmgZTH`Wo&{dH>@%d z#aZ*IAj<91YeFY?*}@Nt7dv7&rT!7n3WH2cEz2j)K<;Upja6}UL+M2+CjC^AbB2@s zTvSzufdY?IHl*g64n(tOX`sR-6hghQwj-{omb)ckQt2PXE13^<6;>O>zY!foxUk%m zr%0~};$zvRHK?ZrvX-fkyHU%NFqB><$JWt5tmj`&ER!KE4o&ZdDZTaR@l0aaaw468 z56={l_FZsh3Es{@$2@`VrI&z4f>4JSlepOt<7KH9@t(-`o~U?RXTz2To-!KK3l1Cq z8tm^z#y@4y(O`RmFZiBq26sYso2ZJm1RrqsA!;YWtB%3O_-X0mQLRicWpAG#DYC2I ziV)4RSR;0A0t{eJq^A*x3E^*V9FT-1;McMppIJ_DhHS^ANyMh5>H#WVprH-SE^-Ev zj2j#sSg{*@<x6=d>m*6HbXw#ETsgm<7I|>UNm}FuAWSSRvX;$|Lva9CxhYqC6`7%q ztl(NaTL;c`SReWjNC$gt^8;+T<}@6V0mvR6V+*#XB-ZZk-hC30_!YO{I&+gfaog@M zJ)Z{_hx1ZQ$)C{`9&i1uJDG?aunODU^6|hQTz#ngJi`^9c6sF0h^#xre>(<qdyhLV z@N@;vNw4=ADT(!^^3A6b=!1x;cc}|!bVoYQrNlt1gm}$=_=x_@3YLIdvU&(ue4&SH zsjNmpBtf0CSw2`IG4R4R7h9fGE4PoBwM5H)1>;m*8<6m}IuH2SaE;}|)8u~%|C<(> z;*^YCme5e)>aL56w2RNOJv8W{A~uX%uEc8=z4XYMjf>bt4fIl^t@xnfFm=_%96+*F z)E&cxV5V`Ra~KBE)J9_x6`>81xE%8sJ=#baS8!XT%T-6R?)Is`-hy89f&PHL7tkC; z9Gz7Uj`)vxps(qFnmo{1G$5%_nh!uH$O8?CxIEB2ohA?Ti2qX_Xbt0(JkY#5H4n5^ z?36svyggGMXnOJgo(Fn3d7y{;)a6by5A^T^lMQSqj<~IAsXTV^D=rW8aGeKwxa5Hz zZd2cq*~%ji^av{t^zdjN=-~-g9%$a^JkZ0fJkZp-!mPEjaQKS+;an8~W#xe$o}l(N zf2H$4(-0y2qYXuPYmf(;cFa7`fYo`R`AZ(?;r}5IwC;f9fsX6JeHvWv4oDto+JAyi z^%IAa2m0gXA|eN+#t*@5)1Dt1KO}~i>UcRS2abuit3ga6O>t2VFHSR(IXTsQv=;v< z4f@^K5B#Sz=nLv|=92~;a$~w^XH)*nF4|9vZrgOxjuAm{;xt6?Tn1ECIU=42(nc(V z+tE@aOghAyyC;O3nE>tT<D9DtsV)u&kSODG*D4pxjv>~;)se3WQHUGo3V$k?6a5;l z^ywHkgvd}Haj=!^^}VwDXQ<ENk%Ds{NB{9pIVtyryic0?kEvqrudcX}Gj%HJ-Tr(t zkJOIuhO0$ng4NS9FX~GP_NLuB`<UO&9B5M8JatX&eT`4uoQs))_i=cQ8u2AaRQs`h zHoT9c4i$dSx(G{&a{NteM8)^+N20i@i34UjkeZOq!+nkUfDUVSP#^AQgN$|SH5Pmw zE4{j*{4%w(^8`_HVAvls1Gztr3UifuZk%uqNNO;vlK!pfcqmwzVe?;ETFX4DwZPR@ zHjmK}J4OusB8$eT3o-Q2hBk#6MKT<6OsnB2^JXI3g7J4KgM;nA?EDqA?bkA;f_1Vu zpNnVX2k&4b&GrqsW#K~uOkQpgc4%TeQ)0@Hii(ON3$z{N-1}JZQzAFob<&R_4suBv ziFz*QOog-+js&jM$xB7w(cE!492Y7qb#VV-QSj^3$QNn?KajhUWHnW9nxFa@?_suP zj1>eg-=>R@>{!yEc3fy=cAOtA{+L-j*?2FO0hJ0LfSf0!cfb09WOx)CpeOky_bAeL z@sGr;gci)van=u;iMBZ5I5^d}IJ>Ym3MC-HPk<f5mog!Q&wA(vM{wQ{tVg4HhPPF5 z`bnPQZ_j$P&wt7@{4@J$@(llU8MS-o89oT1`Tsx9@ciC+hDkUFjkgO;5^EL7Gdy4H zR-kk+BcJ0ZYvviAuk#GgC(kei%{;@DJ2lU69p%pqZ9BI}ajGGE<$NT~cQQN~GBaA> zD4r@^Pzm?yWl__ZOyNV~3GWFI^R$GwY;w($Lc%64We&X=T*XDqtu<pNgKY#x8aKJq zNv{Y+s{7LJX)M3Av|0!l(KlcHH++g_;+^I`$2{sCAZ;;kEgO9*2X}>;n4=Ylc^x!o z8p_vj!A2fzW{u*=Vsz6jYR?b3d_~*EU`EVuMI*9Qr2BrAi5fohkmmKf)Dr`~0_R=T zxpJ$V+hkMI6nbnOD5(hov5pKjl0|Q>WmurY{Iog|MBjvU22$wkk|sYct~Ex<IwP=N z-+njA#n?NV=mK2o%g>h{Jxk6mPnwys$+N`ns_tgg!9bghD5!j1CZBn|>H}Ucbx`u5 z{ro!O9o@&2>qwzl6vE-Ne?F!hPw-X5d2QvB<kNWb6N-&sUBaLS3H<cvvlOZ5n_bZ9 zdPGV~u?u>NwI>XgVikd<Nffz%5up6JQszj4ZUs=w>PE|)G$CB>S~|T#$}KLGB70*+ zxYz`n<$J}ICY<j^5Moip^>;x)iGdrnKvS+&%itvcoX~N8>BID=9aA=L$jzl9lv10% zI1#zxP_N}*xuyLCCm05kN|5Sb6(E)P%QPe}M*z;ThJfIN*hr|)=ZI_Cd?C#$6$v#8 z1AcQziFQ7W?rN91xSo~2O8p2RkwqDTG3s{iz0x3F9=)~qY7Tb?;R}icO*N?;jiT0J zR0)?R2LT3A<&z~u?IdF&+KTcd$S7`2H;o|+u~uG895YqSlewa;>?fx%+M5$xtq-aR zU``?tx+(@8%ztWF*RX^AznFci-ySS*+l`63m6cT`NIgVH0VS3XIaO~~(XLIGa)fWn zGVh)^SaH?BK>3b4B9W>r>$3^utg4z#EFJ7L^+`QrYE&kU5re&(?uETVq~Hus^l4^6 z6@DM35z+9rvC(DJa?r4^x|M-@%xMoAZq$(EuV)edJppKd)V_em$?F@-BK+sO#5$^5 zcCP9u)gC|J66sY*s)VkYiajO^CC9RB`T0~88KSYXU2bGpo9HudK^%nVfk0KJCtZ>U z=ioz)Nntz?@f?x%BlFRBVD>E*Ptx8s(vI2WerXO<Hpyg*bVkO@BC20J(2tT5Q3r@- z83d8&3Za#wFtOX|zmv{&+(nJ}GQ`p%{_3K%C@d5NC)DfnWY=}8CvzoehUxG0&%3na z0<sSswP&i;hMtXB8|7I1*gBFpE6r@mGbA9c*U>Q;Bl1pRmab~$g}5VrEwQj(zf*(- z+m{e{g?{{NQnwXWyhvEsGo~-!x9jlN(wB31zb81Ob6B1*b`kGxKYfU0Bqu4Rq{oz; z<k-PFNL|e>Rjm~n2HJ9;dT}l*z_pT3x{II>3uGmkew>d{^w@!6It%l?=)y0FeM?mv z%x{C3fqP)Tgn!zpuDkYVq~j)ux+T~Z)<yi^n<@c|xuwdxdx(f7ret`I>{OXJAw&z` zX2N@C&aE2Z7@sh6kCf^=2hMs{G^SMTUndH?G$b%pOBM)CfP^IYFEaWQa-V3jYrH3P zN_R2lNCYFLP<b0xl%#Wb`A#l*lJ6bAMsviS>Q}szwUqA%vCd}17f&s=vc2zAmt#7} z+`<-}jk~E%^gc|AZg@{fCUPLBCozyRRk*2+9a3!iVG1EwvQn2@EK?l^b<7lL>0)7R zO<U}*hgq3i^Su)g*)WAxdMk|2S3F$Bo(bpqI0A<duJ#k5lZJOFlD)tf2QspS=+=g^ z>BjlkQQdZbO1-Wj37gbF5{1JWa|(KP#a&v8O{WehHMzDhB@GvFY~Rd|l)3ziD95By zpzXBkVpsSM$YQuKO8putUB#+&wkCb9<=XBsrZ^VW?;DtI$+6xdq$s9>mH~kY(|qc} zq^~dr*K1&&@w}BRbxqdMQ9-}dy%_r<^s{u$)mzH*)M65X>uUwkJN7X-h~}|HEX=U3 z6(iIPDUiy&qg9(U>H;n5J5~YL@*+AUs!T4{y*hl14jBdOJ#Q@?R*_;9tn)N3zMyxB zW=izmY|08`3}J7UPyO>sxoRN?<$-xj<j_O3%0)}aqrB9!tT`pYH%h7-k?1fgQ?*^a z#Z|qFrIw7sY9`r8Sv46|*`>^rk{$B}ifoD-jYo+SLlgGu?fy&@3Rpv48#lAmkpRP) zbaIN=PbT|xD`vIo?d8NnlJ=(w$gXA$QhFeLuHNFmP5ZlvY*<xdWr|a27GJC*95Yhg zz1QB8i|aIc$T#cGIkBCXGt58?_T#|r_>TD^OBxHx3s(>Pi@pXQm^}c6u~5G#=14Sk z<kef4LDv&oC}DA#CYLfKa?WIMWaXAqJn;%7BFxxwF7ZT!*^FpAwPu!Vtt)sXL@#RH zU{q;Y^bg>Xm2nW3H1<W%w=?mpi05F%C2&<<b^j@du#1nQylU{li5=U-LP!1bU0F9& z(ybgEtQ+|Ub}Ek$5qzcLVYtYaquG}E*7^<qJdRj=8D)tuE5!xEsMEVHZ;aWk=oSo_ z;_NPCbK=oKTY{eow}(Q=s3SZKbO)o>hoKlUArd~+=#rajm)eA^1X9y6P(ILhN|AbA zze19e$TY~Tq}42ySsAjBSvg?jnzNES##kXO0{SV<Njve;1maU@Kp3A<hlY%n)!B=v z)s=`|D>uV9HV9l4i;>(h#WR??NoR@T+0g@2&WT3#`#wSt%I`21W<>b9v-${CCiOB( zkvRP4#lFZ{@C21aCDQStQLk<Fnj!DE!bf!(LFp*{lKw37qjK}M4VtdnH%Rv<nI<oj zC`dMPV5D~qJ|?LQ)zL$;Qkpb~odD_#?3A{vM@6p}bF4fk7-+HiT?C-3&tZj*8D0Gw z{JDBS2uM%gg_D9_dP)usDzTJ(NWfVSry4B*OO3r9=a>r>eSMC8EvlXS?$_cJv@kEo zqCB!dFA9@m>Pvp$U=C1k9eWDaH8*3>F{YxA(MbQ^?=N#LFRc}jnQ2tB6U-r_5hY46 zM&2l}FkfXICXJEczya=vDEdTLkecmjs!U3+Ln)Z;ce_@9F7wB#qSy0d5T%#Z1bV>6 zT67z48TC&kdRqrgZ}aS~xO}PI)37L=3ZlDldK%)&KTr8|ZTZb4FX6aSMn*>xR$!SC z&(ZP#b$S&KQyjU_+)$ud6_E@91)}JhWR)O@4q2skZVb@VP9YZRYECer3E2Tl_f}6{ zOaz&oMA#aNWmV5+lbj<MOtq?K5k7?itxU)$B=24l2fAI4x?p6?b?Ma0)u{pkNFAKd zn&6TBwXlXnK=1bztMtJSStT#r{1V7YL4}VQ3>6GfyZ2EWjV8jW*!s<9-n`|;!KcJY zG-J>~bNz@jbuqUS2^bfnJrVyn*6*3fiAZ|);DeaHg-X)Y^#??QkR$$T5&wMP3QY+G zMyiLnvXf<3qTrirIMN6#!5qhEP&<D_?;1jLhpVmp3e6olO|w^S^_RWk7U2vAM%rAf z*AY2U^0|9Q5{L2BUMMWBq~jxvw^;GiLDSRXRy;2wICnIcdKNs7Z6>|0p**I4I-=uf zS@10Jd&mj~vJi5lOG~j~8i8>_WuKx3G$H#)Zfc_c0>bW*zn4ty>OA_$X*OIvqdS|* zYvFcOt~}1gwi^4o_Wkf9!MPbWHLO{%WsDAYx)ApdA`3u%H^FFvEIArk&O){<vOPf< zQ@Zyg^3Ivku50-lpuD;mAeyfr+@hT38SoW0b>!P7U*TH*6oqtaFYULOt1%Xlws@Ke zK6L}W)n<f6lZ#PJ-+?)h$h)+gsHRL3frXnqX*^m-YcPQDGc(q8JS6CPLQmK2Y6_HF z>=&etbR7?Bgi9RI6J#*v9XlAvVTzw&LJ<4J5Z_h3iZ@knRMB-?`Ft5{d07t!=N(sh z77M3-jpZTt*F`t+5S~4seRgb@_!;@*xC<kYqx(qlJq%Ja7|)3(77M?f5QV}{#5XLS zE<MYczgt|BMzj1NUN4mCJSGU7V>Bn0q{=~(c4Yi;yKA}VWz>yhPe!<-ZyC0~|7PyZ z1vzS@u!9A|^Q#kF5*Z2ZF#{|a9rotXRxw^9-XWNCCgLT;p+1_YBRLFtX%CYm!yQQf z_1QLB(0a?D{UG(MrAgSO-9KF#*$YEgUAq*CL5_MwyY*n~7KgYwvY;~VM%8fKnu@0> zhaR!Onj~pj_b7rH1P>XRhh$MgC9<0}1K_HDlKvZk(b<74SG9x-0KXCQ-`>PbmJAVA zKWmhCWW+m8@6$(bMfhqGsT_^JIjR`}kJvnf=hmLe07*#4EAJ5o=uWvq^$cGyRTi0~ zsOslm3NHt0Y9H@p_3lo&5Hz)mG>96W?QHDAG4VC-=~W{|{m!frhlOw(*(Et0Go`2e z5Nyp+-_sp!XrC%l&QmV}Y?@R7%R<V=(S1o$MH+HEerpCNI`nrxWazk8wA%p5Z5FF< zeKkJpQ@;?syp9uuQ^$Ba*Yi5L4M(-7-!1FWo^nCVEZy{)NH9^i_(U)PRW+TG)~m=r z4@XK{8YLs^dS8Qg{nnScjvS-9Txf5WRYH3Th&b&jPp8qIqNrbJ_a}x(2`4(XwCtPh z{-n?ndq@B5i~RP`wH=9}O2o)%+2{L*R4vsoPSKw7?o{omRqPb)DR0lDJ*5}_@7mM( zXivE^e(|ZD>}ORE&hM=~mB&-Gr^v|97AZE`)A{)G%cWVgr&u=xw9GrIJ)Ixbp3b+l zr-;-Gx_lyeS4+VGYOO4szaoD=Zvka#PmzwV1Y}2L)e;&)dm3$MvQ$BPN;{_Z6tG%* z%3rjni0Mxnc<|_D&@$lbz@Lt*tS+64jH!NnTn|P_zmt1+K(wc{|KZ#49uw!IJ$?SJ z|DZj6z1Y;AK3ZzB5>bz@fYX$Qe6FT{s$HmcSe^mXgbJ8qs=Vo1Oyx4TiJtI`#~m60 zQcpzbzfYwo<2YMn4>#E7Xt4tV6U*F2JffoVn;MEn<sMz?1)f9&glQj{KXLj$40q*I z?Oe%_o~c7Pg$C!P@&6D^L@W#KRAf0{Vw5>&h(8ShW@K@iDHU^ag3^BbP`TkxBrBh( z_?jqvvt*4+r|I)Ojnp<+1L97B=sYaK!5O}GVc*dgXzAjhxH^-lLwVSO^R!Y#Ec87C zT;ZQfwf1E~o|5sO&K~c?JQ(R=fhe?)`>8=JihMf3r@-09c*hKJVo5COfLgmdd}f`1 z&`fDo*F#L$t$sR1CbL^Tv_tN(=KR-Bm2>F?hhPd;0l>SI-WxtZ-h$(cZ)!(kk)8zZ z*-4`65#gZDmd1;GCi4{G;OsdF<t*WDFUi{l(zZ2OQ)rV>$0Tnji=y9B)mZbJNZytZ z{!=*lo$9Zb#Y^4>=_0))Z-3lQC=C<WcB-RDqoR_xkEZChPLaHwHN8jjhE3;U;c}1P z2_Gq9e|1$O@kkDt(tkplg=S|kYzYlhD58RdP~I5z*`x3~l}I0iS+OFZ!4T%%yKG)L z3s+S&Z^_Bf?D>4Pt9nnOEtFTW;+ZPGWS2P0Efw%D=UOUYiT|49*^UaBE7S#OiQ-hi zc<g1UOAc`ku(m?8)mo3%P3fk|7HX=dBm}bEWRbXKIe;9MDW=tYI=a7`&<tFj#*fB5 zXZMqR2}pF<vzhQ~TF(G#K%1w-|E2{S`yfviag5-9)M!V2@P$Nhu!NLpH7}(10{G>_ zaR3i9#yEhdgZ4ibH1sXT-<bG^?r_?)S%P|$CD2N7i4;iAyhdWom|HQ{6&xTUY9!@M zr;3UmqjA<KICqUU93#}u0TQ`jcMuA!Qh%H*;e4H(yN`wc>|hTI=Q$Hqt4TSQtIC@M z|CYl;Kc-$L*BP53U4Exu*&RWW81X+ICJdMVv2b7w#l#235HO0U)x;}V#j3#?J|U7O z`i&izyNpP5{wLK%w?kxz6?44=`sIyN{RNF5{aE9Z@L#`r3sb8|d7n^<`257Xza*Ct z5v^krFc^ipj{b{Q$NQw2nK2iz+qkfy1pS>L?)5yQ-hcQprk*i0scqA^zglLEa@0qB z8No_7`n|J+fE74OZ8zZ85jqbZvr+xYEq}!1_l6M?U%5G4IZLE!vxMk5aMb1%=C!<% z7&Gs_mn>~4wG%ll^OPaKx9*2$lk1E;9Bz=!*DN45L<|2?7cSpxlysVk(^iBl(47Eg z=n8OLRFy!_zDWbU+kE7`+Vc;hh-KL-P`0+Jzw#hr@3NCOBeX#*+DzSbq3JDZDk?sX zJ5i#t5fap*r~eI)w~pU7^$7!%+C}g8WtDYvs;N*@g`X4RCwMZ!pHkC}qOW5>O&5Q# z<V&hi`~dhylV4)aBu`Cg3vYqhM-`l_=k9S0I!-Mt{9sjJpXOYfOxsiS;P=^#$f4{t zIylbbw^?LHRz{5#?ZQ|!nU^zF5hb@wCnVacWu0<%h-+>I#P(hvo?xj&+@2a)$SHEC zdV8`U?45M*UX`SW;_oL1!h9j%*9Pa>5zQ44wC4s8Cm9S5d7s6f4Gf$g_Jhdxh68J< z4kCkveZ*H>N2VyaH{_i^M_^uYMR#O2@q%xSN){b8)&B#gHP5m7UL+0`b2~-obltDT z*yn^qK7CX82=ae3nA085=h5q)1G+Cyr#YY{PMsXkSJPDd0UfN%YQJFSkw`nqI3k2U z`baQ8U-w5$6cZ#hs@wJWX4lJmrbI*}eX)_}G;pCbRaXvp<g$~YXVx>VH@CO&Z)RlT z)bQ$!{0hAx-tlT*9TObZUUjOG-(`Jn6_Cq+&qq--@2u;i2O2J%Ac5>JF6nE9n{QF+ z03c?Fs-Dd<O4(mgHe5K1auSi@@T{JqHmm3@(V~lW(a}<rcuU*jioWw(6YBTOqFdEu z=|MdTQ3=0+l)<K+rZ~Zx)C;=kR%Mr>nYAi~i4mN$=4mLe#m#&oeIp>3N{kI9RfaMx zuF>19MqewjhO)m_hNAn&P)5ZSz0xZBXtd~hT~uZ#8Xn}>tvw@8wu;|o7T>A@6c5(V ziW|;$ipy{g{YFN<Rb44X)z$Pq7R>{J+OT4kn?*qOiD|xYUK$FPF@)`G7*ZUpA2LI^ z<zXwn^Ko1562Rz_U2nNNk>a!E4$KnR@A1hzNz#N}DKtY-Ndi|QP<_kH{q`xFT1!v! zh_&W6b|yBklTN@^sw)N`iF9}tW}D^eDaVllsp?X%@ms4k<l(8mA#|1KB-F7&Pr-`b zc)<~gQ^HQsH%92guTO&0<@8H;)>xeZxn?GvtTeLiB=zCO!;$c6IeH*M{ndqxBfMJi zmB)VSXPju^)s5z3U$s}f7atZMQNB8m!%6&uOfj*4SdgBVWa*Zd_sC1@^x!Ql#c1?8 zSiAF(6t!%a1v&RV$EsYVp1oBtqjCaoGR-%u%{QZYbBXz;!hDm;8<+W}Oy00l0V;z@ z!A}>H`)OQLgl0l>Q)Z}VcKsW1<Rm6Q+eAS5<gkoLZkiu4I8=%Rqg_(dD%12b@I*B( zlm{mgKZZWFBF)-|%fSv+b%pRqAUvrs!P-G@^nvp9*ocVrO(;++hB`#=1l5`{4_#7H zb4kf2%ylBF(>&V>f^)ap)E~+Ii;+&F1PcmRS1{*MJDs)Mr{TDpBnDnq`w4>lq+516 zTM60mx)e1^stoTcqu?=YHZa^FPNjDPhg7IwqfxNK7YeKkm8@5PPD$w1yNI_b+uP(? zHCNU*-Zl}}Up1a_Zz;RCCL<#B?-nLuyeSbMKPFh`BR>a@t!h6s62=4CC-YP4kmLSo zmp-z#$Vu5HrEss6_-gJ+g5C1iBH>LEcx;zR2^VZo4__$OhNcuc|2?~${43PQHlmjD zm6hzH&iWrYXjkx?a32!53y2p{68~{s__dzGiK_J{J%y)9VV%rjg(^Ku0<cO1KD*i! zS0+OPl!mY|HoKyRzA5Ylu1Yl2k2JGl$x);yYKL0;D_Kj@Y1|C1Vbhhs^avTax#ov5 zTfv!vGU5*l3zW*7gbH@Bu<FJen384!e=a9^2_m6hni}IlCozz!g|{*dH#>mBfx1=H z04F>R<-~y;0}Z_c-HXMx3qltO+g^sWPz%S$_qZctwm%WVK(LwZDj6xCXbain>}eZe z3JNpiQ?Xj>AiV`(w8Tbii%#hkahWP!1%*m)Zb4cT%4Yx)GiC|^j5&lA(;}^y=LmLb zo@W1*D4`3prm6vKCAs7}D~E}P_*C}jCZu{(`MAQnM^#=&!m)xqxhou=InIiA!v$;9 zzSr13G$wcyrR?X>X682LfefPkN*|*8?LR>Vo1M=+b(3rL3SNW?YX8EYRwFAhP;1=e z9=3fML56KP{yD*=&OZK`T={+OVS6PWZ<S}aKhMY+K5Pr%u92uqI=stp`b9oL9kCSt zb9#*$sNb|2-i@NnBx{<4fo%mF*5KNu?zXd&NN?!f#8wM>Yg4&~SFi)ur+e2ukH9QK zSA#Uy{;_6+cW6eq-n-YP@<iY&Q#h7DKTNh~nNUuDY33n5<KR#^TjE2>Ts?+;a`m2y z8<*ngegA}9nWVOk9GRXqAF>v=(?RIUatU(4ecqTc#<Nm`y3nv??$N-uRi1ss-Y20v z<$46N|L(w-cCVgZ;VxzQ>%Dty>Hy7@YAzJ?N7ud_nk=!7_pNN^g(Xv8eyE(<dlISw zdy$I&kskNR9phIYZGU>fIx&N+EAOYxAlv^zVY!Gz{Oe$I^;VLQ-e)!d-w~Li4Z|zP zu*H~%hJR>YeH0R7HjijWW{(j_Ll4?z6XN+orYXvJQv3rw#diN$5uEM#KIbopqMp=- zc^!8cd81t~S2Z(N5r3mdjx)CfTl-`c>~TF_*S`*8wnm68vRN^hAfn|tVl2@kqefKs zj!?SMtpCbpwe}f-vqqhqhHc4~j*IoB(jaz1<969fYgEuG@Gb?esGX?}PuH9(M{kx5 zmy<7ft&d(zHcPk#JHwTBx%XV8o?nOEbV}IFfw96mWBZ8cn0H~H!?U|Qi9Zm4J%;|w zZ61FnNt%q{ASYaalw9u9XmINgz7R{y@Qx$%hO8~oKh^!OXeNtCyPBtei%d94-J*Zb z;&-wt<hRHG^2))G6Dev9rwtgfT1XQw9O_BD7emji<I&`ES3I*p|JFS2GlGP{)moJt zTwTipWORthF9^K;q4U*?*qO!{3a85XE7U*AZk(m=mfNlu!I&fb#z<ByyjqMlLn*3O z+&3AKE0jNSMac<~aA;-lt_F^ClZp*d6L7;6{V!9zd7Q1xS#zt*_#;zg#$#7kr3U0d z_&BrVzUse5+R}`M{Z-oL_$i!)7(*SYk*(}7b~SLiAP)G5=LVFjaxx&*Djcnz-k+?Q zb8!ch&RBkc>NDCiPlQTo-l3c4VonTI@5b;OifPdoT?rOOoRd%qiEM~N-waO?Drr*R zM!mz~1J%RgM)L$4Aw65w{logPH2RLn&PdRu@Oq$>958Zqlv0x^C0JPf6692%bmBTM z@+EIq$NB1w;oT9E0SGBmhyIpK$xb!+Ik}Nb{L)T!VUFN%CpVjYlC4H6H%rZn<>Rur z%FkGp-&?B>Z_N<264uPDsYxL^mWcnNvXir=vHLjfW!E$o35Qm%wohS>5dUl9uwKG$ z|MPlb5rkIo*s0!&JwiIRs$D!9-bN#^HC*6^A41gF=u_*zOhFFR2p6JbR1;7(uvN{} z-EdVm3;Kb|g%j|RQ{R4t#m({@CwrW0m8tEr=u)S;AK=*7&}!p5(3K1n`ReG)kw|u0 zz$I`0#9NVfI{e?4#~<vHJHFM^t!j+!DSR8B-n~{&!A7EN%_8%HV2mJ-Ml|{ey8_<a z{!X%VOj`M|E+R;Ug+TjW$_kY0r9C2NR@7)X_fm+$Q$uO$`}_=Lb<~;7Gc%p)rSWm| zwpIN`KbpO{N%zK8y+k;*`Uz6{<9&L7JJoqW%I2QmSuskj+1YDAcf^5kngiO}J_Z=- zd1@Or&lcCJ5j+}Q?U(RJ3?NO1R41~(s+t3ASX;5bQU_&}Yx50uF||5cr=yNIkgK%s zqy(69E4N?0^-O}IW^}N~d5*HLA{&H|faNwXc{nTOUU0Sbjff}Kx3&pMHtx={!l`O7 zpJi?b@mE5H{ZLQ&9H1FBnkcc|iTiVIcs3esqB(9?Eqhr7TwMbvD*kEi|NU^}y_;V~ z6K3;&vA*>*KbLPpA9kv}pGho8GhXWGnipixr{2_y<g}@ujfdp?Mg#-;CXuV}6m{xC z&NK;C3Y3?a%Jycs8w|0_U8O6eBp7o4U%}0HWgOa+sK%B9Im8kXVH%{sVa7+v(s3n+ z!#Oc9<64MdWAIA?S4uT)mqk=0<eVv`A)t1wE9)~yOPR!XnhJaIHi~fp*r7$afW{Tx z{t#_TDP9%mZ!1sawj<pYVF<xGMhjzn4cJ@n?QaW4`nZ;3mu`Dgcoc~unv8*nuqiL{ z(v%H;3U0`kPQ=T?3AvUVd^6$#XWr(o5PxL&qo-uuJX_!;q)hu~%ug9>JZq}@<oYCA z*;j1rsp@@x8Y!^J#L@^jV6Rt8Qb)tvb;O>MP@bmu&*(qn^Ce^;OI^ZG_D^gp?%$nE zFcBdN72Dgdp{72~+k>>F**3cRWAVkJt8jHIr5|_kO?s%iM?XDV5GuMJEw;9~t6I8k zb##1BN5}FrIG3<5OPv^s?4S&y#Cx`3FaZxWg2z?~8(QVRTfI(-P@~yX(iylbc>H9= z?a+Y{VzdKAx&2QfJz^wjs+gZZ2svN^Ml$^g9hXwt-(TbXd2EG_z82Lf1mlqebT$dT zWBAnNndq!|sAF>JDjIBm65>-DmS3y+g)ctC>8kvm;Y!@zyJJmiI34qNyUO8713OGm z!7Zr*ZMSX;z5ej@yrE{0#1v5aL(zk2<lZ0#BV0AAxQLi$b#0c@e7&ljtob92U%Nqh zYnzm=rc(_%->Q~E-M!iLrx6fx+FAf)vv0D*nR2qmMD_CxZ-v-}9}wi&k^L9AcALM* z$aQ3Ef)EO{ROWIW)fo*}`P5HtB(<D`-4YpQI6z!3gS)D?7BRel4f!{!R#ZjQ&+}*s z6!N!JyeVn^aIsfv!x*HX<O2V*Y;goXSM7$DOu}xW)zD0SKFMHtCHa|wIt$x`c{f5L zh>o?@>G8Js?Zw3%DdB=y9BrJ$q8b?s?)`&B_IO)e%WHvpiu~TSyqys>c$@U>+_zE8 zF!qTp0_Do=vlHum>UgFZ;K5b>hFKKqVpF-jib}b?v2s5(%Y94A4gOlW-^I$^XO>Hr za$o#8zG;CMjFroyoR}7@p_5^6zCI)0K@=1j%Oo()d`*9jFt6;eiX>zYp)Aj}<^6fM zus$f9Wdc737KbOzQgi<Z4rM`VK2Gp+A^BK<Oq!qy_3N()pIH_7m<!7LRHAsXSWB1D zd?>I(T}BxLarGoPyH+)Xr%;yEo~7LK1=RrY7J=1AU<F!jp{xq1a;v=h><<(e5OVPP zq<?BScQk2V+yrJ&*IdnsqaU534*4#RuuOQU%M!wt`P6{V38sc=*n@DH=fl@DX>^)2 zTBWuhkIV@3<L0;FAZgE-<P80#mW~?<6^_VQf>vd9Bujuf-x#5=8LS)FV0(iTLIUi{ zyMHn?BbiLJ6Tm2SgY;5Qh#uk9@>tL!fodHx%FB2b(F=vM)P>OzMNaw$>ds+U&Fz-{ zH10^|l&l!6C*$A02gvl+5c!|zpAI9L)p3@70I;0yV`w8}NWa^s(}3C{H8`DGqaE8p zK1lU@>urn7zo*-ur+&tp=mI<{Ut<ffj3;yA>1erpV(Mv~xrj~>bJKn?gICjaSq3$W zviVUk=CWq%#~s$Prt@UBH$h#@Z&^$3(jkX`Mr=WA)xBA93)-kkcmy9!@!Qsrcau+D z^I6Y==CYtL-8FjNaz8$9ve3-o^6loD{(rQ+4O~=J{`fz@2%}Ci>X=kiR93jQ8;NTY zR`>u?27)9=D%Q4|%i4Y|nXF9=c64&QjazNCS!T6m+xBQ%89jp-YMKvaW#yKYyB&gB zT1hdf`M*Es-aE`7TKoO}{=M>Y=bm#u=bX=Z`kc?>!c(jn^yCwQ$K8|hdMIer!#a9t z?iVd5b^RV;p>;RkHD+D8U&wSeJKcPct=S*`p(<Gq%ya<=UeE%UsnuIgrDLep?ECp7 z2S<_JcP2ZK5!B>T;ziub2TO(hbMWCX#26VWjLU9V<Q&$d8A=87OtIf3d7|i~HNCYe z5Wa!hnW8S!MkLJ9wT|J&@BJjNdH2`5y~)&4&hN4F&IrvMkKi!~=la>lWyOA9HA;TJ zAoD~$z$eT*C%F;d8gXcn5|eiX(59;ZDUvTkE#xhj(UcpG3oY=PyzW-DbtLx*PC<z* zhC8w%we6p<n0y^lbRq>zLR$;}C!M9jn-Vcn@i?jyYpTQO9^-ThCwti#nBOv%8CEfE zS+01q!vtS^ty*q7K0#5nRGpE_4Taz>{?@AKxIwv9b86^7U0NLE-7m?*!Lpx-*2cuS zCF;U-gumj$nMe<!5R8MSh|Y90izF*IB{@{i<ef9(M2RSb1-NKR8RO_}r+By!t#3ZF zg+Q8*7O~0rcbJt0D@hky2r`FqM;EC}`~HAU)5(kLIj%<gQj0?4ir^bp(KVtmCklhu zjj3E5rJU@!X(mf!f37DE&YEo6RnVWFA3`B1VS=rxKG|V%Af<v(?o`|=I_2&Uj3j^c zTnD<2eAE>&>(zy3E#$nF8bmX|rT*tJQ7;cwJ65m8e0;T(wA)NcDb-Jdq`*`Xd)s;i zbzM0nAOSLPosN*e>~NZ#5+|}Z(-pGXh$tA%4~set=cY6-g)%cWGIpwakgaKPJfrdq z?=9fdtDf8hf`GMyEl_^fjODT{LVMnSwMAdub`b(OqView^Jn8M4yhUgYvOS0h$@r= zQ^v`fxqegQ@Q+${93Jy|&fPL^*2=v3eyp7N3&BOI=m5c+-_F%vor{0_@^ZPP<30T0 zC)jruWN`P!*;RtEV1)lwnRs!p%alo8lF97BZcZ`W(`C5DoOg@K+rX$-AQu&@zkp_@ zfVy$u4`Fo&0JSPEgvTy2C{%HGso!FZ>R+EBr{o^MM++`QVj%=7;@wNl2`Y9jR65G! zpU0`Ex1(VI^5fNJIQ=jTVe0PVx9vDV8=yq)4f`Cv-%7iHptT~dp|sd4MfZUu;lAw^ zsEn^RS9)~-t$*+Fo?8FpA>Dczf6Q6rJbV$nnDZsNE8~c9bjt|vBq|P*+75BQ>k`li z+ZFR4di!xty<KefwwG$yX7(1X&LrL2#b$49xs~p%r596EO>e6Y!<+>xN%;hpV3Mj` zsusUF!f##7uRhjn*U<V}T|t~f2Op4#=)2VDp9>K+ii3xd+^8ih4-~1<Z%FS%XUJ+o zbQg91Po@9DY*Z@$F|DlIZT`q?)VR0sp4%V1SCF+5J)PYZ)~sRAm3fm%uvR^9s*V?k z``Q0Bdz`@(%eq%jl&K8MN!F0%7^A982VJysG(Mz9gZ4VqSF_N4`Jn~J<+9K#J1Z<k zp4I!N?y9(Ai}cuq)(OQ~le^u>pIfBrPlfo7K~?{=n9{<!+JoO$ZAv7H33Z`@dbNL; zB-Lw=wH)i_qCj)w)St`xPhRo|CX#4!{HZ@j6E*nj*;>K6Du~mIiZt5pR`VrY`Yek> zWss<6v}MRfmSc!j!G4&la7858z>UYHS<lxn)qEUKkAmL*BI40Rp<a~r>b(w=V6W<% zHDjmm3_q&0Eotf<@>;&zs6vm!M)kOzHQO}zvYZUW%mnGimq}u+%ev?N!n1T27oW(4 zXcitAtVcCML*J`OK&$cU3|V>8qpRIxRXc)e%{bV{NZ|v2m8R`&8D^PdE!kkg8C6u( zpFvmeJt)ybcCs-O#X|j??MSBkrGh|vx<}1iI$f3MuimMdW7`F{NE_`#;sHHlUcM5C zS-zdk??4fuhP+>P)xVxE%oe{^uy7y(K&OAsSM>0ExpY*FH*~-g^HzF1n|~Xo37RpY zFY4dRd9Y$Qe4dKwW=`(EX6BPfX^hV7--hoPK30+)uKPAb-*Vj(?GH3<-N7tFUswGd z3CT+?7MlGv;e^BGxaH?eD&c!P_!r2Z6pKSHQ2_ry2LEf)5?m+Hs_+^qqK0}Amls)j zA`je8p+Z-Q`iv{Ep>;>Zg?lBkuU0rQWuYmp7>L0E(KI^ONmtcz#&s}ha1iT(d@h9N zhB5Qh=2qII*$1n1C0-h1l1*eOQ;Rip;p5xT_nOf6YUoNs_W<4Z7vZL;cNtsZuRwjj z$!l;FjEZ9ot?UxgDglNkc$XFnxa11>KU5xGtMLWGDPSy@A6c%dV~WAd&3r)zt9o$Q z#HmgMA=yg>ISb#gP+jP<gl62&Jg^wbb~DgkK+Cv{6R4vE&sp*&9Mr4*uSpYPkh^7o ziCjrg<5pS7UD6=P{gLhqa+8<b&wP%;<CX`y@W@R?_c8cdJ<!cd5>ksOy}RTkUsGIT z@J|#J9?mGUjPjem%PfgQ6+eTcnqMcoIA=)8tZ)7q^N1)Is_(xkxl1Ccu%yDcGRC-s zyG59oiz3q)YGMnssg^;SzJWv9`kL^6+-6E>d`dVg*S+wwiE*oB6fC4iO=sa83g)x) zx8z%%;$0Z=w?57WFpFbX>x2k}x`81eMN}ZFKj_kEx|sqsugMkO;hQ0j+xD$Q{8Ty~ z&)1eHT8$YcnmAk%J5`~dMj%yxGz;om;{3d!b5AF?Xe<rZIiHZ6Lv+q3)FR2*yq|qQ zbTS{2UPQ5r{ArkLsafY~DMJ)rDtXCzDM48BkC-@hvWukE9T(3oas}{k$91zvy4WrE zDn%eDEhV}M*M=w9+^Z<o6ZPt;CqkJ?<JB9h0G#3f;rlA>B()o#%4lj<a<VMIZbwKE zbBjq9I%qEeQQ&ajf*(@S%<wax43$mFEk9b-+wz0uJ);$cJMIR1SnEaV={@>3D(l{k zKZADTBjmNEIg`#X_j}=_*?H6wGKgjVPC)NgtImSiXe#CboPDHCt$zh3|0L_;co9O6 z$<l_W<ZFQ|+f_Br?0|m{!I7N4=pMZJO;is~jHzd2R6SH85T^r?8=Zl$5Aiy>3R~5o z_qj(;g2Q{meL!McbrlO{f6K36O7;v_)wLSe(^WZNL}T+;*6)iXKYQCG*dJ{wn_nFF zjLLL%w!EvE{SI*Q$o&y;sgdOI%A=EWNM<x4TqYrAxw&5OC9V!fh}KWkaCwahLxxR= za5#}qFyVWe8I9`8bF~mK*7x9Y5M(KWMfjAR!lbPBik~x7kUqN?Z4U0nSRIx#fy?xT z!DZ|&3AvL9x0>~_P(1`%#mshVFdz+8+27OmLbq6U!d+~WeUUIA{B_}%m=D>x9mz}H zk}ioXhR_IiGY=ifOJ3qBmT<B`_(p`Z3|4)Ps2i6I35Pg0_OZYCZzES|Dp5(D5~W4$ zKN&?#9fjnpmK*RNUE3s@VlsADZ?$!umAd^@3JHCWlZQ7?lS$~iMBXoSL5%SCT>c_Z z%g%TDMkE}Pisqjs-%sW{H6iY%Dub%zV;{*ZanPJ`F0*Q6lWn0{yOFt|u?$K0=U<Ah zvPV0K6lJrU*%Qr>JUHt>53Dx=^M<kbfArwzsh_EkcBSMo{YM~~ze09^nSik+^Ctx> zTyi0+NDo$=g>F8?M|`kigi5@h<yDv;%o}Cu<A(}=O%gX2ar_X}%J;!li@{lNl}K=c zt8URx*;JOUx`QXO&u!ErffIG5UyiUU1rqxrB#U*8p%$ssB87FN`Z%qiHzq{*v^;qJ zNVK$W-Q7$8Qv^;(?J-Dy)YVeMoRz?;dqH~kwN!#*<8MNtsgPo-4-eVeN<#%TN~kkq zxd_|KLQ5o>yGg4{eYuE{7VRLj$R$#4C~%Q%M?t=$8{{<ri$MN;PmuenTVo;rhg@nK zaAF~!*9|hxvbrFr^#s|eM#e(ETOj*P$oQOHAN=(YXRzCZ2ujCQ-o20n(HMIrGZtgJ zz;UEse~}f}9b>&z9pQMQFvg`mtPTJtwqL)pAkXkbhU3O);JN(Z{s_6-%Cr*03sEQ2 zwQ*Z1v4%)ZjIHcRN~vX18D<V$1OM%Cy1~YR^TmVKKw|l!dqN#G3hFj&{83O~1E$)< z;PZNxsD&~8xmc<=Q>t)9S8=;kp`Fu2`oopI3t1?!%HAqnqWxBnba$ev?5%E$tqczk zVf7NAWBYTuuB>Y!BdPAHsjt-3eOQvzDY20K0{L=*jFZ9I*1K6G(R@B_Nm}WuTP*9Q z;2iq){KK+r?|W392jMoTEifKsF3_cPbr(O-iq|;w&tk<dk=2j0jo=d50H9!lOKRk0 ziBKp(t>dQ|Ax%qUJLsqWaASg_c7tpXz(W^-pdd9kpAb5u)s&IxIYqsjq^fRlvZeX# zfOlp{oNO6)VQNNAfOZmObnKPyvD&UzzJwrVXiS{>XYD~ixy#{SErSmiABW={A1Z27 zNLKIuK4was3pC{gNm8kxsqRZb+f7nw?5w++sw|w<s9#CFHqN@LlMpj|1YwrPbKJ>u zpsA>7f;T%FU}Gy(Bzw}BQ$g6P7+r@Qs7XFA-=ffFZeD++LN%9GaY)R0K-zg?0_}YN zY}$z-8chX7AD9ays6)r7FEA012IJMSMm@t1ytF<qwHSsh7eP;SdnYj7g14?6G)_Hw z18j+HMw@#0K~qu4T7hxW{U)`W+G7W6g0v@Uu&%V)pa<*c(gu65s6J|3;??<76}9!; zPhPc9;ImY9e`iR4zxahcE|n>ShzXEE4532OE$J)AOP^A8gM^A{Ln^R83gWH~y(`t& zr2GB+j@>xSO@r;jqn^G#rZxSgHD6OVtr3sU!gGhO&m)|nO3r{s(vQzxxv7eqf3B+H zD_Z;25`Mn=TOAGZaEHPjg_u}qGi0LHO-J9M5r<IDIJD|FB+5@w@SgQ^>6Z2kRr}&R z#%f-?qb7ODAm02hR`CocFLCiFvwlOZBs;i025Ti@RP9QhRUY$uT-5jb<oiJ5Hp%4= zN~!pu{xPa{)nQ3aJL&$zl3aGu1BWGf?4$<|OG>ko{&HASj-B+7BpqwEuvWLQhOXJE z51XmFmu9MiFJ`Z?dZ_GUd^1x!;^u1k4%dpNlu5pSYx4%9R_0Gat=`OTlQll@Hlb+} z#>^X7T$L~;ePHof31d71i@l9Tt<qVy^E7U2)meAyFLIF_c$+XC62?p&SUf#pOwPdK z@j?R)xSV<UuVKtfF^ZH)7%EINX&#w<(3N+5kl;`&&oW6So&AN_?B1B{vn2b~lD+vd zUS$>u)Y^tUPPsZ4xKw%oHOpMrCieeOZ4GVmU!US3-d~Qh5gJoRa)fM@%e3dTyr~t! zx;wCo%%#RNj$~ouyy)bQIuC^%eRCSN^@I)Z+)rIA%q>FmEvwx~RXUce08^f)oQ|5h zQ@}S)4Tsm0AyBU~BvmwqYR`h=19NNmayrXU-WT$2-V!9hbS_cavCP_mNs=L<GPE+s zUEM1Gl;1__f+E)4dhg5%qY;<<&5!*fNn(lIB}?D`GYiFY@?SpQgTN-%Mjt%a{X!J$ zMUZ3BoT24h!5wPd=g{nd4qijcB^+;)1DCaN{EJU$$^qA3k<M=R9Tmucz9_W~vTM@= zYQiap%CUyjI1L(glN4ZhbksV3mZQ{nW@wEX#Bf|d;49IUQ=`sdZ`i25IPQC{b0d{2 z#f8PZh%2=dVJh1#l|4F?t~D^SI1tV96@=F81xVHfRpT^__6!Z<Aq&RygV}@H@S}}| z4-+nw7mpC8GdyTJbe6QP)aVEg+QSd-f*YhNbqeid^dSk3b5h%Rx;9~_x54tm&A>dX z!jr0I%S}r8%?gKG6^@q*JE-uGuP<#hFA6Q=@hg|PzcMYa3~^z2kW1os%kGxl=sVWT zLPFcp8KmjPv<yUQt7U~P|B66i5-UH=VOy<q)SWM_TbVAyYy<=adPmn6gr5xpasKKw zp(Mr8om+hWw+$dx96c6>tShKXm<vgrEih9fF!L>#dTivB&@kWg_5gEbEKDh3!Tbmy zzzo&i-IvL&;{b%7sblUl^Oix8p$&Kp8<42eoqNC2u_n$8F)4vCD|>}r?4T3@@vI$b z6zk8pZ9FR~d)-19g895HN(|nnzt_q$R1|0a%)U)0y3Oq7x5nb)(h$dnnEVv{omGpg z>SG>#|5Q0*9(qFlHdU0%{ZZH6JM>}>5bfHTb-xx&4?i<z&l=se2}L$A^)K@15UeOg z)VjS6nMX$LB`hLVc~KwzXO#IT&HUq%KWrLhp+G*_n9-wdO5EUJW4I}t5n2ux%%T3n zXodo#NzNKo9S`%6gmlWO6LrF<n1mcjaO#8+F$o<4s)a!e1w_513zSDnyiEdIS#5(1 zQS)PrhzySTQ{L2!d!5#C?hMx60e~ViQ9XJO39_?x&|d&dWixBe*_^}<tY05_lURIX zkh<aPBgZK#EOQegxH}q_HE2}P`CuZc{c4D-?U392p3|9Wa-Or0kde!$kL8ozsedFG zs2zcH;Y<LS@XIQbjBm<~4tq8gyO+G}OUSHmG{$&`ty}Tpb|%w-gR(QhPw_X1LOnWc za8p!{c%aL5&44(Ovr^LdBmdM@bJ%5=QqXf0^tTSd$0jC}J~yl#kC9YTnMhb_*~`(x zD`p?Wzile2{;1F7rRkUm$%GdRElRIUDi8T~qkGnuie`%Hi?afHNV_{YEPm=B2aZrm zoyN7!AYQdEN~s`<C(cmDI9rm9i=ElUM7s!%!CW917sP|lSf@V2bo^9M3nHD_Nma<$ zC4eim?63(=-S-tU4;+-mS7MwfDN`5_Qp=1E{68DYNZj#n^b}m-cdTfyVvfK7Vu+w! z2^%@733z46a}xUX9b+V#6;2~jMmg(x?}B5xeh$0dtAC6nZ9gnF!%0-xkW<Z=W)JHT z+BlP7D0cW+Q<i(_3QUi(perLmYI*-{{iO+c#2nF%<n`$QG7-^;KXyF3^6n)LDe=ZG zat8A~%L-DK=6joR203QnfWYcGY`KF5=8L+sV#eq+Jhb+0wgnF{TYj@&W=g`=?2A1M zlDiOqG0=Rv9*2XP4KS#z24ExCipA7|{+XM8vq{PoD;LwdE1c^2@^Sv>{#h(YQ4=p{ z4-cy27@Cu_TAb#z<20xJjwg=ys5efF1XMLadNMZ|4TOs;Qfo=-g6QvX&HvYr!}E2A z*DrGuYN^F)PB&=YpAzo%Oo1jbbzE3E^_3me!<62)x?-jbE3T@|^9-Wh9ak>Idfh1z zVjX-l=0vJifrU_L6I_ImmSqbH?OTIqSX1WP2llfPy!ex4n3JF0ny@k0AKhk;v7^Nq z>|?w+?7i&mzWqTLDm)MucoONm42QD#r}HfBlY^IOIL^7A8ImY5sasIP_mry9zu^Xy z>(Ts0pWD|$mWmlV81pbzweAOTkd2KEpT-aS216}O5LoubrQtz4g>YCeM@D1wKXBD( zpAQ4*n1r#VHdm#Kz@^3^e|?&`b(jc!t1XPgl>|m8^`rU5`Julxs%I!jm+eqF3J=>G z66-~^Tcg7MzFmLce%SXq{e4f@ckr1@yFj@MYp_z4mlnY|IMBqgzX4Svp-rr23296} zzIl#w?qafQ+S~{{00nE^|CsM=!xsV<Z{wO3sUQPQYr?`ID&;rdhLxhEP=pV@444EP zjHU<+;hu`bU+9leVX8$VybxXB?UQZ%`CLpPQ6oOIZ*^!QnWdHN${Nx{AX$jJp5o^I z%jlKT!W_}0&-UZoJP(m9-i?9LZ%*5aQ#|28&jBNOErk6E^`{{_O>8+0+GvAA5}R_I zj;0(Wyy&o3yP3yH%#+ppH<Kx$=hRW4-+IqcpiAQa3HrQyj{;p1e*$z6Ggc6Dz90s# z?+Ly%IjF$QsFgiImvtbhkyIPJ{sf?7m^C__v+SbIAIHx29&500FNt;q|0~>YzptnE z+t5k;KS5Wkjsjg0j|yE*QD~JT9BP%9mUlaLf8_A_?fy%D+Q}nBo8@y=4f0>@;n4H= zzjl?XLPBI@`&{-mCv)09p!Dv4X|bw2G4?FE^r!6pLn*Z7=so55hPwlGF~yiW#7!?h zU~wDY8i&yK(3>OcTX^37H%3hf$>NqDEIe+sat;teo-z$MVLz)_G~YUfV5%CD0mYQ> zOn5UaE*XXh2}V>)qX8{SK10SOu(_FJoM*<m6q7_t7Xcv(O$`s?nod0|r|d4Y@>9*@ zH5zZ1YP?-qswO~(N8!yr=lbaLL3Rj^Ic{P%%l%-$39@fm!8JvlGuML%0yQg?q#p5c zz7dn#=az;Yt9L;(5I?(;UGwjhqlxx5|57s4;_Nhs3N1#{CU1y&2(YVaPRNtTTbr}F zt9sS_fDmw8qo!}<a{g<e$sYXD0Gf1DZ0-?VdobDmM&HygCA*vo#f)MoFAX}RLrHWH zarn+b7K9%njA`!367f*ZiBhAXvUde$sn}^>+!4IEGuS71u`777+rKWQ@P<~1?u*hz zY}LH%+V-%;trNr{{iw<?mV3A*kbH&_NafAn5w1!sQXBsOsjrjD$|~d4Fa1Oj(&<7s z#7i-6q*z*4u>no-6q6)f?DviF6q9r&1$b)cHJW=Iq<3i<%b{!Xq%(O?#XDJUJX}#B zq;-2gyoUCIx(Q!_y79+Zh&Bq-1lN*7)se$QwsnB*Cs(5pOfehRtNAZ;UDk<IYy@@X zx+rdRU_-s|I=1{wOP5L<Lw8Mvl$lM}|4J!^HTf#)*CHhT#&?a4u;j&>$rczwRdU0a z;TF_oho-nEho*S==fVj1ysKSeW#=XMr7s!hyuLpEYB#<<@8ld0uhm60lGW7O2);`y z<J24c3~JCVS5tSK@2UvGXBdI>m@3bWt@6#^#Y>eQsj{zBi8_}%uIh~NT3t*Jj;dTA z87HakZT!RpHCX878H^N{h1wc7BI-Nq?Hef9D;;BsT~x!!tOrN^x~^u+fnnmNf`r5w z&2jWWV99P|&z9cMY%bNxwCKv(t9e?D#xo=Rq^#S^2HPW@Xf7&eaVX!bUKqgzuh1pK zt;hbA|7j1a#1t8C_9Q%cdzQRi)t@^nK~(#ME_P<VE%N66+*uhoc75X;AtcJwK-fX$ zNTDw<DX2m6(;{+(q7033${(Y*L{0Rl1)@-4UMr>Tq?##c_Sz}%eumWT6cVeqw0w$| z^?d`ynOSfAu<!B7a3g}g?Iw|wDOyXTHNQ(}CX?G2r~ZT=2uP-2VsMdjL!Pk49UJo8 zq9%?TpWq^Ia8XKdQ7SyXpHYLXBwB=l;hPdsvA^$FdeSSD-=Xh;5uYnglkd?zS7&T4 zSH$BE&bMD~-4E4IC}6h6;3T{-=IN6{<994VgN)#{E+eC6(K$!F_WnpXQ0~h|2nRaI z3<s*ujo3T?FL3C<+LSv#sl<P0A<Dr~F5cM6m!eVy>4eJr9(I3Y^J<l+KjC0JRNZEM z%CvHIgnag=G(H*pmQvW6(YejaE#GonL1Mi4-16bj&HBSkzKC(D<&1Jjl;Q~5DRNE; zk3rNsHz$6N<X9}ZG3N=7+>pCFl`&M;5IBz;3d7VJsE?4TWss;4QzDSXg+*8ndxW?~ znL=2{nQu)~xn9%z8y;3madpb=zvVbRKMUPzab;IjH77nm37$5TSZH$Hl_R>V#EH5D z(bl?R*_g4|tWxJVs{Ub>68quIkIIbmh2?-J*ZA=JFdars9R!I9PR!Trmf?nLRQVv^ z2}H2oh(}6E-ybY=ww%J0$!5oq@WeT~*w=g^Yn3znK5hr|oNO&Ndx>zy`T*i9R-HBj zBq^Av*C9J0(_0%3R`#;4ZC*{8c-3f}*=goF{e&NU=>k^W&j!kVVV;$(>bYJlrMy(x zCbILUUpugyBzJgy%kf6V)P|PcHJ{^8BSy-*tWm86R-+Ag$AD<S(|#22;AIt4dxUzq zK$T9(UPy2uXRu#UsL-jN*h*|5?v(5xR$nS&s>Gb<C-ueEW368TE7F%<F@XR069M<? z5%6squ(R${*{z@Gk23fyLN%}?VZKAhTs&8#J2=VImus8_Y{+es9ZfC1jD#jNS&Ex` zGAF9JFN$9;uAyrBAja3Cuq>2Jq=K&DeV0fT46h9BU>W0XL&)%^?$4XroA4Svq%y$o z0xg1+HcvF@-<zO+bmqkOh?IrVfd3o=_>`a2=3Yl^^C{7wN5_C}!X431neBagZ1YB7 zMUe4%ax^loHUS?6&nF+qn;Hje`H0P~6zH0TZ&`OejC1@_l}|n0qBUQ+ES_+pXCIzW zKZVm<9cw1QDAZ(G<5iG_ku5^lI&9(odJjAt&uViz*;@qb4HHfgb6fw^2-MQqii3$l zkcP&%{iB@od)58=IT)}GPSj5ms*)<5mkryIu&$9E5kf%jN4?6WyvhCWsybBj%?fB7 z3FyL@wen8T%T)DeGFZ#nQRnQ%BDuLAxcxv=GiW+UdqcS?G`GlVugtknL5fMl8jTti z>(0{qAYBM1A}hf}iXCILfWBmiM^ivA%|;E4?L%|C<-)*0lvy9D?tDxfE>?H&r^Aer zQ6`~56?d}mFrN!!2qIdCoCokqr>`1ag|xrBD1Li2CCEN=lR1tp{pg~HCH_Z@O+^uq z4*R%ZK)IbP-F)X5nL_OD($h-J0_b)*r{3VqO=I9rXr`}ggX30MW5Ikkgh+ibkqu!C z+2q_R5XG=W?J>?HzM<4K61FhXmcBxzP-ZEid}rmMIml@V36`Oj3*{ur3qvgBg;XjM z<%OP#4Xzw2WiC5X8SCEF0~$deq^`!|Q0Nh`2)PCp1(*Lym^n;b*2(5xsHdn(o7LXM z?kjUg*nJ@Cw;m9+fKQsGC&ThY3l~3z1)PNny=YNfj2pKp7tpUJbp{v(H3&MI-{6b< z{VSniH6bJt4#*TdQNz}#PANl&8MP+l8wa5&M80t*Z8RK}Nx^Yx%krG%4A|0fLqgRE zH!71tH>O*1j_MR6SuU0?IO@dv(xMI>vHLKrCsb;bpOAC}lt-`iU2i9{a;NvzYn^VN zC-dW3en!uan*}q6&yO?^5IsLmAzP30Bb$URGHB5=*p?O5+yvh65J@=u!)MT(cn>C^ z_9VIpimb;;q-B(9;4UPTDA1+|(UQU~qE9It54TW`6>H*VN@PX&1wGXg7hTKeLO}F1 zRlD~9Q5XN){WyqCtholMLHIR0;HVgmV*CDVwC!6R9?qsPLe2bI+@LV|^+-fk>i|Cc zn=Xy4*8IBJG8)tRaB^3>omJU$=74cj{-ZS#o`CbPQEfugbwlpPCy;xP9;KNezJJaI zuDTm2CS_b4H4N776Vs7&vctz52Gf0g$_f~62M*4Jh|Kl;cGIQ98qBSz=S?hX^__9x zP-OK<g!zVlInC7va=?nQ!@LWLSaVZ&01flsfX8CD|3%T5A>cJq#?1Ph2r&lBYSWH` zYzk~@8GBJdXFJt5{$iE{{1g{n)majv($_p)E_@>X9O%EEo#+_<i=tFRj06D)T-Lt| z!7O4|%S&CFmj<sWn3oPjo$}=8KZuCkiCn$WST3rJ{ukFv`9&uifjNk8jbJ^$hAkB} zpJ7XDc=~z)xdPCp+;oHEfm=@TY(PRzT4QBS-JfI>&vMC{64l})VWsO}992`)o@>M` ztSv+svll-{f?S5BlDhgEQ8r*E|FX7e4Ik;W=UXlLAHtQ&EpFSc-;V+dJCP7_9kPP- z$@HAM_4x!`sj0iDjrqlbUMrP9on-A}=H}&54;Beut?QCL_;N1kS5U}g+q0$2^D+mF ze6LX}{FBVLMe@9^%y><HVdVr{A)I_iJzmRu>(@K$Th1s^^FHI)+luSAt9UuDaavWM zna0+N8O>Aqi7Rd#O5I;CvH@IWe<tl3OuHh=4gGL#0p`aui{Lg!&+%PFy4R1YO}Ox& z$IS0I6;H22mQQK-N30x;0m_NEMBNEwq1Qciy%MSDsYDO}E2+Y);}o%4>39#NL%6wu zMfKbw8;5(<CC|YRyc7V9rJ-kp8KnidCvzV_bian*>e<&2&G%D7Mu<KMBQO>tBaYYf zx(umoj8t~pc;-r|cF!@O3yw#%rJG<lRt#IWqa&+Ubm<mOigf;cOj_tX&Z1j2nJ%qD zokODAVG#5rQ^W3eA6m*cQEFEwaU_}jZc|$e;fb!IYM~VGc^e0tFZMD?et}}?9OT`| z`Hc>z%b(^5CKIzt>S6XW1%*@*Q;q>*OaT~ceIdEy5G7i9hq?;?pAu*7S~002-mP%< zKAxdz8{uz;&rxfcrR9y4BkJY~9<r?ZWik2&iACw^m50K}XSI7xwe>-CVi8U?aAdpv zdwwVm6{zB{b`i~aP^3CAn6_GI-Ar_ibEQV~d7cG2%Uu(5vAm#}(mu8sQrU(Nw)Def zD3_}}1C`ST$M;+!z_p^YQJPtAahz}fh}*wlo)@PZD4w+ptqpHJKjgTsm%0i|XdHn4 z>eF!eH(@Qt?kG2Nm&5PjRFQp1++(VH$XPC@WPH#8?L%8pC(s+1f0OWk&@pI!x*e+) zX<FB(=jD@hB3emebXN~F2_eTxwJWqByyI&&x+UT3E-qmJO8pIP6}}GMM+$d&K9unR zix}0yH)u+t;5s3rmZ0bhLYZ9yrBIogAshS;g*(1p5?)X@O?)1k%+uDC($F<-(~3ve zxA4L^gb=}k4qUGKMSr>kkIcgg2_PJY^Gb;b&`^~jJJ9d#MwDS|liRK;bpzV11~}~o zV5DE&NfvdnonPh_C0f-eU82=0@%ALE$-W_&*a#a*J<5f^Y#J`8LT1Zo)*mV%%B()v zao`)`S$|_v;PAaRqiRR5VQty}nV&f)mAk`X`-*tg4Fw`%jWtZpHFAimr3nP~TNfOY zq9*bNf`n?!OJ#U7BpPg~H*|?BY&7gp+1nSy4_jxHqL=Xp|EHLmhTI#~?Aa`Y!c+n` z6VpVC*O6#oY9ynBN)L+(<f+#_mUTp&2O;XL^9%lU=10Qoo%pp(C!Bi42ZfZzcU64w zILv*_m!(tBY0Alno7QOMp7jX}?<l#6isR|Z-RGjC=N{CQ<0Us!kG8S?y>hqVI1r{0 z0h0@PaS^Bp$F#XAOR=xX8!GG(Q3yGDk*Ar~x=2P--Z?+9NLjmC#M6}5KdMM^DL(Hz zY1gbywPG4;8_J&jzJ%M`mF(nKvN5NrZE+UeT8g1)k<d=pd!PtCLJ`iakb8|>RE*6< z>bTPYf#A%Fso{n%B04bQ3nfLyEH|~Zj3EOZq3c~CUpoL~%seyY7NbcblB9%u<Qqye z`WBS}eavy^s(U~-#B>J}Q*ID#sIDL~(tH>~B&sYSSqg^8W*oiM)lQYoRc)e}!1$-Y z*c<L^!=Pj+H{AlmuF8qxPy+x(s3;4JoRrpWwcso{GV~TY)P#GDz!jnvB8u)}O&}em zn{qob30w8aK@fw)<**BAEb)69wVK4QzFiH`)vROeBFYp8f9PxLnv;b&q~0WcO(gll zm}KoXm(!&t8o~?RvY40a8PQqph{~e3cF~bJB=r1*REWK06Vm(}hQPoY0@<hTj*sxL zB3v$Y`=hun*np)t4IEnjt<B^zik-4;mm24k8KZ&=hj++_-t4+FgX8;j>NCJu=SpIH z#?u6og#h6X_aHc{&Da88SHuYZR*%sc(kc?d0S~Yox^oo%L2)<=5N`MP1={}afhPLi zMvRQ5cpP0S)Jh>5(^E?!-~K{Tx#AC#X1uBk%7iK|W}ca?P^<C1ptoFgk(@9HxgnY~ zgkyogRI8BcHQo543n&XTlqd-H**!f1$N?Z+$$&3T>@ujz0#9U~HB2$Zey~i`*?F3& z_&pHKRrX`okU7wFk!wgou3QjhuCg6L0C%bkvjZr4_Ya<f!>EEzk!ST%1=L9v{l7~+ zHt`_y(rxlZ+%0`1Cb^1hIuI^gvj3+4RQEgZvHtRxL%kh^zIIa)3Tw-P6r3`QK^ZDF zJ07K$-oXM-%a^jkr?_>*E3Ll~b&cxIkC`STtNAfB*(RV|>a)op*<~C{bJ_F7yt0oF zmFf^HLG(6fm<MrpZOW7`$qK`pC&SynQ|3h%2j`#s?%{_1Xg3bdO=P1EIZqGJ#B$BO zxsQ)>JBLMKD|zK{sG{WM^fx)PyOg}BTn7lc;!s~lWsbT=>cl9fAQBx&%V_K6ws|aR zjrtO1_V76Ap-fKAR!IXugspP*hp}vxTZFB$@k}N-_Mc>=y>>bEomEcebtrEL%SvJ+ z$RviS2!4Uj|NAJ>7{11>2220+jqWwzNA{U(0b!ZEunqYaA%x_RMwEewqrR$tcx2_M zBK7y)A_sE&XFEB(^@gTRA=Lny+LhTG9yv$uhehfS(fN&wQe`4GuV=8W-Sx1Of6PC6 zI{6uc?nB?K@8Y<+=#{fx<R|u7uuE<Tz6Y$tk3qKEb+!amiwd$mWCrX=}QOlBfS` zXQ?VdZXBhtVa|t0HaXU`LX1Shjm>7V0>my`+{JQiB(KeL&WUhTw0Nx({<A}sev4nq z^{M^~#myM;Hvrj`R;s+xxGvU~K2h0&XhF}Q<85Y56zD_kJ%WBw(04fK@HMiVd&2XG zNaG3*hfKyJU`F^H_JTCkygMAWs_(*f_XYkufFle1C>z1{=zPp1aN{k4hC&lP&uwbC zaMP)uEc>QAln13eQthPyYz2B3KKVQr`!@&lVrR~y$BK50=*HmH;6E4QUB62=29hJP zo97pC9^8&80MmiRbB$~nk83EhmunwJZIOG}t%sQH(STO~nEexqAbc!PBis3ZCb4}L zq(y4^jNj@ksRa`VPu(3-ORm&%kfI@+HK<27gC<$41+C)$Vx%EAx;BF#+3eI0QCwhg z?Nj}8zQxg%c{B~Uv6pB@B!+L^%jH>Z2BPc%Rt0<aM^`W*wt{z;MOQF3s)98aLXpd5 zL*4Xy3;Z87__-!{e?v<6bm1I?YB3FRU_^Hb7SR2JE~=It;K=6j*H_|Joz0t!w$gnP zm-!#Fs{b5{scR!T3jDWXGWr*#ItYr8#}&k5Y~0aoxR;@AF1L;b)dsy1CZ*6zdcvmc zjSKYsBkCfeb#c|Pdsr28h!Cis@djN3<qRbptu;|etyYT2PSDCwmv9G`Vx>iDx4gow z6_Kb3^K2`T$!w+xOfzZ55-_8yTiulePSt=Uj-u<l>f?4?BG2}Uw8@liw}?wz10-fu zr25*+j78oS&!mvEE-R(V#fA1M@|SZL%s#ZBc_ud`^lR^xPr(Xru)>4*TDA`ETjpg; zlkM&UyI`brsEIph_+eKr8WYBgOFz>AVOgctlQ$L-a|lbMt!m*T7^QMXz%r0+QQ!8T z$-+Y#)=`MejuquOVhKgbW7dg-67xnR9UaQgP+>|CQ?PU5Xcw3DxS#{F;v$y>yo7V) zu6tEh&v|r1gD==~NG}|z0y017Q$or2T-j1xnR<w_EO%_7RcIgB&}VxCA4Shl?PNTy zCiL&I36Y*1FDN=<&kAFE_IMZAK|O+{Zu8oF2G{1$c<#)FUM6Pzum%b4<gP_}lm*oo zHAiWPzcoc`ajAs8v}KVe`RR_ARr9GH{{~lyT*K58kf|Uhw;jgPIb`sMo!6bd<KM6n z7J1ZG;{H-1lKG~n%<zC)78n)W=@fQlOFr`T+A-ThB-T9Y;Cff+Mrr<=?8f=08x6@% zH}V4)mE4N*JPGw#xm?;|)OK8pU054-N_lYpJN+AkJ<-lA8AY`OsK7K`skb;KC73{x zk=q)afL#Z6Q~gk^u!T>UZW9znn>dz~B{Ue<cNkMUi`Absak9;5MBAeIlts={E->=E zX!m%g2{&41b@YkEeB*z7!tivf#~^#n6NwG~^nOgHm%g#6CE1O!!0rdnPd4MC;!^c@ zo!bqGHTOSyd(~J^)1paBMJLy_I)uk~t(>zOEh&BR-6OU@n;K0yCu>?A`^h2rmc9XO z-lpi*qlV03xvY0LR*tTVmrKNOX@?aPstreK3@;ZWPjHsvVq{$?qV7i!GvX3cJuZue zK#ffNc=bFx2Xc<XZnbDF$ng{r$gZNU!w?mFRUI3RsCRb^_Nd$1Xdu^L`Cl8>ay$u7 zQq?iL)kFa)TOm_fhf%_H$QiPc=`CN+Z!r-v>D+Um5X&RPW-kCo?ePq{&d0|4`3KSY z{_*cfJ{deg+V_0YB(gp}3)9q}xQJVX?owXWbHI+=_O|KVLiI7eQP(x~+&;)UeeB73 zBNUf?;X6HFU-+&Dj7e(f3tvD35(r-N%4lEsPQ3Wra5Ug)5y0C`z!558%LMyaCu-m* zed%*aB`H0zYWvATkpsw-joX*ILGro4bJ*o>9<cSzjv;lax6ZdNcd{~imPkd5)sF+H zEmn^YIbX2F>e{elPRi?jJ;L|cklWFA*C_-J+S?hn#p%beyx+k=cWsk!fVF(?E4dhO zWJZK{1DURJUE-`1QG0CSvmzVplEYiGN$U#`VFY~v_kXzWT!PS22%}|rGBg#knFFnx zqT@+mz`|G$sV{cnlbNJ%YtMeAZ)=TT%N#rGw)PvEt>%zs9-4Xs=&qXpt|9B?8mnG2 zaR>$5@IyS?O~b$9O|jmQhajr-U!zLLh~#OjUWrMxwa1m1@!o;3Y9Li#$HeN<TyG8U zMX#efTO;d8_Ooh_QxseWy#>a)o2=*?yq%-i&Jk^PGNZBiL#B2Vprv-UX#0^EK<n)s z-Aq83;lhjels7g%84I)BE)i|h5d$-0tJQol+ORDrVsgy2b41%#m^N9KZVWRe#rQxg zw4lKqoGA9Yp@}KMabEQVZgNd68NCE$55Zb9BGo=Y&ilyCv3u&&m{j2-x;UTVBEmZD zBurSS+Vz+$Dm<~dkn^a|pgeIVtraw5&a&7ox<=NLW}jdqkT2We*IzO*xcR_Y6=n>} zq)+DC{syO39X3$rbsPF@laM!9bS7*J50IU1*)9r2Cd(Z=nJnm*-O!@<JVsWtJdPFD zUTA!Zb=%^v*=4(|+x|&$#Fge^?!zunMvP!vMBi2+avL<7L;3DvF{;29mxo(`EQRQE zn$VO{2>o)F-M8-fVsY>=^Q7yBX(AS>D=6&*r7l5fr=V2wfl^&9-4XlLGH!F+!MG)I zx7>0Lm${MLE(sMW)EeSf>vmgOR&0Dz3}qlWJB!rPuh@goke}d`@@DDfQu<seJyJcZ zON;j~Sre_JyVPq1jbb_KE<=X5r#O^9LOsb+7roh<k2=H2FLdZ=jr_a}765#L^&&J{ z#ho3t-Atn?^Q{W?z3Pic9@zHqh-Ab&`EB!v%rnrnA#tVfhP;E2+cv3Zn{C1cRA>`7 zP6jPZbgAD%i-9sx2e9EiVZ*b4sj+OirYjUR2T-!HsBO`#q6w6+PH){|6q=0>%0kcP zU}0~Ds#fY9rc@|bg<e+Z`b&)E#P@_A!mDUrN-3B8f;P2=EO=oPTCiPcLH~5hvpia^ z@nb5IygUGFBt%?iuDUyLw@KjzVWLZKQ=?x(&jGhMEGYF>bCOl(9yL?fxkqZd``y^u zlp3pR>!LghI`)t0?c`9|G~b5MrcTrl+5|$WhLF5?9zE9ts_yCtA-@meHdP!xq~dZx zI|gnq3QkdK(KX_|L(SrkmOF-Cxcpd+5ZJP<I3!YqyNKBkz7ApAZZ(#7+s9(dPE9Ia zBfguK{Z_b;%E%x(2~%N(Pr~2aB-g%spZX!ZVlqOFEk){g*HVYLTtt|euz6taE}^tL zu=y`lYcgedqza!P=xYyFcL>zmpC$~g6`!kG*H(2q5=TM&%^4!chlIa*1TS4ZJqr>4 z94sgxwDov(D91b6JD*p^uKjJi@t!Fc$G`=+<Sf{Ui=xS2;g`BpbrRrA971$J{hqGM z*AgKNSCf)8!K`@`2bnsZ%uGZrVpU^-!N(%?8@{$EAsv@r0*iy)Y=HX1V~H~My=NPN zOZisOSo7LxBG3`Fm5N6HYhvc%sM;4=F0EC=aDO)&3vvjJ&@*C1WAxLc!xzIWjf6*G zs%hS3S?D#f^D&Z1AE>?!5#x8cSeS(U%f;Xat_!oEnB3fMkumAG(l!6I)}9qtT1`jZ zAnQgeJG>$6gC>>vFOz711z8-vhSBa&mooXqVWx?P>x6B+QQiL=rvn!&32X>@ZV4d) z7pp^jN<2ut=2B`?OLxdpGK<!~t*6QfMsBCS9<6xz`GZnn&S<5WUR2eRY!@q*V(^su zgJv;N7wMZ81s+yeNmOMgL{(Pu(<|G%{pgh;HAi%0_ALzS&u-)sQqJnz-W|Gc$%NZ1 z=p;b+wXyxFjjdv4SBKcibj0${KDS0kMnt_yHEhoJ@UdLozt<+@7!v&Wcc|5?#c^zh zn)-Seau%FK3r=(Yl!Wq!sreAhOF=>g*}16^ErRAoWYZ@5=Co}Lqh{ayOWsUwku7R3 zm9`wLy(u;S_94Bm&78Aw^AUvX=_mtRwu4<l_S0ytF(HLhOL%|YA~;L;N_Qrt8oT(O z-R3(cIMvBpFoj3UNj25@xi}_xlB8w$1_V=D`r&+1e$8{?;9)9`I78!{&9|~r*fxrt z*?oMYjLEK=-={mO&dt8Yg*n+brA+sDc2myDrkwOR{;<FBCLe?myiJuqaUk4si7`Nm z`BIw3q{lUlC8NwPeh}3SGmn<Dvd^)h4JH4Pq1~mD5LGx0SIrIS#N5H26k(*Pui+{y zktV3+ntpSsPd_v7V&m(6dkFQN?>@C~+jLE8($R3c1ufRYaJvCuQc)Cc@A~Th58P(N z;&uTXS&fa12yQdFaJ#ZD-eKZ4L*q6B+>+76E&00Rb}spk46QG9S-8#U3AY(>YPhDa zU1|x)lzXm)+f{ok+#(OX@MyT5_v;>T`&${ASlqsf2KN8^c?(?{J#R1ngM?*Zwt6DC zMS<F$w`1^fY~t3VaZ6B>v1BxHOTO;7?N9zALu;?)<TmH6rzhNc;?#RG)M#Q21)1PB zig%j`HhSjW{^w&Ms$zJzpU9_Z-mSmYYpP76r=5bjOwIL!utPd198g>n^u=$8(UH6| zw^K}QwKtUnET1G()!tIrZ|&-Q8m1F-Z8EG?4VAf~)#=*R75Js(tUbA;Oirs-Ax6(U z6V#&Qijlso^Bh-P%V`2C1i>#1<1y~+gzBUcczvBMTO`|*b}~Uo=>1t6o#ABv29ep1 zr9Uu|j2WJq8);MKoL63wO|hFFG4b3z@K;Q(-5bTA`Uw~hPpn^y=25>-`m$rYm3ISD z$$>S$2ShL9Mpw&m1XR<VbQ<5aprGPG8OX@O4c2uvHw|(a^PTK~xKg2Fyvj@!_cqr% zTl!)l<_undVb>z&K?+W|QYAN7dk=peNyhsvPGh?fui@^;TOf?h{FJP6m#;dKZ2<m7 z$k&T}W6cJ98!UFUOvg=*F)--K9_R8oae{c9ZpA#a6~POP5*OeI>xLmFO`_^@%i~Tz zJoV5HXE2UdA!DB?4iQ2Vy~Pr3RVAUlQ(j(kqc<*jNdnB4=D)L<*W4sO+hki$geN~2 z_G!)aUWX5@CU0D6Q=ZqMdQXJYB%d)|td`Bz8|Uk7<m;EJIo6BsSi{vc#!Cc(wjzo; z)H@RDG|#oH(2G+Wz5*(axl}4})mm6yEsJzT+`H|H9*`o5x}HHc*i)?vj~AfW`QZUt z4@36#&g3N*vN6D6Hk))TMPgb|OeIEQYy%u-{UfQVX@VEw4#tRmkQkS!=RT6vBe2m# zyUv*(977;u*wC6CwsA8PhUIwAZkD54+d*SIUUL(gRv#D#d_%(5xd4P9K5UHCR9_W> z#xiv|FvV1~-1wnN97V5-C<BUo-07&ATVhnW5W?W52L`y&C|Xg8!iAr;1!v>j_GwRU zJ6!Di4kM>CMBp+M`p6V4P_hg*WFOLsheQ(ZC71Wkgxn5h?N?>$Q6V0x70%krVR+ZU z@SZu1rT78NGN=&z@hz8&;Jy#Zg$m4GA$N3x7D!t-_i4^<Y0e&LPMhA2Bno)}?pXK4 zG^b!^5dTqTkdtlMhgwc#o@a0LB}oLfww5Gh5WzZG=B)_@Dtj{;*uIa;R3F{CoyLq^ z(z?IVI@)$VZBtob%wm^;dSpjpQr7_=Z-jD7Y%xvV%10e`y+|E+Gtps_r0^-bm-*+H z3`zGg+xe)=K=o;Ee(MJ&8t|oe7&pIx%y8Tx%2$Cba{yzMy3!dgX`(q<RG*#P^nYBb zYqbU|Rz*TfH;6xdQ`%t9xEpR4(~T5M@lQAsU9)kWF6@DY8d1c$3+DK;3Erj1G)(4s z^B~dj5!O146x<x3WQbTkR48Vw%0*~V$%e`tQ!6DQ-y6Q%12#0D`r}=K4SYtxs4nJ~ zB05$!tNPl^SXT9#-8K*W*k&1J&$8S!+7Mw_pKwkW!#a2h%dtt7f$Vjunv-+*cwI%$ z4jZq@d_2k+7xz?VbW|CRx%{e=@~ckBuS&_UO31GoApCE+)SxV+ea5s16G`(o^lJZ9 z`XY=u&9?imi`T~%&lLkDocnOBfO|7Em|JDNp|2|3a@}gn19G>9Th03^=Jzq8%6r$} z_+G$?tZw10tSCGsRc>ijxMg!k;8Et5sPdn#*XM78Oaq&{=GJ%1%im-sTa5CrwaBX_ zMVvZR^`-N2q5k|s29wCAxh~>Nx*ZEX)11&^lZW55CBnnM{Lk?4S8Wj<zFc~a%#Z5@ zBD(l&N6vRbB%j4og&CyIK1m2roRCe#C6xGI5v8Qi#3A;N9Dd~3Kc@3zy4o;P4ywz8 z<1RPyejOb5Ya?$?aNHatZ*Fkh+)&;;^2{>}7y-G*1pWFp6Szaa%hL#mCU#KkV;cc+ zWF7R&)ATwO^gp2AAJ*UHX-3)!`bAaA3U=auLcg!kdE{vXp40F0G;~CopkIt;jDUEe z4f^F73e@u~3K{Z8UCG`b3T!dI$RAbA7bCEX*PvgXMqsyom!}cfqu=F;%T4_*Pa~l8 zyF86RtA3ZK5opuz@-zbN`dywzphLgQ(+G6xcX=8C?WET)Pa`1lYlD7y8UgXq5cJE_ z2)OmTJdJ=yzsu7Ic=fwHjX;Wim*)q8RC(SjPa}|~zsu7I4AJlM#K(tzm!}apOTWw0 z2xRDYc^ZKc`dywzV3dBBrx6&f-{olpa`d}Ajlg*QE>9znuixcq1TN9<@-zZP`dyyz zi}brZjlfj>E>9ycUBAoogTUqTyjPw^;Me-QJh5of@A5PPbM?DCjlewpE>9y+rQhXg z1g_Wb@-zYq^}9TcK#hKvrx94J-{olpmg;wT8i8B%yF8iO`dywz;12yRPv*9MmnU;u zzsr-kt>5Ko1RmD!@>~{pl;={vJeLLjrr+hcEby3qm*=v;<N95m%K}g6cX=)gJgML1 zxh(LMewXL6z|;C&p34Gj^t(Kl1)kCG@>~}9yMCAFvcR+YU7pJV&*^u0E(<)*6Px6v zetD^FTFW!^vOGnIZn|mWJlicqPQSP1JQE5hO7^Puzbhw~N0dwSp1)q$+65^Q8SWK7 z(=yz@Q5a#N_QVhx=OWOds2Nuc86t{-ue}1#oPGM$_qBmhl7DMlFq4p6rwJ2O-`cR8 zKD^X=v((N1U8yZ*sp2D)>Oo)`gdWvAr5-JLqEgw#IilQUczAcKk~ahqaz2g<W{L7I z9wXs#7Y}U@qa)J`<8I4)N^dQ-JoyAI_YhJ9{}V3p7~_3?CvBA%I6m(U*S>g?{M+K> zu7p}GW<3zosDPpAz>Yp1vu<@fP1TA3qBn@MEM&7<<YOK%*ym(dyQ{7&3C(n7&u~|j zml~O<)rZdwxibil5}qOkI0Il$6_u2!ztesQw&1xfLqj)qwj85*fiT;HasGc}Vquoj zMPQGkms0HtX80QguJ3OZ(@cWw$E9trqdgOmwiSy-kF@Z*($E6Y>aF6q5#^Q=P0VZM zO{8bW$Layd8`_!zw_NlcFc?Y@bi<0J#YrvcMs-ISn$$_b1mhE$YnN1WbUEL@tOh6e zb31GW;+4}XtVTy4u*~Tw!PwQbHgXUPBQ>kqRdsynYui~cL*?-I4Ev!>-GuK%><E2d zRY0oDG!Oq6y0b`wf$n5{T*9|hWqj$PU~Ss9l&_E|I6KESD#0YASdAz2W;NDqwP|gA zzCu_ECmuN>nr6P2vCTA=-^vGJNa%U@!5Qr+SDDTo6aPv#5ItgKpt1*JlGk^e7B0~m z%e}&;_rJ%zLi1Z(<xGV#rnNQ=cNxhzmrOx;ImOEW^hV6F<Kg{C8H|4LLp(-8OloO~ zde%%$HWDK#)2xDb>m;$Yv=<J;FN?>k>e*DRT-WMctP%JVUiDWqp|AW_Wje_$A@T05 z5;@)Ax>};er*T6drMvXTE%7NWp#3gZUp1y<VGJORwjDpT3^AO~8U<Wnz0%_pDj3X{ zp!4NWp5)ol!A-gi&sYoJXGQRt{Yv+yCs=3D{^F4HS;*5A^@-^v`v}n9jfM8(%jhAL zB=s`V{*?w81LQv9(h^_X=yBW9-zPf{PY}xUM`Yqob&U<4+@adjkfpJI*Weal8ls)u zxR}O`yv@eyP`~1$YD*PLdAFqs%U?Vcu4ow|tbXSz_|Z7xy5%K8HS&AFokF>rf|aYt z2BLRqsyMo~sw*S4!4x!QmmR7d7KB}!;=P5~QyuD|`=|i>;H_%P*%%*gRf`IpBD)gt z-CZHEPVG?l-O*L)f9iCl>%~y&NMU4#)D_9fOWZ6gPeRAsb|>qI^Ki~e)}HFMMHnBV zy<#o8zM;H)+^PmT!eYkdpS7K<yu%C>b4)0AJMu$F)#V~pr9ixzfXp~luwCwa>LPBx zdWBNU1JrVaKrwUQ>}v;#!84yWHfnA=)zs-{gyg;iY7lyMsOc};63;eO#Ji2{gD*(O zlb4*y7A7m01%OzQn-cgkGLqK@{It)%CkZE`$%};^#>jfHrkA&>`2~Vg-(}$R(^Y!; zO~Mu}^X)9pqKWKVVOR2s`uO_c0g0e6BtAp`4fo|^{hoO1tJC_LtiL8$UtQ)`)F3su zDXEL519Pg#_<K*Tj7wh85Wi{oasgZOX?%u$5x5QYpT^stoz`an^Etu(?6N+)!Ud@` zJ0&C0(bB&%ZZhv~-fJEapbTz@nlb^Ylr<%HuGL6djNN^B<}~imDGm&Xub0^{Y?HYU z?+(2t{@gjK7uF>)(8{`_<hDZKd$CUcD7$e{YIbhxqJG0*J<Vth>d!5`hw^Kc<S>?t z)EyF<$uz7X3)RfrJ;?1BqRP3)aEw|dldP&=j%k|>oCH`{S*to&eaVXtF?v+}^b1Lj z1G^}iyu4Yy1O#HXhL{|BpD&|Uoyy`(Ub30@tW|XkXY%sb<$XqL@^Vf5t&-(zj7uqD zo7$-U{G2S`jiJ|e(?F5MzxljgC&!b62z}()uI7`+$lWf=13N`|ARtZh&)N$Tc2eTF zdsvCrL&5~Bcc~F&GGme#Z=hyl+lJgd)a_8|ugm1|4K|ji(%vPT79GQ7hPM?54(13F z0(%8LuIz$6$)OMhWX+AijB%Sfb)sI?eZmE;;Q}R<%BpD@N}OP0sdT<FzL((hvg|j5 zF5K&D-NL%D`}%qs4c~5~dKWMrDAh2|wH)&Qc5MWQtEH~$R`7eTv^N@?w_F7!(Y%<? zCT@UJc<X_%{}E{_kvaE<G$KpF^AT~@t4Yra9_s~zOP|vigjJqWBH9-l)o>Dx+>L_3 zErP(@ojF;#dvE%g)u0cbw;HqvHbbieu1icqRxl^k#Ty{6EuV58EO5f26#>6aZ_dJ1 zV}5^^Wb1^qsn`GBwJjfbRvP3xRaEL^t9VS!zWac1kKko!e)n?SK35BVYFxolu<X%F z?6I;=2HvXdRJ2d+U3qd;Wy=n$?BJifDoZU=r}SJI+UH;GK;RgBqpvV8{j<b8RTb&j zceJxerKRC3m3e`Vg{6V3F7F2$17`Ejn>2DNtLh$?6`KbLBNvJpEezr&Z3KT565EgS zh?SK25h_6vr1VrN?IUb^^5VPn=nHdVe~nz@;**#7BR`x~u2J`Y#@DKAE4{3hk|I^U z9%F&^?vhG)t{bTb=1bvJwQ^59!LD?ajBRS|3av_Up_rgBHec%_$t97&YvlA$hseil z(FemTqvgCZzi<DWv{o&pfwjlbK$L-*@EBb8QU_8obs0nF)}=Y-+(P^6K9KI#(-_fx z`oKuc42xS2riSU+V{C1sZp~&jo+ZrTcv>m4CPJ&<eUDVWSvTZDUHJq0RC@m!@kXK7 zQ1&)0^$1o2j$pAHWpc}{XYyM~j{Uoium6EXzLYjVIk9W2R0wu)4U8kj#rXX$SgiW4 zg#yxv$uHCgbGNF4_uE-s6)HWH`>^=w3(33MK%DikZ!6!ZWT$fR(=f#A1*C0ni8iX9 z-h>ESqM#bT7UvgR2o@yGX+mt>d^sSjW@}P->j`2L1X{RSYJx^~2%<drM>*{99L8<3 zc^HoD?a9ka7+azR$*#6!fAZpS{2aDDIHf~;*PE^|+8rfj=2AoR=R-&nnTT3dXRn&_ zw7n2^tBZIyb$|A%+BJIB<%*Y&{SYEXj@PK!4#wn&=%2k|QLiw*3pP|I8rz0#O!z>u zePsx}vKtiaRbzGWss_=|@+DbpWutM$0WN6OtqC1VKB`I%=eGN++nvUT$+rj=ZIY=? zH9TdvX|H;o_m;~=k!W5_D>f_|XKW)Bu`@I&ZsM>8!j5v>Ac&OXsKdw@>g!OyoFIl# zZFr`<jCQk8tDg%+Rj?bn(_5<UUnbMG4T~yi_FkIZri`cc=69<cqIiSVW=!G+rx($s z`!_Z}%y2OxB3y+MKPd8R)E#!oL~KcA9$}DH#O-hU;P&v++)ie!(-_&3U|i?YPAfky zBfML?`us^tvU&;S%VdjfRonPxOIDN2Hk`pWf)fKRTivF%{R0GTjM3210@mRI@yz<( zETInBP%*ilOzl*S<79V<h+1D|kAXhJzt23UDQ}GtwZ329C2Ga9=21kgkB;v_)cR0^ zDQayCGDi@#0wPM(%C8<ot++b)FGQ^xMmJF_-@1!ht!&*yt$aO_sFhay??tWYh+5N& z)XH2_)S4bEYL%aw@7g75MGpp1Yr2S9(;aI48=^OWsCB3%YE8FAt?6-=sFg2T)QZ}S z7PV3;L2xXh*7T+M>3jv0C2B<j<{ChXsFjKkwb~VJUrG@~t<+<RS^=v?t^7sQiYm?# zMXkC4B5I9lfm_;*s5QC)B5I}n+0@iDA>9<Up7*+lS}%I-D5BOGPnn|DvtMVU(*hW| z5y%`ib-&gj>9SAgHIK>iFt1<galJ9YTEY6&Evjwma<9yIU#t??LMemnv}dKZ6vD2E zHeA;-M!eUQ+rc`PMNBg!RMtD?<x6urV%9NkWIq-S2H7o+ql%j94o6j?y^@vcrJJhs zZgReEYE?SWC?RWE357LNBz8Tl<q-n2<W978eC>h<X$LK!dL%aj0Ts@cm-T9HJJM?I z{c6{0rm06+%^&9Uu$tecxSUH139=-s84yvcnO{AuW@O|4#cI|tx~*oubzjX^wr;DL zuSZ(VwBmoinlo6<8AWRA7;`me#I9!f*=;qWdBtkZkky>wP#adu>BVZsS+rK1$go#) zhP|5kqE|DDT6#58YUl0XSXOh!()<j)nn~1(6X;x30a8{o6|tJ_iXN0AtY+#lS2JMs zYUVGi8Rf4du4df;S<O)`NS1c9nxh*atC{-GrKY9{8RlyK<IA#|Z+z(}tND+QnXCDV zm%CPTcMYWehif3+ewYSQ|A+?C%a0tcf%I3t+2`aZf7NGov<A`@n1uDDfpi%IYil6Q z{}Bx&OMkciMf2X=X6x^M@feXRp_`zFi=KzCf>$D(T_NcH9eB|uHF;ifY{Hm&u}+or z>_y(H6H1JewWi2#UJ^}_k$^2X4rNz(eP7^mNo&lHSP%6xQk@`4+QFz+QN7S^fK;lD z-N<vGjy$T9B+ZS54uK5G{3vT?s;O46Af*yV2`;rV4pppNS92P~AbS&D#33^})Eov} zwpUr=4?LpLhjybEtKD3}qq~zsJ0X-xi<)2IPg!_@)_xrkRc0<_$j^>6SZJRdmyz$z z?w1_8Pl`3y^2AKDz>_t`y=b_|t_#>Eq02hdvWI1+p{z?%wYUW-6>r)J#Vsg2cv_0g zGS%gjk!p3hHYxW4<)q;gACyQ{<^k}<Y8p`hb%pXtBFewjr_y?y5R{I(3=iBzB`pcX z8VT&QcRDm0T23Gs8Y*hr)MvYB2Yhf*tjckUVpT)MOdanGzP0wqzwrfY+-0B5cdC;% zp`eq97N7Qzh+|jm3i=gc-=l8)7%IO>{SQL|15@jEAkGkxh8q5{@ZsHDLL;_~1JLF# zQkYs1a^9`Zrj~O5Y<$bj_Gr6p&BZ>N(q3Bf3w>vsYI}z-8nn?qH`Vq64;{W}uH~D( zXdZj`uthU3{9X4&bGlHK@BIZ_6?Du-Z*O*Xg1v0s6uca+xEJXs?ET4W59^$e%UY2N zqN`^`Di^HLGBuc@LMulpQbmfQpx1NJ;kxMV=cVYN=%QkdawRu2F_3?iWXnKavy^p% zy{yS_GEuxXW*4~T_fpUQgZ&kc0RDrn`3czTX7RQ6upQa!79?QV%Cup*ElNpfsB{$V z__z9QI>b;Rb{(C@C!tbT!{_mn6B>(H{vjt05H=U9$xi?dCdK*`k|!5sA6#&*cpRG5 z;Rrd8BZ%v8(wW^74Qtr8;v!WL=*<>GDoa#o3^iIltWR$l&0V9=)9?i*m&ug-?r}Le zOhARAQq&o8rxYi2l&L+W2t@XPBK5-(DSZ|>XHGK(FLlo`G7wIvt22yod0rSLrm<DA zmI#QUx%Z_hQ>F~kIN1zJ{<1q3CD|X$cWI2oW5^@OAO;OVO^I|d&Blh{;tO!GA%cr- z#VSwQOy@0J5VB*zND~uT^eEkGx3PIx0bB+(PMU6Eg1!hYGIVd!TQWn=6_nWjn1us2 z1{(*X5MSI~q&^~vD5J%2Iu0$4puohy+GkA+#Np>44?hRp`!8}EH2k)*OnB8B;5yzl zO}bgl#oZ$N&S_=g`A*ieG%Fp}1WTP?Mu+I~T=Bba!&uO3;k0;?i7X6r0~kxPYyiKI zcEoM~=8Qbr5%SRH1V@?L_jl<+*AarnNn9ToDPsVs9UokJe~jY;k>)bmdK1%E*#caw ziMR?Wt{S}#dp<0*)T5M!3>Vi2w@U@u^+6LKw+M+GT986S@_A16B|8|xPP{K9`maiL zaN3QW8N810cadd^hq<1Y=^&~qQ@;dw&7%I%%e2y4cfNF>fFxm@g?(w6`$dM2<F8g@ zOI{JAxcbG~@53w<udzOeYtucXsIdTK=|HTDKvEr$y&Zi?Uz_HlEbSwnR#JsAq<>#8 zzu~sMPAyv8%pyr+Tv33F*2ybU8C*Q{8DX9fSV);6z}YqsScm{3g^-uILkw3!L0T!g zT6o~eKH&Qb;348bb%@4*B{Y<!X|_%d<uU*xDE%>Qs);(Ar7{?!b;TWk|E046Zq9$5 zPpb*C#&M*;(S~4}Xcn;kTx!o{rk<eo(;^>UtdH{d^oKPv;Y{x=M^H4J_C7e%iiWm! zVGV^uyATv3piZ?oK(?Nt>fbk3!En-Z$Vau2{R{yW<p8bT)umeai-THOqZ8QcQbk$A zR?|oW=Xi`e&9Pc#arT<3AzGcIha3e_IrLcoLiI$zzIH^Bx`$+oe_YG}Mkn28B{5@f zkQsaL)8>pVF3#MKPoSvjdegJgA5ryW(t4sMZJ{u7^rUsG;CkU#MrQ1LNit*8A~Uv0 zeluf_p}Vradgw|W(Cp6AmH%3W@hNG||6T(!)K#2u*E+UKpR(zv!*y&IlAXPh-R3+H z$H~Lib%)?FAcf2Tm2mMyDe<~2J<+lLYv713aM$L#M2Ufb+@HeqM%!bnT9O#?CO~w# zul0sC2)ODWK(p+PO^rx5Fl@g9J!(XTob8rIq|?@jH0_o9L(Ylj&m~OCD9;7W5bkA_ zB4jo?$uR^)p|j+#EPZv3?q#YF_eablcxPiFkL;U0=nm~RwSXofZGhVTsTxOn%~FGo zP)bksF71(?9G9=xBPx!|&G5Vj4vIdB+^IZfC|U7dP7J8mW!P3eA;X59I;!dzJ)~** z#=LYR2haQ41s9mS1`GBeOGYGs$WguZ4BZx0R07m(FA}#TajJPs0>c_ANLDLX+d^ff z9wMjmKFL7F5Z1-!41%y`zI`Zdm?&+C^5S<gWqR=9=K?d)e)eCa7!y$T(T9O)9(V8a zaf^A7rASolLXT?O)<+zKVM~XmJ31D}W^T%EoSD3`p<-EssD5db;w3kGio5FfrJ-xJ zR?s}i#OhQSzf)YsNvKK~1E9~6Ux?!z3(n}6o$VYvKLu41E)}8~)Qs#Qcrpc88ZE;@ zrJcs{WXUE=qcNj1m@wNoE;yyr|E1H2pPijL>ROyAVlN<iPNrwU6`ENs4Uu~gG^*Yy zLR{-QSFaw{u$oY^{*Lt3ix%dr@PC$+u#S+%#`cEK5{zBJDXxSakgXwS-^oSA(6Q>7 z-LfCJWs%}!(~BD!cS7;%qG63itJR%44GPXq3+8%;&hQj5S6Hj7$uXZCI+@>;X760h z0mwXPNivVEVpXKGF!Ax@^Z%yFmmj6c<A1ctr~Y`8!?5f0TD6+owSe?N9HoBs;OWR| zY?qbYPwuFEy>z9vQ2?6=)ENs%Ruax~J*N8yFXIt$|Iik3|FC!sJN_nSo;YZ1h6E@V zJOaURLBebAL&mW}qs%tEgJ)-Z`_Au;rS)4kX&or$hsWsGm4dP8vsMZ&H4Rr+3T0O4 z6kB6RCRdl%P}PO;*=-2ws?RnqdA1XkBTl(gTLmeuP;`(uIIBj+XZt*;9ig<e@I3%v zjoR0^#NU}8biW*An(6)1=MBk0*~wfX&P2&-<<SUFi=HDr)r_iAD8Exgk|`<!+K+wm z|622Bnxryo)|!iB(s0K1s^~0A6i~vRJ7F{!-u{qJ693b@Jc;0EjHzywg#!$Pnbp5A zrVJ5Hm4xp~3~#`gkqTx9&dwe@e;_}D-sQ%|d{a-Nz_ak<X*0Dt)p8WgEcGZ+j*6*; z%EcpQAG9d(bvgnM{Cx3hy7qzazAzG1dlC?Q+M*PoJwWVgqEr{SR}b6Ra4^1jHFveu z>K8xAgr=8T6--Z^pHK=v0(Plxcbdz-GnpEfJ;K%-d#9mQI3j~J@l5L=SVSUf<~04_ z)^M0%>rlIH@8a=q;oWBOIPZXOQ|;oarFDa@yZ%5pYgE;l{#otZjoTpjvBXhu!;P(6 zJ=@ebm`Y-!2}4J?O~P|h<0v9(0MHojx@0ja{P${oP{2&9Ojie`sj<3HG)*<W0@oE? zC>kfu;vA}-lT^6&q2(KCKcC`N!(!njwnnJ5v>*0as!%R9{As*ORREg-;oNGjzt1+< z*AiDt2y03;I$r<&?|nV$-P>q;#L>kDe&L{jPRjkC9`YmX!%^kLeR>nJimLm`CwEej z7`%Tw_tR>THulS`KP9*Al-zc_o3yp?i{!`Ds0HYK)U*8{FQJc@gJ;IvL=GdFSwAWu zN;kftrX&C4tiWhw%f2La*Rd!c5g;}6i(Zbh(DEUCRgI`yng06I>V^wi?|vAx9`wI1 zWl%&p6(TM4f@Fo0V8BZhdH6SsxBOkw8HYw0E-kKj6yvEp?P*JL>{Z*y5h>8B>dl{K z>1X-T0)fz~AQ!|aoxRS1=^0E*=niyy;S{PCIOw|x%${PbScry{<Q^=!9ocuw??wIP zOE0_rt5!*aTGhYii^~b5^1R=Ao92xDnP!;vW=pGe;$AghC;HCSb(=LEzpO@7&xRz8 zj`Q`ad0mtaiDIIz7$nwfih|lLN0C}w0cX5mkElWD_1bo5Us#<7)?{v4?g&aAlDWyv zRr7i`wlE1ss=j<IR~~YT(skDre2vWZp041w@oX;&+Qzf6(~lwpdJm=B!;EKlP+S<q z_dN_l2N@6`qGUk)>Ols?rT@Q>0cjZBWI%lDE(5Z%b&~<{^++-xTJgV^0eO%C!J&Qg zOj8EriIoA#&u%gxEX0ukc|-=}aVXb#wk(kW^|xd|9$N<Fv1LGf(J~;9B?F?=jt9Z9 z$bdXc^P%04=#r>qK-h*qKkks00Z|b$AiJVfQUn<g^_Vgsz-k!~e~|%Uq<%yhkZyp; zfTCJZL?t2vif(|&fT({2H8oA}m@=TUH6jCA@PO=_NL70>o;7YYWk53?WOAEvLn3^m zkzXEZ(ppQP2*_PaU@X~L0xqde9Roa5z><nFd&0*34ROAK{`&YGDl5;spm${)M@qWD zFBEYIEJ?!0ZXl|J=^}F%{7-0H|L6q9i%Vj>I;&dqyx`nA`;urlQ~Y1Vh1?x*Nm19~ z9_Lcme#eC{FI61U>ccKIN2*F9ro=X>2-mRq`LMlk60cP1_<}l;%sS%K&3nHSzM9mL zEOoe(W=4S5QojY<Iv*h!&=ME9_d&H14JuRi(x&PR*@8^5N82s3Kf%03?9mTFK=qkM zKRFOt>1^}G9Ex~|((>ic{z(&KkHZnya2(<%-RAc~dC@OU6OSC0d;X|(Z#iq*)K1>@ z`P!z>SNr_gMYl!wSk7~|rpBVeoZRR_D)P5BdX>D`5Ft>WXIP$_uqW9a^A|;a<YRW; zo1xlwH`Ds6uFr&qNe<Ft=mJtuZr`DZ&T_sG3bXs88*TOk7q$dB=};wnvd%>vnWg1R zf(_`%EPc5Yl_}3XoEA7D<8>~t;45pY%a>?ObW1RaapK9${NXmniO)%Xa541wuS6De zrH8XkvxGs8nk#b<$$|gAh~&U_?(-0z^klV!gK~}R^C@nDpe|_kB@7`<jw!2H2i#OG ziQ?~iDD*BmcUGZ$%tC3gg|d1m^gvgkSIj~!<f10{dvg0@2B(Aw+jXw-L6Q2n8MU=I zV>4ct(!fU$Kdl5@$iQxi4vRgqEwd`%)Zy}WWSP~CD_M-O<ee}{h#E=6X$usjo*7VS zy+;RKq!P|J9fsk5D6VlPXDEWT;2X?s48pes6V=}*G0x29P6y$4ylT^{TCz4sdSxxZ zql#8Pe_S}rAKfc^Qx{*HxvC?}+tgKu`pr^VPNw+t!Jt0w&$cP5f=HTIEiuyuGL(Pl zU=nD)r1y&b;g(6Z`R=cD7T?)&(|4nmE(hjUzdjH~(N31}R(0QpQkQA#`%4qvyECV8 z4USl%O*iy*$&%Fm=DW4^)tkH8`t8!#wmuk1^QsTbG-+#zvfDc6^60j%)mdWOdhfOI zq7-Ph_4R*rwKZtM>(<sa%Z}F8{*m^$)kWRf`fb4Ohgbc)tF50LwA=d1%;>iE>7lKK zeuC22ZT%2k1RJmaxLM<+TU(t`ZH*zE%D-S)_Cz?bW-Ml&W$|Zxuv)ER;n=Lz9y8n@ zl|j!n|LY5(ejOz*-_X04rz#g}TV^!-I*tMFAhZ7hhwp6TX30bvo0;D7)raufjYQFW zUD8-ZJTaG9qLI%nm-t^7J5fi~xEN?xSkQiM+^o$=qoCDCLpvq{?QeXBf6-${9*pV; z9wR;%vcBPNi?h9~;4HY;vs#zJ<Vh#uj%COtjQq237@+d^wQHxg$ZGWOz{+Sj%}&0m zX2E-xoTiSS+y-nd=#`M!rkut!1l!)WkK`fx`gOslCI`Il3Mc@5_IP8FETYp0l0&)e zMQT5bKoEWIVTcwHxO(^XC}b1M%S5(LdWoc#sW!qV#X_d&M;7E?9)|Qt@yIatkAZwY zkS*qsxI(Z(!MzDQ2?cjmtsuY(z4G?I_aS_+-G`W)l~;{NyT+sg+-el>+Gzt9;OHCT z5_Wf(PYCJQi^3V|jYn9rI2C}mgydRWy8W2o>37n>2>VJyw`EOF>7*YOUHv5j!8#Ab zI#mBtZ~Ywo_w^nQgd<9!j(rtGXfcy4CtL*hT$vw1S!7jse7(f=*o9@;Gdx^BF5r$H zCN^o>90~Urnv|wS201ads)rup4=yy-GrWvz*}+7Z3C%&oHZ}GD1Plhln`i;xVYUhU zh<62Rr#AeuqxkZ~NXxB$xC-UTt?GdMDHvin!DE^*xo{j))!jEkTZL#5oBMsPhEny4 zcFn+&>p^hS3rt1rE<NNpE-Htd=u!W?>RS#^u&G(7(fmjzL=>Nq$adC%n$iqY8uG(m z`P!7Oy(}XQv6=bX?%;g3nfbD&DicHV(#qlFqYxkA;P;hT){TR|^fl9sW3u`%)WyO7 zbOjvz$#<FyS9<`FkVCL-z~$jysXuIm!69-@E!sTy^9~wL$RWM2GKG)o5%*%jlt}E% zZQP5!xE9N#vzuptw)B0g)ukF0@VqRLvM@Xh&9DYxkGFbO7@fn`3CDX!M<}(HG@@*G z7OgHRUaibYof^8)Y3zgLnKi>bA8S%}o|Mp{P9sSs1R7DqFNn4w<wKHjAj{{zb|>C5 zG5GCgBuNoFcWU?Cef=ApK+mrBT>FmkNf1rXkw)Jrqf`K%3Xo{~Ro`*O21=DstVp%| z=Ko{v?c<^<)5rgT0YROb$*?G?u&5}kFw8KlFdd~;Y!pN-HEYcXd$458N)&fMolZyV zlRem$wOf|kTI()Wlx2_xnyyc|hG|6`Z8yOdrlA%(-}iN&Gd!u)=llEp@qN8?IOp8Y zPuF$b*Q0QFwSlwez7G)*4Dh;UTuX@}(JzS)RJZHuS)Ch?BYX{(vajema0EJ_$aUX( z?e+6ehS%jkPmWzKK8VDe_76G}vWYD|8b<~}o1+>M1BzgVhsfwpqOy#t!mcov^Q=x` z;G9P%)iC{9e<P^hms5W|e*`*VuOsxRUTh7pi1Fq6ZA<eGs07x$IU}l}cMewIcrJ@m zNvH)dTRlbFK2Duxy~P+`uyFT%S`c+}!`V67hPMT&pybQb`M$H>Vw?wIS>N}WC8}W` z4DhzhxJoWW*>O2)qm}6#(W{rr-?rY*<khJ1IS;Da@?{kw#9wMlhSzgnmAw#y*iA6^ zDR)51&9lm#WxeL8d#(3gyr+DTqt4N_TvQ}Zpf4&qfNg_bQCW)ft%?h8%xGeUbJT&` zEyjKe5%`=3onO#2ivh$-!L!q$jBJnpoRlw!@6i=ym<>8_%0Y^~ryuJRWF<zazwt)F z@#E{eTWfMNrUH|K@fN|5|Jg|{4~|+s@v~llbHZthY|nyT8dDiwxNor-67}J~hyO00 zI+vvpzch%^=D5(j+k<K*?vwjJ3Xy(ub(h3`y*ygiv8xMeBZsf8mw$6nJ|vGSS;*RI zBk*KZ1vpn-9s`zeo9H7YdWTDh@69O89^m^{cWDwSA8{3%e}MH@rFN2ukir87#S&&$ z2M7fkxYW75#QU!B^MesVV$fA;j|ALF3@lXVcAFhly5oKca&aXbWg?a2E0B!w5%cuP z<8<>Qqp5qP-<jEPI*81*G~=V$uDMYeO*6&s5^>%If$5uA)Ug#N<rzO1Rli=^qI7c1 z@!U~8DT76iQs1s|{^gBrxEA{Gz*wKU{ub6F)tD89@Di1!t0L{YG6Y7-mR{996lkDY zy2y%Vi{AmC>dCWx!ToJb{AY59CO(NcZWAve83;Gw?9c>v8tzBXJ6f%3tGa(~n_AU0 zp7s4>tLiyhW8JvW{b8-D$lbAGp(c82)xxQ^V@kGXTBPW@#CW(#ox`&nNpDA{#e;MP zriFOMq7Nzn2_TDv{>#WjkroV1vQ|rO`=gJv(|CE*l&hpBMc8n|WW#;Mr}lE@w-%8F zI^guQjf0@Abfn7IYDZJ2XmO*+2014Tf)T^I*lJbx@KMKdZ<W}lRF2hnC=N+2Sg0V{ zy{Htjzn#Rk2AQpv)Pma(-tJ${i9;;x+^!|JhtxswYoaB$8vRiTXdB_J$ZplAI#EQo zBwAuyqXogOC?}EA2ZDTyELJ+WGc3M^(bC`&WExgFBI6>R5lq?&u~U#aBV95o#VbM0 z_MZv!i8GNsb1p;zt_e_!x<N*~e0Zqe)5}rJTdw|MRa3fW?jEYLBvIL}|EsEMI#tDT z5|>-pZR&1F%8t?IUSL`Y+Vn?>b!JDWD@Z86RhHQC2ur+MjlUm`=or*G8%uY%OCFQk z+Hj9i$vIrhesaUsGLEJk!ZTmSPv}QJOm61~1H6syz$U6jGPJ!uWnYHBaR$*Q8yyYK zi0npEXNWblc<60Z#i3{{JX|R=TzHBXLTmhZsJ6<Z_{OXJ61V%fl;0%E5+=eZ@$bD! zh@u%T_4ktyRzzK6_!SN}oK?Qi3^Wx<Q%{osGmBn|lrPG8m~GjUH@vV^cyJkbSW3V5 zuxx2>qb^(dO_cK}kqd$kd4e-s^{>%!T2f0TkJh94r@>SZyL?|t6CKO=0i|!Vs7AoP z@xzRf1fn<Nx{Mx$4W{ZPjWa*nQ^uevRpSF?R{j)~@_~<0*mp&>jyrn<y}ijJIZ{3c z4Z75)OdLzlkT%LVOogNHOhR>=U0Qq+9PB{=X4z$0wYr>55ERRGp?LKZJ+-tiL?sUm zM{nS0L}6y&Xe2N)+trXAIO@dDDK^3<=a;|O+Y{=!8e<>#n-y}+K2MY(8~QT7YKJ6- z141;MO;NTDH{DpZ4T&;!;-EM?7Uzar9tM<v&xE-~C|^+xxt_hH-?remEr}OYL#o}+ zSKj<^<s_?b=zqW}CGd1`qRSl8D-w4dMG1!M4^s`7+bH}4K53GsX1K1L5s}5mpz9f< z#vI~^ggnluoc%9a9`bNYFzOj|JfY=mqSls`yY?^78Lj4hDMvO*A0NSH=Ad|=IS3iX z9qb&zl*OmAs}C;JfQx-5(pPnP9>@=}Ctb{`n_fk@$Y<2_5YtM$0_5Gh&~@V06Qp(_ z9K&*}^e^{^Rz)=6Q?Kn?65lSbP<IAdjYQ3UY|lwa78*K~ie`w9dFr!VjSF{J5H7w< z+L$iKWc__x*7hU&j-4bFJa`bkuqEn_3wE<8emyw?7+sdM8)3JasioG;5fOxKNyC2@ z$b^K2ZK*Vbq+uB!$Ez2aE4;zqo5=Vt-mVi$C4pPRyv9Cq*Ss^SB^<M%R6ZbcTPCn$ zy;S;Kx=;#-alH|oxL18Yf#qS^*G_n%x5p?&{@^GbdZ_RMql-Bt+Tjb$JYWoM3C(Om zPdYTSk-fiZ;E|9|CH>?C^~D9M;^!TGmy)yB8;fmI;{MILmZ-u@#M!MH__r8`FF$EG zzNsu*=!dBQhQe9=!8NYtpj7lf60%Bp3NJQG#Ycm$ASOR+NpFw2;1L&Z`H8v$m91NU z`LJ%?Dw63g*$8OJkGFE9Sk*sp1=YVL@_e+SY{|7!C(Q_p@@rKD&kb`Vh}XO0kUh`B z0cyUyz0MnkD5Z%^MZSkh2|k)dWCXx~Brhfzw7e9*3|1cGvgN@sHKCq9aSJG-SZ_Hn zM~mT~w>onk<0F@h)e2xG6`ggDuuEzwuGHHzgtl;(+|6oQqbhcnEYOg8Z+<L&P`Md; z){6Scu-f7<D5FMI&kQ>ysa0!uZWtskho|*nopd*xs&*}Ii|o11m5HIreO<*h2@87m zLtU{`-=c0Ga#SbuA1OQnt6#l!zY70mz9pIkB6JoL9i=|JSI;9pPHNTLJcsk|yHC?d zmy(CUMyUaxi7Y&XlZc3rPaAYg>7HW{*>9FzS3ctkmuH<Opz+bNojX@&A1$(d)BdS8 zl!%X(R9@r?tuNf7c@N>XPt7NQI>6AJlV$ovvqH^6_B`HF9Uz$GF4_4{QQmU9R?tn9 zwqpg1ps{e-7tD+Vuv~kefGMs8ix%R0g3d>%6?MV_v{Wo^{AXCd*QG}Ctj;b4nrH>T z9+Rp6N?kw4Rqg4^-V``C(o@}~pDf*C<oM9}jbzc5RJ+L03}}fcjLB1*0)p{05m$bG z7l&hA`O2tX9tqH}Px{?M>h)>_42cSM)?Tv2yH|fuk4LS15~SrPT!QmxL%mVd$j!X) zRGo+0OjkV2IFItl|AWSt&smkJTcsy5hwYg%aAXp~D(0A0vJqRkY?@8h$s??w6*7oN zSU{GZgEWTH3bF+EtowpIKxQ`Azgar<Eg9C02{iU=51_pL3MP~%oy1u8|AF$mgA?)H zk*R%e3@D$#f){$Dv-rcYiZ{!|IfiW3KR(Bta;!N$O#VHx16ezCtnQhvci<_S`N+;A zU?bWMFrui`C>HM%(T_qbS+$9m7OCz0_3dh_=MaW#>#b`m%%Sjr@=WPWma$O&M$5ho z%!>Ei7Y#5F8YapdlL)b4W<RYyoF>*N%5f(a9y<DatTe*iE-dhj4-%R+-1`UGwfFaX zr1ym<8`(o-;_we4p+RI^@wo>>&EBjCoWK;$W^L!+6D?kY?lleZKA|R0*Q#Z=3ic$m z?srkR5^xyr%YXy7d8`dRvEgUjILFPamKi`)0c7)2`AaIT09O@OO&V-H3Vh|eJ_S3b z$|-R1>`=KMiSBo%nie8`&14P=yo`AD^WD1FF*LmRcLziB){P?tenq_cGMutW`AIRn zQPF!z(<}9%mBv`3=2gm9HJU6P*6rx~t?Lr2M%^XrqKEgeRrE~e(9+)Vs5DYJDB}Jl zPTap(vm2{=g-dNxxyP0|a;H_wDWwLtmHJw~7vUZ^c3!paFhlEkZ1J^r@o=N~N1vaL zR?)nwBz~>U`HbWVYZ=8WgICj=$;{*C1cgF)*K+K9YL)OD(KcGIH+8JKRcC}>!8AT| z*Ks!W_N#<-uJ;M#V6?irW`AesncWZ2Y0gDR@?pBLlnYYJZ<3Q1<P(51=7CTse=<Nv zEiMKMq1`Ef3%VQ@4?e9k@c}Z*T(nC5hzMZIT5R{l2bb_W)(W<lt(Kb4fR>5B5Mywh z<;|#3EuY3<2FHnOqdN68FAW$eHL8p8o@BUvYFH_LMtFB2Q5EPb&u`wTH&IRCw)GBk zzHI8ZH<fkwz#zz8ull@BeQpUSMbB(24HbinC<}G0SCbZk9<PPl9&HYbvXtX=$JO>h zF%ESv<K=!^kY7GuhX3#!hJRS@kBbkn@8sqJE&WB$SnXBm0uG1ymUMta`<Yw2H9Aiw zB>NHd;9v{5%XyyG%(F}d-<^O1^DO}<ty{8Dy-*-4s+Y4)J<f|Y2_t<R1iZF=7$KfL z8r6hhVb30o>hII6NeB~D?vkfDz^3<IpE|HyEPG)%aGKXve2h~7GyC1}R773E@M~~a zas~+f+$8whha&wa@th46U}OSsV$J8vi8hqSw@>6-6W0-7qx$hYE3=E|L@P5FV&N#p z&gm`<Q{cYKkA!kq>i3RV@SKL#NwlcWU?MF^#VAbkcITPg7PVG|W&{=fUN|Re*bOob zqH8hU`aA-Xn$|9Bigrk>yi|B1T;WyqMq5Y1f3Z$?lWxosd&aTq#fOO|CPVu?T$jaa zdedeUp?MaVi^l$WdB***#!wd*4Od=pSgb0bV5>F&Is9KtGH-CH-0$Eq$&QFG|BLL1 zzs{B&fzKBNhKheG_fyaoGBDlmRwDyWhq2YCUb|ld+bb;1lsXM2uj7dF4vDx|_2)Ts zKm0_ltLWE-{IyU(sth50a2Tv2^>13Eac<%24`3dRn<I+C+!h!ERHWU<P2y~^^F$c0 zr>K(QTk4|rEurEeImqE#LOsdc5@zvnyegs*O>W!@78VVWTlm~&TWaBSppV}BK}a2L zns-!)`3hu^?Iu(6-)wf4wle(Z?benSDiHryyd8(3b&+l`UNt=^4aW07fy;@lmeanr zxgBb|_xQCfuxtDCuhrJKLv80BzqYUK+HyP9W=jGs!{`?^tL7J!OirWpZ&5NS)D@v* zLI~3EIT5}OK*2I~FB0Tx>w3I#yFUA^x*oT*rp2kHR+{KfY?TpcU615z+v_CE)LA;} zPZU2C)25RUz$h{-`@7z%uai!~^gF;PI))iUT|)UzIT?>VVC}G4wWqKv(S0??X^*?) zOz096$KW^(b-hE6&Jlx+pHdEG{0zIP*KM$y)@gQA3>(T~H*L=tb7FSWHF<2TB3H^B zoRZ;wj)P|Ln?i7;RE`-X+A6`Ky=uvLE1aA-O0M?SQ8|IdT`KM0j4cZD6lF%qMb)GA zSI9sw9jYg(0u(Up1zyXw+v(g5nv2sJeJY1I0#eJhvxFAMK~q#UP7}<iFC<{r99R9N zawv-GB4BD6MSJn9hqX}DQH&4Hq#%9`Cf3dA3CQHLv)YWR@=2mPdijqye{H;<Dsytw zxlCgU5^q>&hn*Rl%<LL>KzOI>^&O%-;4*%${KjdzVn$hA3iG6H686SW583goMtMMu zlL}IH=LiN`fY-~2IUWQ3IN?|wgn!MXwCFK^c8AdCu7*44mGo_tr?S@R+%}p3n$8c< zucmhbcj|9t?bJomi8-FJm0vl7MPe=^cMD?+bwx`b|5Yo>e%MGzAZ(YKKc7x{fpj&a zoHa;n?$b?aev3fA%PP1Yg&4QRUJ~xQX01ZyV0p?6U_#;1W)!mXm#a7#Ba<f@biydY z-+`F20x*uN2Qr%M?PStz+!?WJ6P1{pb{PbK9VeWH)DgbCc*;Yv&u7k*eV(=_M;!Zy zdM1uKQ<U&Tz%texny%@XhWwTgKJCQo<isYKAZ!N_UN9vZ1N@hRX`tPxqYPaII~wG^ z5D#;=azB=Rmp)O6yQ{iT&m<}b4eX&w8!EKFh_Old7lzCg%spMTohoZQ5Kj81PD0(m z23~Dy46|RBLZZgN-Ao%iKIOL&g><@8i10`~8)EQyz4XWymUYlP$neGkawLX>>?IT_ zJsH{Yh2Np2hkY*13ze3j4$vWPFGOW&4G7V&1EyL>t$<0JbmwGs^Itt*3+>b$U|WQC z1zpCQ4<)uaO_w{WY-*9opYaXTdmNekPzk{<GseGI_2RlVnY`>eZ4Ts0S(k_4Vl140 zc$6YL50IeQaUwq#Mz5AcsFS6QqIi6FV|juk*4U4+5*&pYy^WDAMi<Ou+!!l4@9Qzu zh>F4dt^0kkfvOgfpMPOVJZGTp%9H!8xbB8y>VUYI`%Y^uL@0|EuC`j@x`)3=J_%@v z=(Qn@LIioVE5{1Qt~`-kP)1UY`@!!l87i*2wG11%E%uJC4DW#%SHU#F(!H`p^y!H! zX;*}Cm0i&pFi??q=c#FSB^V<dK=dw>Uj(-<e;>MmB)BjiL9+O9LKP*mwLR%JVsvEa z`1u~yZ~^W%v>g3_2yWZS(NEST0(Z3##ghs`*Gq@%djVjOO77!L%JZcwUxYPEL|8=X zh^1^9jaLjh^8&RkfkRPa=bSCz$p#!O51T%g1CCwLe`Nb0*|F_{ep8_#ZH3r&$1`P} zF5JT{s(6;(!pE4ha*nc2229*=pM8#0ydV`(617yjf_MSHXc^nMN;zlfQxq<e5H4bj zOcKPFr;_g{AEv>aJGF~c;oHhZy**o`R6anS&X87JQblP6Uxe7JBN~!AbtVe-?}-Z> z=zcVsZxwv3snvqqrQ;7CetTW2%Za>WTgE3M|CtCvuFe4IBnv+Nc>A|0A7yNs5tX*5 zA=3G2M$L>!qo%--qoT(^qvCb9RGiuh#Xi0ucRUVcp<gX0jp)9LhI8$-id?674t?&4 z7!k^VZr_k1)!xQ1N={lz2MNzqZDnN#f!atH>||wD5t3!3zA{uUr6J6Cfs;=3)J5kx zjGg}ki7eRpPt!GaR@3(6P7CEaYn+E9l-wM!lB<4-#?Xym=-N5B%B(Z0><)^+XfhR~ zg$5Kg&N<sC)iah|=d7C6oa^)}J6oR0kXFc?A+3xZtM0v*DQ7<QOjuLOBp^Boh#Mg@ zJ6F9@NbhyB@dbSnF=j{PeeTm_2v<RgQPx}<TLg=z92!e*HE~IdBVv+;!gGBo`}4x{ zXkqaWZ<Eaq{L5{4sI~9(8FVhV{0W(JLFYyAmNYsa!YIV4b~if5EE$tLIpC{{iW&iO zjcpix!BY^1d=ZSU7f$7tu$}d2C@x-FP@2?@L-*@zuJXz~F8jcgAlFE2+_`xfrfgDJ z3>V)c+}V}9Yy|0}jR4ShnfFQ@t!64g<TNyPl6y(z!<Ar{_R^{0)$~_nRU(~Q&Wn~# zJ=;z?HR`vAGw^?^&u+VL2K}bU8U3|z23PBHzY@*>A^0!rcP*&1^}7UV{q|13zyyFZ z+jV;G?|)0D<z@)~?-ye*fF6LTIiNnwSV4YyM$OpmKR5JdC}CNhh`Kd!6=9uE{a0UD zl1jt!?)p4nlpc`2wg?HGvSIAOO0lBwN2S5h5GL0lHDr>dCL#KW?osp~lRy?#JX{I2 zqOPSH>vnud#gi9m5`M}d^~TrS@hvkyLU!7+z=k^o#tNuBq4ci?2^*VhE#0*xeGk`Y zCRqB1`$GhNFTM*9tiyUCc}4d>91&qO@=|77G{hzk7W5=4AEN6tz)G+pB6xL@6%iq^ zt;D7JvyFH<)+@29?0RE6)LUsKSoQw*I%(3X7u&*ciCy~h@ex|WadBX}UMB3*kB0+~ zUnI3dkv2=^wkQo9A}d^kc$ESDw#W*<S{soxeq(KIB3F?mL!CiKr;3K8Po%S{Xm-2= z-o@J#I+E-cEq7Q`VB=(VQgxSHLF8E|&w!d;!I9i22_}fmT$?;52IdcFdcrh~rrFr) zD(JpeiOc}1vn4Wl`D-qBdGZHm#d!)MjeQ0AdFm3`oK=(7>6C)Vg8WhHGd_t}V|si1 z?VVmQz5GW(-U-sZqS<n}2p0L$mx&FgyEG1~%;3aSwee&0INU*RKhv9vP$Ji-wo0f4 zZ>s13Xb;owQc>+P7YRo)n4P66uhCAg`v^aj?4dqggrDwEw@(&7Em=NsyS??xFmICY zr#taje+GEhUueW2=Zx~-3Du6e-ECx7r;e4iahC+7`iUcg6X}I02<L`*i;u#4DzGBO zc}I}&u3C1J)e?9tQca;Lx&KJQtdXpZW{LV#@;?rQ>My0z^ku!I?TNbW2>%$X?UB;< zQ{4Kc?U>`V%_oP7leVLEhwQe`ZEHJ9saoB(v*8bRpVe1|+`H(%n%V<BCIDni)%+wT zJYvAI1F(Ai_k=UPV`nrMVME|h@7)^VSP@a^lU_yGy}Flfcb*Y_AD%<moc5hEZ)}~A zE-J_BRCGNyU!iblf%B;=ec5WpR5&f%g)75-eFtkXaiBWN3R`gXtFOM=t>~0#6|RDA zLdp%$p6ZK6rZ0=57I*14)Plc!VK(F5&@q-Z8KTm1+0=My=4GI|fR}o~&Bh`hMVyO9 z@M}A~uXI0Gan-uQf5=FuL+;7^FMxcqM#`e&;NGF0ZzRAw&K)vw7?eZ6#ew3ST2)Pj zqX#+S9mpn0(A(A2>r$fj-qJb+vC8*_$d5|c7BTAn;Z8^WH$Xe-<>&z-JdbNGmH-hR z|5@^FLaOk;sgdWu=V~6<&iWsv^F=<a!?viCIq~_4bW5q*IhsK){b?aego7=dmP6bX zEI+b>@dOYz=O1D*eXLEckMD?hv&O1t3Sf6<!>yTdF6^yCqLt4%L{GR|+D3#0gPPox zvG`3PjzSAl>InIw*fs_BZ0V>Ev!jY{=w57keT+EWT$U+qz>I$HuS_`wLq3lk>S3T- zIa-)(1LsvKcAM~MzR1xdY76x+P%R{n;T<Si{h6qR>H{;38{X#-SeUJLps=#1LtbsV zO(ZylVsVjQOc%=^^8i=Y^A#PRMI)fc)CZ?`aj2rLz><k5nKlU*;%zZI$RWn5in)PE zMr<&5sX=MO*$P?;?=shFLC02=eb9;Yqwuc4Z7zqX#!5_zJMZK$Es8_`Lj8GcO9&V9 zOu#mhR;x|Z1t{dm*<9^2%|hq_^}?92aD*@ppV<J&O8TmYlL#S9$FQKtTi|G`O+Qhj zhB1f~J+u6BH$&Ptg&`fb`6_DPAr{WxC;%K`#T>b%dnL>c%ZiH7x_nZ%s@I?_TH^s+ zhDe4%3>KLZO?-X{5*8gAM&z=q1xl%}IjV@QH0b)vUfHJB_xDir4h#G5dJT5i7IkDq zw4*>Ceo(@!*D(S#k@4}n7{{MwcYSjCUDEab()E1=KO)!)8gm)X&QB6}lZi-bU~uh9 z#AEZSY?+cf$2xUaaq5IAmc4Uqjv91Hc=EQWQ*^&})_cf6MF~{oE?vaZ$whBIe__3; z)dejfpU_ql=2)v+*i$|~C!Y%te2YM*``5tZwZ$wTq7j+DMftLrpFF@>-Jmv;)&BA! zUxKp|TDy2BTT}qUQ<QA&;xdF>Hd3euaIlAw_sL!g7qbE)T%i`|(uEU6#+kjE@;U08 zi)Gq{qX;B&sLS?*@zZM6?MftLebr&eM%FG_H@Actxs2wlA{rI6d@75zL{5uZ;z66> z+26BwU{uGI|4A0$jay~!fMX{%iQs07puvZ4Ah^SVCJsn&{z}?47AXC^N<UBF90%t= zs-Nrh_a*wdRzHj2%~%i*?g-8=*3Sw0xkNvE<QZPz{Dt~8j#u;fZ4$Z$eZnTzjZ%;B zt7ajxGZ(KQB{=_C`EWZQP@SCrg1iiz(w6#?d`RI#aJ~lJ3zh(mf;wKOvEWhtEZ4n< z7YIHxpN~D6c!*t$z<RzJ#$Nf&>F3<wG-RO8;Uk<M2??}G-Eak0`l0c`yaZ$LY{Sq) z%t3+EIedz9c!K1LB3G`?<q77+84CtdvuGVJ$l}3RJVL)F2S@fX7P$0tBJ-k?67*|o zaAZGY!D{_H&{$BRlh*6k%;3l&#)3Qbb2=7jI%&3k%?gejVJz6JpL2}`H9BdpejOJa zIl)*^qMv<?T_-Kkuako#rx*+B^z)r8txh_iU#AC078(nl)zA6H;+2xLV1<626&yL+ z5~&hEXj5Tqp4vJYS$0xznXm(b%PRD*%w%xc2K~EP|2kMmQ%4r{nTsoWus)BBWc3yt zU^P$-;8(jWR_curVRQIe^%tHSP7^(+DVJ+(=NwlkZ-p1N=~Zpa)>z@w;Id+xfEe96 zSren?JQ30&k${uBu3%jG7qYYW+|172ofb07;(-LXk_r0NfNR{PkJHEeag<lvC=Fh0 z6w{pQ!kfn81vq;zytDGOAG;&4sR>T36;D~B8f#`hyIj4f1WUb(%7*}Vfs0`~#}}u; zn#yi8z0U&b-}TK~w^ERZa-hVA^g|2Q+fMN%!uaPrHnZakxz9bTJ^?5zC%w@@`QS)$ z0~BM1KQJCkTS|M4?kXc{6<dzwYJ%9ZauS13RV1y0?^QRCI5l7LN#|2%oho`PawF{R zZJY{=O1uc@*fU#H{wu(uD)opiX$wYQ373>Ys-M-u&ANpt?eop;knct--<3Mw!1npZ zcF0$3<#X$NaqaV6)*;_}R=#g0%E%f?vh2F_eaSXA*rZ}_Xfrox8EKmvY*H@|mo3u4 zi|du}Xdu6Y%cQ-y4x{?^UR*`m(ZOZHYgA`lyPMRXcs`D>7TpZ7K48XwlD+n4x@zp3 zR}{<Vb7m4~^ZK7d>dSFm38)e~W45S<$EyFiif%BiSf_~F3gH0M!DLd`(gLhIdEcup z=LHUva0Xi?;CI7?6`A2sm+TtjaLS>|kP}W{4|KG*sJIH+gwOXja2Y9FtQoaVOW}SN zDcmHNT1nTSfJ8a{Ny(zc<{$A<j1*eOt;N(AfXu@})+QCt+i^yIH)LgKX1uzd$~uXu zZ7cUycE=&9pdGto497Ptw!I~twmPvp-lys?yW=AAhS?qaceZ19XpYJ+dJO0ZfjL(F z<tCYrHje??O0swkx(q$inpKbp-J<P))C^hGg<}f{Q|&^n{rV);8|+^-RA^rE-D2hQ zh&S=-n}dDD{zu2RrU&@E#v{T@43Y&M0yi!;=oZV9VGLO%Q!seV%@C?Ol5IE!2D~MT zr;f$4M{ItvNVxeDAzwv`2T#Sh<y1_&>`?T`iw=QfOd8Po8l8MPoF`O@_UVAo`FtU5 z6Bx3b`&u<Muf5RuY`MmqNa+0X(EqK_c_Wm^ZxK4Lc~90~Z{_wv=TbO+Cl)&2PAWV7 zghJ=@rBb&0N8|N&KSt<$Ie`7RLg&VJVUwOf=)8@zJaxZRiO~7A8&4o~UN8~b`Gi8} z*8nS=>k|l_U#E!^37wlza$+S<By_%<qHRLwNa@6hh0Yh!i*`ciwF2bZ37t!IQ}KAY z5?G?i@_~PcET7NVEy1(p(oHK@#Hkh2+HBLG<vGxpT+mJ14B1ZFv}pRke&o_<1^=vh zOaoi3)X&N16t!8Y-;B)4)@M16aJf4jw}s2c2xf16UD8A_drZ<jtx5QT%aT*@)mTo! zZiv~uf^<;6+CNnYeenlp-HEUP$y0CARYA*`5r{!fllm)Mg}`l1V9Q2ZJx!^fCvexg zbDV~saLu$txKwHv9DE#!aETtjNQAGn3L!MpqBuBl?VK3@oh=>~#ap)9r{tM<{8K-{ zPXl*#4ZE|g7mk_DM)tcJ`k}g(p#EiLN)pvee1)Rjn=RfX)w%z|Mp~G|H*iVdn)2d} z%$Yb5_4upBwYKFdAii}CxDoyeYyM$cYG-<FuY6(BK!!5}`eYz%#mC4KSl<t}qGj=M z+)TZpo2*O>#^SEG$}7*Y<dtC)7+YjX%`<c%ZQP+t#pa1N-o5A!Xtm(K$+}m8MMFK; zqZcrK{G^FsIaX<!?13-F*sCOnx22!JAuVq-N5)lmnJwDox5{a)Qj7A!tE<bs5-ul* zn#}5M*_DEIx2WG;#}#T4`9(b}Y=d_Chonzsn-7iBvbX;ELYey1qf^@1pxH}EArabP zmX2WT=7XWq3L8111#n2E1Bb)N@r>gjM>jnQBS#l`!^rU+)|r(Qy?u|R;V-%d;wd(4 zcbIJ39d`R)+a2y_by+W9lRotw?GAV8L~VE24JumnUpm_zmg(JL6&8ts_%A@;;8?pu z*=l-+STb$doBw}}VZkqrq2SlYFzmOE;p|Rhus6D~A@F5O;4q^3RF0_z2f|WllgwWu z<&gf1#O*FulnC<I$0N(1`!Q>(kN<D2>B3*F35Dc+cv17HQP)8KY)u*I!lp1|!;Bu9 zxl|A_Rvie)z1P!lwuBrxr2dQtInvmekb**#qM0g$hio@1xP+xEVh68oa~<2>f$OPj zHIL$d;lMSFWo+-Uf?r%Y>OrlJkS@fKJuk=gTHC(qS)3Z!BmbY9&hFTBCm?o~h?|ZD zVN=`GCoB-wYSxyFS(}ANWrUr~+FphM9$3#Xk8$Dpi^YU*ZWq&71?Jz$fUSRT5ZdOC zK4=>)`?=^Q;N$zeYAj}sjH>SPhycWHGXwz&)JsseH$y&xFovcx(BRO4RYNo7wtdSe zfTi|%cF9yKc~Dm(NE4^4C8SwM*5-9VTYzU5vsVPq0+50cMx{Dis)%yb6FneQ|GNBa z=O@3IJGsT4JzrO9E*ipxUY&>8yZW4v+{a_j<`4LF_U!9OSvs?4|C!gyo^=A!+p}l; z+yr~p*^xaPks0PN65_bJ1ABJJkw}X@8|4qPXZtW-HGnZNPsp~0bdYTgfnocJpr_0m zn125RIQ3$<Lo_-IIe9VhL_;F=D|E|?;x&W8U2+n{yZV#};X!Ybn8j%RbY3t!QQe*% zo&brroF1^ED`Pqa5kr}mbs1uLwDPUpC9jewoYq)#jAJw!QSbtib-bg70c@UY9`K(U z@=wOVLiqI0q&pn-iz%R<qo#s*V7%^tZu|aNaSJ27&NyjrjYvwsFNax2BcS;_>x9oE zmJEq&Z>j6%;Yw7^1-LbIvqzQl3ahgqZk!LJnmP=CcV){CjzV_nPcoW9{zQ(wrS>RB zH_O%6sNy1*wwUkeJi^DWpb{4Nn!s&|j5^6tKt$F=8r`Wm)la5`xz<j#|3hJfTHj;R zgljEss3O!`Pr|jfLQW^DB&xG2@TdtHnv-z4m`ZIw=b(T=WH7kf+n@%W24`D~mt<pV zVF&bP+tl5BB@D1Nwus<jq&jpl3tzn6$uM@^PgMBwL;{fPQ!iZ|?qHM}tvhJ3)xZ6T zopoAUg(p*?DDwXk3bTFOlj7xJ|HR|ecTX^oPGXQDh(Xqm5HU!W_*sDI+amjKKc6($ zecsQTt~MPoEM7>5VUclRD3r0z9T0Jcs5O}vu^yUZ0qJG4EU@Ifx|Ls1tNy@?#vSk% zxa(O=3w6c;x*66`dS8^|u@n_5>JU&t6qH5*m|j_8-Q*l}Mi>`&?2(Ljgygq_nv$v~ zhh|~Ks*i`0S+g)=vTe<OJZ9i<n*T_o)1e9>nqkb?46R+{*MLsOp}Kufll|2qsYE?a zts0HAui%z&1!0;^W6RSC$8KXwX9sLKunz`fZP>DK;IY`U?z=Fy6p{Hg(gUmty3+;Q zsz5U|M03juA`~x5B3y9me@7=<Z7`<BIa;p*D8iqR#qtB2HcUkxy@1K+#A4Y_`(Y}w zio9Ve^3iqeSS;bOtKSnYTx!!RtlnWH7TTZJ_yYXR_OPu~KEMsT_!PF+61t936klZO z>qPIaHi^Exw^}}Fy}PBtlF)j0VJnfhWhb_3-g)|mHSY$o9Zsxy_bp@8ns=+HIz=?^ zmg)+RqkCsrX=wGkv@OiBrG6*n+Ns~o0~=}eyVl&DH1H(9x=C_{_qW}i?C;Jxc<Udt z*7B_D^%hqr+~V~?MoEBmt%-NK*2HV=0JE>ugVbax<0ToTdKyI;?~Z1DSp2FjbDp|E z8l}jJEE+{6?{gZLsV<eShiBVX%3IAzH%+NTeb*PRyUt^LVfFJ^)x6)cH(RT+%8d%o zcL)8v9h>2HSo(RTQoE(1XU(-G%6i}#f%Pt{5-Yl3cwE+C!n%4=NObjPJ!*47QW%~n zZd^@=EogBfb-mSW_EvR0y>Qjr8Gs&StGZqjuFN2~!|Hmj7uaqcp{OZ)8$kNdFj3cg zi5IzQvDt5x&Hf5sWt-Qk`mc$#*J|k@7O3r+Zr7qu)@td|H|>ARbSwA{^_JsVdZ45x zmLBEsg2mF~ugtu)wL4gPtmo{8nQjY?vGjPE)Q(KI$PShsJ*84$(wL!oAH#H8pn1&C z3y&E~k1O@=?PTe(7Ttlpn~uYDn~$Z(T0$?7mZu`6N|<ixOk>#6BT_6q;%rNgEze?~ zX))a*kG1q@{IA}TWN&Zj5oud`ETf4q(=D!(rN<-`cseuPBHJuI&ZTG@)9rfcgl4)$ z9?#NaD!pjObn6Xfqs!7MZRvq}s%$YhHk#>HQP@pLFLnN9aDJ7G39xSNfkuh&5j)nX z6ovkxT8UL(OE~jb)tma;Zd{_<Z@Zb4hQ-FzK~*S*Ptpv%Y0p`1CXZ_ea)+)8Ux}96 zrA|gBc=173{C4tS@FHDCS3dUUpg5ScZX;Nwh<0HMzD1CXCE3?mA=DE1AJ2cWQHfPU zr3&;VMdQqJ{&swyj0gK_B5Q(ZKt6nuNcu#H%B8-rz7OFN>QXtU0h&bB^>;jos!oE+ zpniy|&W;*~wX5P;T}9#Ao3#N(fup=sj_ZemIj$DH-GCmAOEvdADDf&1)RVeOQ7pi< zqN}YdxmG<Nv!b$m+N-3Q-4D*b<&=VpQPvQPl;AFGdC=})I+5IJIw4oSj;0gCIe9QX zIy$-g>U9}h*vZ|$theJhxm#oBvz*+$X6O4wCwB|2Os!7tW?AoTPVS1&5M|3>b#j+! zm1}i!mukI-o!nieYxzx1?%X;n%#YvT<nF6@>6~_QSEC=pPVPS9?F3Hl^v(N!yDYQV z3&$)=pO4!w%h}f3ah4^@&Sx!4^A26=mwgXzw=%UZOQrSRwk-9h|E6ULTIE`o<pJwG zyeu#3T7J{A%+gtZ+p>(%dG)dk(vRU~N#pGV%Mu1WaK>RLC&Nw_4*7ERL8FG1nxSk# zm(Dr9ZOs9ZZ|p+ez3*CrV-8dig9JOl=WoJqAO=GlEN4%uo-6swXrHaCAN;L=%YEu3 z{<bQv7E{_*Ts_W>eMEV=fQ?0DGQ8tp;7rUF86Q{Sz+|u<_wb;XS5I(aTyUax)e<Q3 zIou@@Pr}SjR`dG8ZNSBaIV0KV!Zih@Q!ak*i~5W?Jbmn_(2S&NuOoq1HDe?U=B5>L z(??}XTrMWQ?Y$7<iSV@Q!DL}5Cjs*Y7q1cR1&9ACV|Z#>Mb6lu6CVu0!LdP{2@duI z2Pc?=(|rY93L-`s!--)zBT1Ey6W$Ic#ka*d>i<O9KvAN@f34A_AZEODF6doh4DMr& zSuwiGyE4MW7j)4om{PH3PO8l%h}B$z?8{jkDH;_Ro*Xi6>WArkH>ty)Z2T;qWD_A) zaZ$Wk-L^_D(wn(E%O#unQPslFXKExo+-4mfE>iiQ1OpQN<s4OXrMTCT+c~N}{mBWW zm5cXdl<Gu|Wy_`Z`>U->ttB2oq-wD>`(1~^#Rj9An*coan-2b*QQ3~SdEu=w?Qd&U zmmYgt8%29s*cvwHOF5w>fW@QiWC`#sI}0XUY1k4#L!VzTCpc~;i4Dh80z+I|Y_)Nd z`)Y3Tu}sHFQn(X4IYHRTJ8VqMsS@|guD~1*JcZr<@fkB>3v<nfT*fd@$}pHwhwy@j zqfOAa7E5FEhNzlTC2lL;;xJkHj7?<A@~PP(s~8+Bv92*G;)$EAGdLaJbFnD&Nz~kk z-?fBr)HyWPA3fk2e?+D&%w}o=MV_d_E)(ld`G-&oojkT-G}-D%Os1(#t9^*pY9E4- zXt|#5fk2C2&%3HMFL2{CIn<3ALb?Yo;9TGl*`q230tx7TC%2F3ox%&=NH&`t@i=u_ z?1))>+$>?+isjR~`iHoC$Ous^v8XjmVfv)|k>1YN46-U=kl6<9E8)CwEr<4KQZMi< zx&gv|uSxznG^yc2c^nC8ga3;_<v7)Uf(`_&#zzU2V�DoB)S^X>C_g&nmy92SeO- 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%0DXJ%cI{L98O0_^;A>t9Gc&(@q_egG+ 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�TCy~FLO;3 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�Yi9xqH-}4u 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°>%xJAsh^x z1^iN9xWqaQk_NlVr}8d-Q<LLmz~_LO^P^XW3|o8<SO<&&a}1IpECaR!=L07gBt!U1 zV7i`-=uTFNH`ycFLFjQxZr5oEWrw@l4>!3jCo<gWZuP^p?o&V9;{M==<L(_l+~zLR zaQ~ZhwU%zPz72_wV-}r!kD?vrslH0Pdm-OxINcp*!;jnW_~a&<)WpANVg*h7T_p~F z^SToE{5agru_mj43-wS}x6seac5{7uhJn3xr|Y>ad2gLi<x{C#M`i6Q)Ug)VBGbPt z?9j(S+9BDVEOy5~_3;2%C^8I^ez(YX`og2XHZ%A_BjUwO`maj1w{HJYxESoMp9MAo z|1|&~-43h<=G-G#H2`ni4!j(=7<k?QJZC%bBwz>drz-UyDEgO!z1_i>j2fAJRMJ&_ zH}b5cop`IrPLR2fjeL!x?dtVEBoSV#4o!%!fV8Njs}t^)315j;M?3Ax>Ggeu)~L|m zhZU-QH?<q6eXFnC>Hd6X(hTUsB1qNWMJ`o|4e!n3q-~Qv6hZ1C1=h+bTeosFWYoPP zhxk?++~q5HCoFWoRrd91X?}Dt98NR-U^s+&1=RcM1Loe~R_?aJ*Zc8y>b))#)q6pu z_+sikZuNFb@>5r-*Z210YH%&M%HtIG+dBq2<##SuftNPv<VQ8<;@j{=-Z!{i)v3OP zm>L(Ej`vG&960SC!sEe}*;+*R<~;-LFU^b=dY}F(8C01-l@yg?wYJ|O!~M=j9fC!` z*HwzO8YDyb1h4{lKQR4@Xx~VN@D^Ykcs+1}K{AAMfE~bDz!HOG2#*71tQH&(Tw#zj zX#4MdfRlhjfsF>qu*J{c7c2q3r&6rPAQ{5-z-7QVF#Gp*tX78bZ@>oNO~4rj$*_-? z0Xu=`0v8x0!xpClv+ff-S|vT&$*s^%w|^7iU30J|lrOE&X_f}|#ZSQxV|3oO=f!(! z`yH4E4Y>cR&Rpueq0;v1eDT+<>pV=I71X)wf7E$#n>yE0XFYX(_dn{~yG@<x)aj<q z(JI9%Y(<d+3&CD62bg`oU?y;dK{ABjz9%>hxIv}ZYJ+45Uk1(xJ_W2dNQUt5z*WG% z0GkYwAzTP-2F?Yx86-n^25>X*cwnbNGK7Z$a~}}g54hPN8NwmJ8NjdF1=FvzH?A^- zZJHck2y6n5GDwE-pTO0?mB6tE$q+6DwgP_-EHX%j@K?apTESC*^#)0U_70y290$x* zsZz(Po6gpuM2|)u_z>9XKLn1yCV9i<sK5DL)h(uOr%IL6v)rlF?fV$Vrt}7+3i7N< zu@3788Fsi9SP!fQb{ix^cmps2yd0RiAX@um2+sy)J}7vSN*pAAr@LeNd&j%=D9B{U z7?olZtt~QaYj@xr;2>bWK{ABy9l_<mH&luh8YDy50Bi)-0vimH2JHp<Gq4MI12Ffh zXnDyHUJM-dkl@+C5`$zo>pWmS@CabsAQ{3@z*1m3u+tzJ!Y|(ztOmZXQf%ziQ6I?= zJ_l?9{u@|ikPKlA*aQ3{u-YIQ!ui0Qe+rfW*Bc~5crvg6_%q;UgJcN54_pA;6FBLb zXko|@e%B^g1N=m#*j$5T2wQ+Hz(!!LK{AB@0H)Ll{uS6|kPP8<z_GwffGG>3K9V7v z2`mJj0L(B*hHxBkF)$mLZIBG%PQY5=M&0Qb8)uLV;X9ffZv(yvoNSN`;lseRhXwBf zmKr2O$gPX<3BU!w#Rka`{sveCJQcXiAQ{4+04sn816LU&L%16-4%`7)XOIkGLN^=6 zJAkb!#TpHgA$$^;@rd99z!rmK2yX>W0{#KmVUP^rMZgl^Y+$!RGK5or%YYMrsn<qZ z4;jLdzy{zhz)XW=2*1!Beeq7<e^rX*7$igZEHLX)!G8fK7$iej4V(h3Qi<czKj$ay zy_>Z6z6vrIa*>fLhz>*F{{bJjR`h+!iuV=zE^+o9p_Z$aAJfV*TKR#sa^o3E2Qdy4 znUIvYNUBO){kt%ka47s-H}}QILf+#xzv+eU<3I9Qs>uD<XTE#WXRdqMXO?@;=L#EM z98IsB(W_4)?=q=!^%fO7yvlYfe2#O=d}g=`pQ&!K&&h6q&qf<w9Zj#~UN84YCRMgj zyw$6T?j)ac-Kx{MA~MeX)DLI7ANkC3hx)9u;as<$AI^7s`Ydw0`Yd!i`dnedi=*k$ zGK}<-Cc5`^;i7W-9CxIj)f{)2&wTg1A7A9w`Yd#h`K+_y#Wuagt@PtN++Tfmx|@Br zxpK0yl+{(`i<2nc;)|mw-lk&T!G39tmR_&YiMqcsUcjq#luCA);>hoBdzs<@VD`TS zcULLaY?~<=Zl;^`2dv`LfKH`Yk3lko&A|D<24LEC(R+>z;XS}rK>n~+EXyDn!mEMJ zz>9&C4U!=|4Y(PYr&8tgggfabt(&}UKhOMJ;|J<;y=HIfj(bdXcec8_|Bt%+Y*Y8` zS5>!|x-Y22d|%Tame}5WKh^kfzA@@9r|uuE?rs00?o->;J%_qY)ICk5Sb?n=a$qK$ zoK6Dv0LKF321$c<4z>p{r(SR{aJ@k?Z1Lk3!2;l$DzV7#>km8V4+yvoKI`0<K9{*~ z$;vrwsVQ0lt|RSv>cD<yX^Ez&i+`cPQW{*MlE2ZgD{;et;TFq2YA&!DSmfv2x2wx* zO8VxYNhk8n(avz7-|JQTaMg(}jpWi!>f>rBi*bE>O7?NXm^6z?-@U@ZHMy4->8bR6 zgmymGgm@X`O;1|gg}+X^(8!k)>mYTIM?FdF+c`J6>(pFjwEMW6;`CMSw?4<2sa(MN zI?J=M6bt<19G9=`>&VjFXw{vq=F6uRYL+vYWh=9s!nkcV{7(1uueQEqnoXT4PpD3Y zN|n>&t|&9<D%@%{``ycZEA2~_;&Z|8tHgIQ&poIoTjw<=eTZt_!gbffPx(Y!Iula+ zzG7?swp^=nZ$BY<UEa~({4$zfP4kOYij7(n?K{YUmyr$nLSQTKEZ`J_WC)K1ramcn zIB<qRGK6~r#{qW+78@i(*!7a&EMU7zu?mA^2-gA2fR6&}43Z(d16T*V5!h&u4B<Rr zJMbJ}i$OAk(}3v>f|FF@EqBq#q}P=F-9eCvki9*z%k0==k}Yq!@0w-jU_VibZxHr_ zY_oZ#xxX*`JZb;Ndua`ItEu~-uiNGRyH8SAcrV=nX@cBn<jG`053YptKrZy8)2)DP zrw55=lY79opg*JT*fpyALu<Y$xp^)#kAf6J(v2LQM3$CD@3XJ}BefXyp-O%4LVtz! zEhe=w>3Jqi?~2~XDlA$vDycj%sXQa8JlD#7Zwr?B2HMo4@%8y%CDwY)-hA0o<yx|} z6WGqO*K7R1hESn4j-!oY+87`8%YF0YmtohlAytqJKO4RNnoa-GHL8{GbgO^79`cDw zm6ZkGX^%9L&Q#8zc<uV6of3bgL3N&$jCQn7QoD=V4^X@Bdu#uNLKX|u<bF6iY2V2v zp&RV=nypoxD}5bpHPZ%;8Ge<QKnfv+D)sl5ZEiY~YMFGjuWd(ye#0^yM5U=cD(#QX zXp|n#xb3XhXP)>nX}$99+3<quOrp+PDpgh%vKoHBE@?HeVg#Q8mH;18i8JcDzkfE+ zTVChCL6$*oQpwKMD)p88);9oL2J8l&I{=Hf1E&LLJS}+i06c0tFb7x%%v7mz`f_*0 zegn%eb(wm%1Ed}DdDB*_`9qC}Pkcs`UfX)o^GvE@(qk&wEeih{87>oV&O3o!z&|Co z!8*QyN%`wE>GG{7&0$hClV&AP;<Z18Nj*$DMkO|`m(NVvxEe$brH+5;bHIh`g)==) zckk@aZe`nRg1?!{;jHiN$&3=ut8N8#TUFxAp#!cPI1!&(Bl5H+MDKyez;W<DJhm;e za(dlXZ+yNNyU|x;(_BooiO;H9DdYNP&)PYkNj*%OnLLS}oy4Sq=QQc3$&*;!<Czp^ z(t%q~%3@N+^O}^V61$t*8<VyL8vg1zkx7sbRN@=v;n(v9?%S*N^^cYOtVH?LB9)$` z)_iI`;A?fdc1|$1^FAA^84j#umU0nwS5x;=>Q>h9K0A34r;!crA$>tyIlau)?lQ2y zTDl^7-%S;dR{dm}NYKPMn$RiBruzo`)OyWj-+sIYII~H3uu8EBix0@)ZV_^zW1N6| z{H)+);F~IO)^u=EFQ(RttkZ<33y*{6fbUZ&Hp^Ni!&a98mjf3A7aJr)cp<P6cor~j zkPP9mz%Jn7z;=UV2=@k#dO>h!VCMDFl9LAQBSP1D!F*u5O0j%{WZ2?5U@7oXm00mN ztxj6;Y$U5RAzDSZfvdqw8K<qUd{Po-TeuvO@}kIjMoP9OGayBfDJsS0THna9Z)1QJ zz>&b^2FVZ(0>*(~tP^Z7NQUqYO^$Z}p9Llik|C@GX8cF6TBZN9Q-u<D?wv_%gQLdz zG&6%{W~#(~?&H(GP_B0WRrc>HsziUveEj}y0+p6iDaThzaqrx_RlB=^m)7gI2&$Qi zAJr`1{Y>-{KA!BGMBdYc=p}qzrFcGgol3FXKSWy)X=}i?p!<QPz&n7m43gohx*k{! zoCmBjNQQ70un9N~*l3Up;do#V@IYXXK{A9xfjKV;e)F_o_6^a(kRg0elj8-zmw+=2 zk|B%(7XWL33k;GWya`wXyau?+AQ{4Qfi1w(flUU<5FQOod0FrfV7Easgqgsxz*Jyv znZ1O{5N>D`ECjx#Qmnur8N#Q4i-8XT=NKeI_!nR;a0zgMK{AAMfo;GdmGu6(c1^Rs z#&&Zuw>qyn9+>uu;E!ps!dfK57WV^A0PYH0VUP^rS8D}}fFGz7TWydGVH2<dSg#T{ zntV_@@IG5QKl(gzx28pJofY^vzCxu~y){gR4POfE0R9HpWRMKuRA5Gn;7@>U2FVb9 z4>$?98?e(L8N!~Y1WSMkm13Do>;Rz*;eUY3fKLJ^86-n^H?RSCE3nug8N#c8oxqEL z6$Z%=&H!e;DmVpLXOIlx7~mA(NMOPs8Nxxpxxg>h2xcsemYNLV8=4$n0eluX(I6SZ zTHtzMHL%Da8NwTY-N4I%wFXIpwm&@^nEjgINh<NV>KdJk=yqSOgzxu~HoWbe(C(=5 z{qtK|6kRsXq@`K3l*%j{Y?frdoyzIYh6ceh;9Dxinhla6d<s|xd<fWXkPP8pfbGB~ zz%GMi2<HORUl%L_W|c>;2pPiTffIp02Id+hL%1KX7`Q8NqCql*Up*;U1^hszSiV6r zgiXMDU_G$VAQ{4yzy$DSV2MF8gue%7whCSVoNtf};VHn$z+-@A2FVcS0_Om;fXfY% zA?$rZa5?ZZm0~pp$q>E<Yy>_7j2k3FcptC}csp>tK{AAkfur6KECse2Btv)>Fduj# zFkz4k;o-ni-~qrMgJcMI237+%J>J{*seEI4_z9NN(soUbr@SfHtWqqkBHA9wu*FA# zV}bVovka0Uyb)Lkyc(EmkPP8Dz{SARfD;XpA)ExP1&#&g8ze)x2e1t|7+7eK4B^N1 zf@yCFzNu2I#2^{MHNXkL2Z8eqk|A6UECQAR%M6ks{4KBo_)Fk&gJcMQ4vYhTq>{da z*rNU6u1!e?;u4L~OSmtv12~KpTdhShY_a<>!HhP+4wYgFgJcMw2TlS$2F$3m!-g`1 zcLGa*e*#W4NQUqV;4<L(z#@ZW2n&D>z{x6APA_ry9LblTx$b+qXj?gbg8Q={Zgjtx z$MB@+3Pk1fY?tD}M0c47DQ@`*NuMP6yw?41&RB|7`dFoS2XlE-rPwm-4jFc54Y1^G z!3Tk>43Z&S4qOH-Q;92OckPgLUpAk4=0O@D=g?N2wMB+)O#^lUCjlD`k|8`0nDvg} z9x8F`RLf3ZG4n-hQr(ohG=GZe?g~8{+!u4)#eKy|?#8QZ?Dj6@a$?H;mF|S&w8b%0 z!%%6|{<UkG7<zPPowPEogQ3}9ndIke{a1&tU6Z9df0G6$go6bGgMAlZSXuf1(xOdb z(I%=?>HkPh-%Fk1UVMnJovPh1e@VH;Ez+I%T>tydUy*Hfm-^u<_lX~FbHDM!ard?# z?r^92;YRm@A8vQYF<hCcJ*E5h5;m(w_mH2|<#LVQX~S6>?)!YYG($Di*}um1k}s`^ zK6T!xfp{xDzgi{rYM|SD`EGZ)I|gxrvw5>-m#R^E5=zn+P;L71ugN{AJLC1Mp=Nim zpKrZ8z-Ob|$7h|}-DigzYB|XAo4u0u5IvfO`uFXlN&Wj&1M!M?)xURCs+>OG<!N4e z9Bfh_a`YwGICltr@Dm30eF>KH9q+Wv{t5lxj^%t?Ieo1AR=?CzuXA0gdO;H(YXm>A zX#0ZUTsO<czwF01y2{@%KE-wB@##O;O|t0^+4PJ2^jw!?<8QO^r`h;)8-JaRKiZEk z=v(EvZo{5YM}Fl&y?e`sPw~TJ-3dN3-C93B+Z|~Qb<d?<ru&B<Kh}NEk00mu_F3<4 zHovp^M(-!|%{bFtVigk;SObl2r8Rh_AD`)dVL8?ESj(SS9&UNC<pGxaSnlp~tSj^F zXSzW)Jm2Ow-sbo52o_|lE3)w;ZT!nNKHtU<w(<YA@#Ad#hTldj;!Yc%<;Rb689wXX zQa@gMUk&%YFZ^x%e|VU^?R;&13sj0{wQGx;qf%vMz25S!c|7YS#TE6^ewSO?%RL8M zU%J-42={M&RrL@WURtL{)OI#)*Z)^-XVA7bwaaO^GM}SmDs5Nt$L`%2nztRy(#g?* zv!jk4^1Hz|Rf_k}%5y5QBR$M_FX8^7i@kL3dp7)68{W-^%WZfEKV0MLFUBX_rCcQL z+o7$}EG}mjqu$pn&SSQD+uqgj#NqzUlW;%wZ6@3gEq`FSzvW)a{<b-Z8%f(`w7rY( zewTZ7r>Gkfws4WT!#%Z1-<##NC%whn{msHtnP-1nZEEX3|5RI>Y3oUqxHNp*(jLDG z65sI(C6d}m_%?Qo`rYbgGn2k$u2Wl!XlrtZ+Pc)Y)#ctij90zWz3em19d~NdqHvME zfGP{9GFhcqj~)BSfqwEC?gzjc;9kJ&8>4d+GK5<m5^Mo}s#0u*K{AA|0#iN^d>UA0 zkPP8!;8@@aV7);ygo}WMz)OK02FVbf30w@E3hXvWhVU?8E%1B5Q8z_PO@=TH*aqx* zP;jh4GKBAHay;!r!T$h@43Z&y1ULbBH*lFjGK7`DBH&fP^#;ih76U7QGk}{7k|8__ z7zd64j;o56nhfFYzz*ObV6j0mgsxUF<0HX0REn)KNQSThI0;y*5}WRO-|&`N?T$W7 z=U3Z#8;{obfj0OeZ2@h}r;Rzxtj=ae4nVf)Q-Q01$N8CMxO)#}XO_(#Y~$`9t2m0{ z+3G_1^;s(VH=~|epR(vK2Dg+~W&&b=PugiN&Cn>d{?!A0ySoi4#S_fuEtS{{&%2xb zMW;(;;VK(w<JTIs?b|)>_EML0jBj^U!>QBm$}AUJ&bORvS)%j}=`4chlq@<Y@m+LF zRdlq}DTa0`I+L)8-|8!RombgJ=J0)MX+NJWZrLHxUZlcjt=rL$U+%W-N{<@d*FMYK zr#@@khd!&_J3g!2Yd-7Ui=@A~tM9no<o@laHMxhBeLJ(I_0byq=lvXcR%jWtI`7s% zJUyY6c&kbrdA=Ll|6)zuZQ$g8DX)ww%%iqH++0Z2ET^hxF>X5>(L-uVD|x+}u_St7 zF6?2et94T}+}EwCtJUiMv^9&ihN~27w2g}lH?FVm6D$LMs8X!OAQ{3JfOWvffgJ|P z5Uv8Y1D6524U!?e5}5w6;Dx}{KSu9gGK9YXP6Qqc%rr=b@E~9@aBpC~K{A9Xz$#$Z zYQaK-WC&l^<aj-B9k9e88N&O43E&;T`3A`lUJuONAUF?LW{?cwEZ}6|G~jZBWC+It z=Kv1`))*v1I25=X_{~2A;|9qPzNg9YM&L^-=?i^#u6|wKzk$_i1A79}1-YNL)>~U- z*w!t;QJsR<1G@~8A)Euu2hLK7v#ZLl*t+Xo+XS}u7Pqg4`#TX=Cyu1bVyYZO+c|%V zwjeTWI|En?OaU%1NE)=u&L7<?*am!ErC7T`GHme)VA>~w_XE2Ok|DeWI01OQO6*mq z4AU-Ki+6uFdsV+@K1`#w-K%!EHM#x`-|2obG<w4yZh5e>Z&mc|$;YVu@}+Ij8SsA0 zwvgHGs!}ZF=4jQBVgJ7RyI?)=1C?SK2FVaM0TaM_V75Urge!rWp9<a#9A}UW;qQTy zffuO6s#$zu(q_hq-x-=vzI0WzOjGf5@IUds+FdQrm+-&&l9SN&NhhJ}brM?PuKj^u zf30r53YF6ryD!pMkIUW1WOPI7yM9!adtKSTO6Nu&;ah9^cFr%V6t805PpHIIhQG{6 z>g#g#^&kB>2Hp(*qsMbyk8V@1oIcle`7Ct_%XZ6F%Vx{<K8xM2f5ls%z@6!Hu?<gl zQ~hwNJJ#nY_Y<<xKf?B#Gq?)U=6>Kum1;rUSYMn#@i1RuqTAVzDrVHKepJGJUBtXH z-KRd&-G@GxMZ^B@e!DLj6<rbO@l#t|gU=in_qoc3=eiwjNw$n;$xGeWmY-UF=(E86 zbSQHzcCY#2$?i}ae#WNnXTy*9;jwO4Kb-IG)^PvJm57d|2i>Ffp8c8D``#*X<=~Uk zSsDK~k6U=KB>B9IO|Ii^HL|KpjkKu5Z&zy6$o3A$tAe^*pQ@p5D|MHvWVgND`c>yP zx4m5hocOumZ&lj%6K<Nz-!bXCtf_SDMCue%=O~ppwYW2fOElYlW=s$2(y`&xT~6KJ zyQn+govXT)(`UG|eHOdZedfE9d=|N%lhN(mHK(x>>)pdcc=IfF_xYUc4)k=DyWJ1h zxm$cra=ZBP74CXJ+~}@SmQSDNihMii?tVSpqp~v2>Ez+(ar&CVX7~e&(^K8azSe4Y zyw4){xbBy?x9S8xYK0qX4Gy;kM-H^|-nr~arzGtOrf5%4>N;lV+?VCOnC7PEyK{XO zxU+rpGw4Bs3_W-umE~-5wSG9=Z8@9aboaHgf0L_=Hn~SuX~ovFV((VTZt-9BW%!Eo z>Qw^Mz7)JlCHDUv2hfwa+i^Tsxmw)mn(g+sgnGGw9VeflkD;w;v~`$otKB`KhkEpN zZ7Ltw_k*m4?CME}dvzHf_M?qu+eZ=gS8iA3_g1QMJC$EjNqvh>g!>K0-p4g1I&b|a zI=x$ZrPpch-5Zm3jeLZuf=q-gRLR~KSAP+%C9YYV2V4$3V*sAE9r#mV5AaZx`g_K< zejt+yzS5*Ud>j6$EW2&h1~17scM2{5eyox%S-Z}wKcjbvdJQK%sS5l8xEB1l$DQs; zkGm2#ZHueH9pEaJY<X||eB0%{9604`!Sf=RI7X>iZ|7aTq%wI|wO)NXlG^jBeUM6Q zQ(tn5w9WOhG&esxc^hJRzKf~uYU+NX5_KQle%-{RZR)O}ZaZ}!jOr$?R9$s?>kD-{ zr0&1<j2BZmbE7Jk`pRjpw&LSx9d#rw=nB^noARktSU`p2qPe+Y+wZCSQ!uku)!mD_ zwbb27C3_);Y&8=$yicnIGkOHyQORJN9t*bh4a-jh=K>#A$sb#$@x0o3dbVjt;@+)l z@NT-98m-h=<ZINr7fw$)k*yJ#s|nGY>0EH?CgIb;(TDuQXAbzKoG_}&(fw7%Q)L`g z4jib`TbNYEK57o_uaZKQSybuz8w-)?#+GmOmVH|j;$@H*JV|k@lbZAgq<?Ed|07)P z!`I<&H^2Fufi8Hz)O&kA$5r@t{6#9o<}Qm)P|1Ov9s7<M!1QkfrvO(OBttj`I1xBf zC2ppD_PL~mVm+s6LbRT@+#y^H{#2z{leJ2Qt-cDZ0zM7wHb{nWHLxDI0yyfHXo1KO zE&?Wimjb64Btv*6F!Ni%slYh~$q*g}oDBS)N*q&u_ioa<uhx?9stM7Or-J8zyKe{A zx;vlUYBjy52@!r>rTB92I+bG8)&(-`!u`NT;2psA2FVa!59|WY19llCLpTdKYO~-p zV9u@4`Xoa*9+(e25LjrCG-x00h5}20->eX<Fi3_izNg9YYT!%2I)h{g<G?0h4Y181 z8N!=@J-};#xqprph79|7E->di!P9~B4U!=|8dv~41Xyj53}>AQTmVc3wi_hF7B~D= zum<>+O0l%%Q6I^$#ixKRz=u@gi-f=YUO$-YyT;Ex?{AQlEh0C0qHm0^88~_Jzjaxl z3EF!^UyuG4KNkN>m10>oZ!(<s&w+)&9|3a>k|Ep|xEMH0B|cpKs4S@m90I?&jUL#A zyH7L_uf@NuQmnulCc}msfo;G#V39#GgntF5^$L~)=NcqKcnNR<@YleF2FVbf04xF? z39K?mhA<mg0n7ka8ze)x@h^gL;72OO)*B>4_#&_a_yn-kAQ{5DfEg+K>al6Sgh4Wd z3xJb=bAUYt$q=3jECC(|O#6#%m&y<x3|t1>2bg7$4B-yI2H@w*1#=COA#By;cqec@ zaH2sngbx6-b`bm<Fy9~<!ao3~051a;8YDwF8#ouJdj)jm(I6SZ3BVP=9N>I|WC(Ww zt_ObmXTdUqWC;JO$?<OB%fRIZ$q@bvm_11F@4y;^WC*K((|`+s34>$^&jZc}o}tqA z&VuhB;V<c=ySr5A-{)|iIEK2bsXJ07KCoRU!Uwt0AARa~Q{7*4t)bIh;Kwg?qfg<3 zU9DR@df=X*zTa-YeXCk)rnMJTs;u<)V;|-#rnoPD*5w;qX$|hp_~=ozN3I(<nD#x2 z_K#{oySnHbg2gnPGgu9m(y&gv-^!$$8SWKj{}S;@W+rqY^aPb+xwqL-Lm95NalqBU zY+#8&GK4z;TY(#I5v(#uhVUItj;E#yz6fkINQUrX;5gu2DzO;p$&0aGi}5GOEXZ}V z)naXtVO!?|%YZY1nSYIzmki-#U>$IrO1#v6-Xm$<HEO2&LfRq2Xe-~^BEz=2mkFj1 z5$sSYw!k16!sme#fsX+z43Z(d6IcxV6R^P`8Nw@oRlxIs34>$^3xM^&$ttl)zjVOB zCOegtd<Y}~+1HbH_m80)^g*Uof0R41$NS+2nPyeke6u!6|Hac6D#b_bsH*=}DVDp! zHZx_|jc0-Rz<&W}86-nk4J-v#0p}PbLwGr`8h9RXnL#pyCjpy)KLxHgNQQ7Uum?B- z*kzCm;pRUH=IkWcsZuQE_Gqce5WWH|0ImgQ7$ie@FK_|yHej|vGKALxYk<E4<{KnK zSO{zZ<^$&%Bt!T^U`m?c{=nr1$q?=c91HyVkAe*b$q>G+$?-zq3&3WBWC-hki-D_v z?FPvZmIG^nR|2~Xk|F#xunqVNV9p)UD?^6xNMPE|f(HQ$4U!?u08Rj=04ofVA^fOH zun73NO0g9N$q+sPtN`8*Ty2mH;Vr;8@OqW>N0gH;O&0n~lWn{DBielTiV9q`p5Db_ zD$V8joa~PFsRzFK%yNhLoajdT9Ow4++5cGDBDd5xl<iVAq5puwMY}XQ(?(}{Zrc9g z_2j5CHGN-wH@froOWM<{QX^|sH9mi+8u{n{Xk=*A$U?W~{G@~7f?j{&VlmZMQ@vCr zzRmu_yPt0NP``Fq^0gy&>iN`dr|v|RV)eGx$#AXj4@}=ha5%8ZAQ{51Zxoye{7|J> zn?W*!F93^yj{`^jE!rr_5Uv7N0ha-186-n^C9ocNA#jdCGK9YXCV<BR7Z@Z%cn~l% zU2tz;g+VfeDZt6Vu1dib2FVb<uF3H^z;(bjgJcNr2QCNR0qitLhVXh|BXAyYvq3V1 zvw&T|X~6XAXoZs@91k2dOz=S9WP@Y~hXV6~-&C;WHM{3u<DC|Fzt?S&T=#9%`0ZbO zO`o59@pXl^#d_Iz1+A@CDYnpNONO((85jpH0@fKMLwEtO19&DdC1yt?r9r!paSSkH zSHZ)8lMRw#i&?-)z%*ciK{AA&l?#>t-&HAAWRMKuGr(oQM}V~k$*_;N0~>&qz*d7~ z*kUQL6Icw)x-(j8GK41rvxW;E1<W-_hVTI36yWZ_i3Z6KZdxih7pNOebsRQGhOim9 z0@wg7G)RW<9^iW5pMfO?$q-%*>;_(}5|5mVPi9-pb+tZIT*0wPPr&BWz=?w8OP58T zB7RE!aT%(AD5Lc$;+C|eGhnX4jD*aB?4lB%do~=zH%!~!t9hoX>W`wfxl?FE->09T z<hsr=$!+@QKP^$43u*IFm3TDVe!j|jx2LaC=xUFR4qi1r$GK{s6Wwy3IwAC#?aF*E zx8Ynj-w&s_xjt+BaJjx0eqtxOROBA<+3fE3+2Zc@+2ro<+3Idp@(|l`zW!vF>oab{ zbKPZr`doLh&q9~xr_Xg~`{5#Yy0ZUR$wNZg%Cx9$ENYWVe8w0L+0N=4sqq7^F6Y+O z)XmsKb*p^cHn(xdq~`f%;ws1_$VHy$J2t*Y(B3FI^!DoZpm}wPnXmgZcN;n}8tU&S z*R&_7dUPItFikF`$$fm2o$kb!c`+K@hd<u_H`p&~{6Nne)Y^wPsEvBscugfXnw@+b zeUF>T+xiPcdji-%D@`mvt@QZiS4msvqBXPJTZP)7`+hUB)i;W4-xpG8Y^G*?mP+;& z%*@xqPcD2{b1bj|c=!Muw;i}QuoJkmN^H>0mnYqf%$wxvKZs<F5cyE0{uRsR!MB(+ zmr2j7#0T}AE*UtT@z*fpkQI;`PdeQj%{t|>m6YypYmEK~Pt)&`j~_I@fV$1pony`4 zuDX@cy_~PU)2(K<{W|S&jqhL8eYX%EPD|-~s-*)|>R$%`{TGvpnY2^#B-Y~Q>ouvK zNu4V3b;*w=v9(mWL&?e_y$0?;UmQm<OU1sn`<~JkSIubKyPwul_EKwiSZj%+2E4!Z zzq}t`3myypo#DrXne{)DE0w92r}tNyMx`PuO`=j|&K7m*zPGiW`flLohFDcO5Lf}+ zL#5c{mC*r(>|b^M2fyDe7K{TwRw-6ukPP8Vzz*OV;0l9e2y1{DS%S-fjRwgOUIUy2 z{4FqbRn$i^gr@^bfIkOLG)RW<5a2T4zQ8hrq(M7*NCh?kyBDz@7iueYr@zVttrT~X zvTuD(WrzQoO!-p&_^bw=)j<Z&m#lRdt~F<9SKf)OqLMjrUg-R)EXE6)MGQtwUtk z^Gktsz~2Bn43Z(73Ty}d1ekSKw9?2Beh-+wkKk^=X$Hv<_FN}85tvXZR%(z8;eUX| zz$bw<21$dqcJBsO0dEB+43Z(d3Rn-k2$*qqv@m2i>lwfVa0;-%AQ{3jz|4_?BY{N* z$q)_#P6mE)t>9dPWC-8T<oF!mv%rN0$q?28mjkPTRR+lr-T-U_UJk4_NQUriU>EQt zV68zighv2JjS?IUY%oZMFddi=+`Le**&rFh_cb|Q3Va3FZjcP&zk$`jdx2dB$q@b# z*aW;5m~v0_T9Y9x0rmh3ff)wL5dI99v#;O}ffEgqA>0#K0NfE+WRMKuC)Wrr0KTnK zY?(nagpI%&U>&gDAQ{5H0$YIPz$Sxa2rmJq>?inZU`max9%Tqm0FDJ7sS>AT)!%h0 zYus`F;R=7k?Yuu%^gCRcAK&a2`s{S`eYU!}%KrTu7c;)TT1}SH<cBKJ<aAGKT-S?H zlaK5dHF<;|-|P<Y+3806Y<2r8gC<wf<f#4C<jpF@GHh|kaB+SQtN~sC%r;1d@DyMR z@EG7YgJcMEfhpO7S-{B#$q@ElB{&xNnM$z&gJcL_0~P|G0Tvk~LwFx>G4OWaT!Ul? z7Xxd7rND&-$q=3eYy+MMtTIT3@Ni(-_XH0BRvRQkxHE79aFZ@Z#cB<bA#B&=coDD} z*kF(h;iJF`;61=*gJcMA1jd0^1KSOfAv_1z0X$8m^1N;D?p*y%C$}={*?bT4hnqUx zInQwNRPA=xaQ~LbC5pXiEB64kwe$aIt0-z~y&KfT*52v%R$KjTG^&kPuT&ewwDGh` z+w0G$zBZnCK5FCDr|D0vyI;foZLL;YOK7Wxwysc#OMm6QO2XagtLW$P{`Spne~}p9 zq-E}Ji+&wVTb;CZ$p7fqV(KuH?<e<zx;s!e`#{zG{P)p$%$sl0<xW?iI{dciIX~Rx zCNmt}C*Gr9A@ud2?`cPIRgX`hp&H*%x*M(veafFe-2zz-x!#jD*V(fbxkMA9bEXn- zBe+ndSmxiOJt1jJZ>JeQ19ky_s1g^8Z&j=80W+-UfAGUK?il~$iG=HUgC*>87n@7i z@Yy!pYQrbl@Om5msSU?%_)rb^FW@Sz%(^SomCPJ<WtB>ml~tTirukayU5ZcrRlAM! zuGU@rH#XTW_bdMs{Z`lR$G5pwGWtti8CO9P?rA@%-97HJ#XamZ#r@;C=)2e7t{vD? zmyYW7r~bL>LH}QX8cD}$=-4iFOuP0={9NYBx^vV@-(vKA<@@pczSp5$rTDbbs@lxB z?Oe3~ftu3B)ux-h=x(vw(|2#2t7>IEr?@ho`EH?4{lP<@*>0}S$*#obL|5c9*A@EA zas@th|F^QQgH!n^H;q2crB9Q5pYoHwNXYkJB;5S9?^CWjVm)uf8E)EB^rguCUK7|x zx?g8F+jaUZaKHBBi`|(%b;G+K-|3osrnp9*ZLZ$us=n_8X1IfVg$}pUPsnnARrYnZ zZ*8u)T>afle=AgC_Fw8o_&()7fL#Hp`M${cD#a$*=1va0*|`U>0N4VY3@kQChVTc# zlphH01zcs24B?i`1jhnDRVlXFAQ`^XUIi8cp9ZGi8@(mTu*KED#lRK7X$Hx##YMnc z;HAI{gJjs^nZP#SRA7@qGK7Z#({csBrxLroi=U3(XHy&W!ffY~RY~{O`_oV6sf{VL z@wQ5_Hk%n4&a4qQ7gz`EG)RW<ufP?+a^PlzWC$+-t_S`aIPM?ODkejC0<ar+Byh4p zGKAT{?1Ka|fCUE05N<3LoCf?zrC5<cGK4Pz=L4Sr&NWDe@Gjsg;4Q#~2FVaE05${X z02>UFAv_hh8F(D9*&rFhgMqmR3+@9<T^+4QGK4z-X8=FHRItDxY0wTct(qKP2wV@W zGDwCkJ^)+|{2Q>^AQ{3x09%2V0c#DCA)F0N9V0j$*kF(h;RN6~U=Fa^AQ{44fU|(# zUc$R1;Zny&`|8bO$SNDw1u;LI?K*spb8S8+xfZh0A3xskMSo%J9be4gsPevt`R*S+ zXSkJqQW2AC{3!iC+Go8h^SRK5XSw-)xXI1+ndVA-wz?vpS+3A$bu?U=?~h@ARHHlE zr*`{3>)ate=ek9@&z+xMU1@o#<%O2Nu{_J?9Cxa+Z~weBU31W$_qE??r7dKoJ)@Fc zlx=L-_M+^4z{FU=+f~}$d1ANjjURYLxZ-;Sbutf8o%2=V2;D5hJw)r3eO>W~ij$!E z(4Tsm;x5`HiEu%6j3$&X?X=%N;!E+nsuY`XU-Vue2l~LF<tx3M@oL})D#aEUBtzH) zYy#E;D-4n$TnX#}-VCfWNQUtDz??$`F95a~Btv)#umE@rF!g?WV=F_L3tRxq0**CE zhOqayf;GU;REo_oNQUq=U<>dW-~xkW2=4=?{7~?A;3|V;2p0p#0!vlmWbmy|^h$2$ zV)t5&AE?VYP(F2ws5_CF)Y(kP0m!SmKd=Hg9N1`(4B^)o3&w#TsuXK6NQUqQU<dGV zV2436gsXrV;{=xhyA6^dyb?GGcp)(L0ee-IA^Zif1b8ek(;ykbgMiC`djlsKBtw`2 zYyfs$Bsk3=8N$~!Io=6e2b^V)4B`F2tiuHFP>Jsnhji*y)uov4Ht?42bYJ;wanqYW z(s06kpyB?vIA5AwNE4H2;w;}pmwiW+{P!mM?lEWYaTLB5KPK|-kP|*r(|x~Iqh6Z( z*SSd#d}lVPRO_Z%_niJc+82*)yGMIVljAcE7kqvIKD!<G5U>t-=K!qU4qO7v94~mq z0K9xVun1TREKrH}$Ugt$MDA}NC%;EJw0t?#t)XtFO0i~p$;j{}`}RV?7T^YzV(kXW z5WWmdnIQNSFs(M)P{|Pf9XJ;F7vMO9WC#}m3xRWig$BtGo&j78JRZ2vAQ{3#fwjQ> zfHelm5Do#h0l&IHu-PCP!ZuBgryU{K1ne<LhVY-j3BZ-W><6ROLxylEun72jV7@^z zguen-08atVHAseVA}|ij1ui#8hHyBr1K4}MV1q$2gdb{hJmW`#uK^PV$q+scoCLfN znDJ1w)MN;k0ZV|3f!PMh5MBse20RNm&LA1WV}T98!-10xk|Eq1*a_SjSYVJ0VONP@ z){h0-Rf-iEBty6kI0g79aIQfzgm(bv0&fH^G)RVU9&iQl9AK3}GKABB>w%Mi)dtBB z9ti9P?g6YdNQUs6^8~Xe3Vy6otid1|!k2*4fNOxw2FVcC0Otdj1KSOfA-o2-3iw-K z=0BsYhYaEAz-HjjfjI`r5FP^D4BQtu!5|sJRABCrg5Bo|mKY>M_?9NeX8@lEt}sZ3 z@FCzr;GMu`gJcMo09OOA0H)SOOHGEb2-pfN08TVWhVaM0)Sn3c0651W8NywG<A7Vv z5v(>yhVTPTj?V(V3T!b*hOi!323!qHdpKGcGK4n+>wt@ZlMIp}ya3n^JQFzAAQ{4A zfaymG9tK=xkPKlKa3U}b*lLgr;b+By#lUw}ilsjiEesjLXMk0}M}VUYk|DeuSP$fP zA+fOr$q<$T6To8NB!grKPXuO85<Chx%^(@V1Avo(y8~w#Bty9AH-dA3PNmo!gJcMs zfy;pnzy$`$5Z(i91pXOVVUP^r)xa*`#lRH?$q=3f9Cfr{9&oimGK6D+`M^=YdV^#L z2LnriU;bLK$sifRH#Iq44SWvRW{?cwgTN+W4A^Oq3}G3t2RL6P&g<T7kIs%?_u1wC zW5erg_(>an)P^6h;d?CqX8C8Eev{=5J`?U5W&c?=r-wu6!l<9B3t#<;F0{J(#^{86 zhOg4<R@?9t8(v|<6Z~+qtMJ3^E+@HZ?)|t|4aRF|`ZksNE&=pCYoh<ow&>vodhDA` z(Zgfyls%fFXTI4K{cXi<ZZGrCzhFi=Khum3Q^_t${IGW0Q}`_4Vqls|T!X&r(WD1u z_|N~kIuoyje4r99$#uzu4;n8++8|GPlIE72l5`sxtvmopn=JA-Piowqlap@v<IA`T zO^Ckbxeh!5e2K@kZeB9xOO;>t<I})J;5?7xE<YKs7CyWm=YlK1SspKUBa?B3@Q{A| z?JtGn;0-GAoyDg=OX@S1R9ZEmd}&8?N#%Kb2mUdYVvUbR`$#g}%I^eb93%KAV5dPc zgjWD30nZ0!#-kR=5EcMSfRllf43Z)I0dN^`FJQ4jGK5>s7Hj~1suGu;Ui1$|?R58@ zob=kV5?+CBhOSj9R$*<DVVm~?bB`6g4OnN84B@rF8NlBG+YFK+ECenD<^wwok|F#d za5Zp$;AVql2zLaw0>7RunEo$2&?!UswkF3@j}v?WILaUy!aCqM;40u)gJcNHfwO>D z0%sT`L-=c88Sodt1qR6w9to@i9t2!vkPKl4upO8JY%)lO@S|CR=~Dz>S1HzQkPP7y zz=^>7fusH%tw%D1w*ZTQ*8`^*Bttj{SOuH~oMVs-;c>uv;CSFNgJcNz0VaS$f%OK- z5Pp7^U}m1+dn&~`43Z&S51b5)1JfU~tw$NczX9g}Zvsv*NQUq-;Bw%(z*z>#5Kad+ z0*?kRHb{mr2iOJ71g<tnhVa`n1xNi{aDz&*7K3C6Uk2s_p8{?+NQUt5z*68}fI0Qi z>LEk85LgYI3!G+<4B;8TCgAbFQiEg&4+ZuB_XDmlNQQ6-Fz0x|uVxB18YDy5rpfUF zU=y&@AQ{4c0v7;R0y7_vmYNLVQeX}6_rOU8$q@bu*aAESSZt6C;Y46czF;n}!XO#K z;lQ!L-a^4TgJcLl)Z};}@HJqYK{AAo0~Z7D1ExL^Ej1a!Wx!hCV&GVVWC$+=wgJxq z&M-)Z@K|8l34(_M7Z@Z%xHoVDaA)8ugJcN1&JZjDwyP9tGDwDS9k2rUD6rcg8Nxe& zao~->QBOvzhYaC7U<dFV;1q*o2&VxvrV361&M`=a@Ic@s;2ywb2FVb9bGl#&@MD!? z^#;ihz64wbTm$SdNQSTm*Z^D(OmB#mnhfDJz)s+AffEdpAv_(Jb)w+UfwK&fAv^>) z1-LJ8u|YC~sld6w?$ZQU8ze*cmL|tn0G|i87$igZ5O6*4PT*#PWC)i4yMb2#)7RMQ zQHHPxm_1Ff065AZ8Nwd}rvZNe9BYsa;jX~>z%4TbXBZ?y_<<(JR{>uI78@i(SPyIl zt_GGGBtv*Ja5HcbaIrx$gcksFrwg75TxO6A;W5A&z{7y643Z(t0xkrm0qYEsA^hxA z!PUTbRf;tlBt!TNuod_Su*D!5!rOtVCka*pI}DN`ECr4O76ZEtk|8`1I16|bF!d?h z<0?aV0I&?WJ22BA8NyA!5Uc|_m0~#t$q+UJ+kp+h2?og!-UCcOS@6%mDF(?9UJaZG zycjscAQ{5bfW^Q(V6j0mgkynKz)`?bgJcK?1M7ibo+7x|AQ{3pH94LDJ_lT8kPP92 zz{~={7;u$AGK6Ko$-w!*I)h{ge+ireJQ>(%kPP9EfXjj32eud_LpTiB2>h-<u)`o3 z!VXQ2cL7^~-3G}JJ_a0hir_zhscUU}REF?Rz<l6!z)XW=2+s$W0%rnq43Z(746Fu@ z15PkVhHx)n6L2Ts6oX_4KRsEn2l$Rku^9%*5Izme`Gw%az+!`B2v-0LfEB<}gJcLV z1ug*o2DsQD8N#W+8sJZWs|}JN{2s6cxErv=AQ{4*lLS*v6-=lU+iZ{w;eUW*flmT+ z8l%^m4B_3tLg1~yX$Hv<UIknXya-rokPP7rU@dS8aD_oKgkykhz>&a4gJcK?0n=s( zelcCJ(;ykbH#9ju0r)I1^XX`*$q?28i-6U@Ne0Of-T<rsUJfiaNQUriU>taoN&|mW zeml2`tav{8EAU!fvH2dAJE^=Ib1AjCkl|c<rU_=9CYVquw%8yU!v6rL0G|XdGf0N; zZs1(tt-w_V$q-%zTmifYSZ9z7;SAt<;1pn^K{AA6fZf26z!rmK2nPYPPZ#{+M8OV& zWC-8T<oGn;v%qeHWC&}4^MTdC)Msp0s0`r^z*WG@ftd!$5S|Te2A%}WF-V5+2;gSm zXy62cWC+uNxn~G&o+>!SAQ{5<H90;5_zG}_K{AB@1}+5N3oJHBhVYNT)xc|kr3T3m zmH=CUg}@qvq`|)X|ADE6f<FYt4U%DtdjiJ+cLc6CNQUr}69i`g-&QHsYLE<JBd`ou z2TT|wL-<!<9k3kOV~`BtCBSyzuYqanqOFGv;R(R>nSw_Gvka0U%mz*bW&m>yk|Erf zFIWuxNTt|BgJcL_1Xcl`0OlJcLwFak9(W6|&>$JY1;7Mwj!J#smL&gXeC;#ZvGHq^ zNj2P`+U_P;j<w9O9OX0J{Ye#Y={7#qa`Qb={cg)n%MNA#mqR>4FLAv3lzyiA)T&Z! zp>>`NJO3oG8u$RP#vmEOTY*i$KLDEzk|DeZ*aMsm>@i4&a0)QzEWruD?Df&sLWXc8 zumHFVFy9~<!Y_U<xB&QHm11)Zk|BH+SOfeQaJfM;gw?<nU=^^zAQ{5Tfhn^D&jU6a zBtv)-a4hhrz#fBS2uA}8fg^y~&)VuyhH!J9;9_8>O0jVU$q>E*tOc$GPBut}@LpgW z@HSw9K{ABb0@G#-{tj4VkPKlVZ~`zNIM*N<!XE;Qfcpa%8YDxwBd`Ma^%TJ>gJcNb z*5r5`_yVxnAQ{3sU<Ys&u+|_M!g657*@9OB8w`>m{55bA@E5>lgJcMg1eO2~Qi+Ga zR6VuT*S&i}mO*w@iLW;=65-DcJbgD``*yn7ez?<}W;xw5&+=%?BP<WG9BsL;<p|4R zmP0JRTVwZsT7F{rf#utluUfuf`LyNZmJeIrXL*<9?UuJ#R$5+fd6nfn%Zn_}v7Bvr zn&ouMJj<gkkFY$%a<t{XmLn{OSq`!MuECby@)OGsEZ??#)$#?)r!611eAs8g-RHBz z-Q~00-R`r^-Qu&=Rr+jp*DL#X?tDGJ%dy%N;%o}v9>b<EaG$J;9h3A+O>UBXS0dh7 zB>Nw4Tl;?drSGbfEnh$X6WjhP*_GZlxnCrc^&(Y}^k0iC^d#Ym-s6ze=?Z;zxdLT> zZ@EulHdXSeGTm2caff)?>PGu)bNl*icO!guxM4mMZiuqKDHdjTnwmpXgM3r%?))ct zO<LWre0I2*KAYVu)$}UiPO#y%HhiRp`<rB4J~>%UHqhh)D%k^WzS(Wt2i)+yn{NFg zay!qvxso=f{6=kDsFK~qaQ;o(-o@|>;40v;D#hkEMZ0t|+#ehSYzFQPEHg-kFa@|7 z*!43ug%o#QQPLK`x884SLiy7Fi?s8P&wBd*|73B|Xfh085)EO9Cc~uYJ*6R3hTfEh zFj*|3r6Fs}Ff~jzrbfdsxzyCEVHk$duryk_o|#&|NTToK@qC@v>pIu9%jfg`-oAgG z=j(OukLP)w^E&6e&g;kZx~4gg{+qDjPaF@vj(lP6Klnw<085gejXh8;q)I>k@jNA? zC@F+hUTtDw8X8MB!CZpl3APxJX()Ip!77615{&xHX$GdDU>|}l1bY!oG$7MZ@XzxB zMo$1Ju*%a7$TSpeBA7(5j$n=fnTCQ331$$S2g`fqW%kgnKjU6sYhSkVwU%2cE~0oW ztVo(SLo{5molQ+GH7CF-pJgIr8XDOF1Oo*BJ`Z4t0hxw^?a21W-3+jqV5I?>hJs58 zrV?C4&~HGdq2QAQClP#zV1ogfhJv>cEFn0CV2c5nhJvXC>j@?ijQZSk1*D<iVFWt~ z?n^MyfJ{TdO(_6-PXzcQtnzdNG7SYkAUKTRI|OqK$TSozC74aHfZ!|xG7SaqCRj%B zCW0jfWEu*l5o{zlh+w4wnTCSL65L7fAcB4aG7SZHo(r&VCcpqJt`0^n;mp`B3+Hon z&?*<`cB>3D>1ihIXVPO#dYDOjnsi^2?s<>?@clEBZZ_!#ldd)CYLk9p(vM8K+@$ZC z^bM0PH0cW_ooCX=P5P)wr<?R%liq34i6*_lq}P~qBvNmt=TDBl8H6Sp#wPjz7CzAD zo(bJQ6|;YmQc1Yr7QiJ6hco=5QXUyUnQT}%b%dQ7IQfnv(@rLxj9tV~W~JPUtg}?! zA!omCo$nZOA0nkhdKu*4aAeOpKz0+^42vI=IH!{byhu(*>K5pJ=HN>(&aD0sbxF5D z_pZ_HW$|g8#VS1bS;85F^I?^ze&LK#rluR3yBT*8oJH`z1hWmuG_=1CBUnQ)nP8~_ znTCSL5NspZlVFtrnTCSDCj*R`1n?JF<+TQ68VY_!Fqz={1RD*=G!(2LIG$iJEH295 zwEy~o2WSS7A|iJgB>K+a$0gEgfm~0dmdItWxKf(_5Z5NP^4>+8Bc2<|u|F7zA3lzt zkDc_fKP<Dr@IBgffw5&Ez|pq@{0SC67&wZBxZSP}zCI_CM`Rf+*6R4h&P;LX>DCXd z_({E&i28{>rQYgf&2PazmBt&ix%8pSgnJ0L6TTT%c}kPhN0<gH(+SB4g0Xi1JdfaT z12PQ-`w~nc7)LPMfJ{Tdzs?4jN$^)#<)sE>8VY_zu$bUVf>j1&8VbHbu#Vs}1Zxe* zG!)Dw*g-H0R^f>Lvbu(?8EYmN=a1^I&Bd38oIk36C>LY=;naUZ{@a<G_;2SFB=W&& z)|VXfld%hJb~v0n&D@g(#@>kn_ngH7qvRiU$}WGISud9%5ZrX?kdK~rZW^7Zk#)$s zx{YPHZnw(uX8#MizeDDk^l_6uYSQT@z1O67nslN`Z$RpGwMs;N6C#|QU*oJiuf~Qy zgMnWR%k<$Pd0qSPDFjop03HR4r?L&R;5fqbf=O@N3orKAEd!v<qV^|Pyo1(m|Azr* z?az_nG-W;EQo=O`e%FS1xl``J^9VN(eiT-D%$H90W*XWf?jX3G;PnJk4ahVU97-_Z zE`Vnd%rqd=P_Q?_;RIs{78#IfD7fuRfH?%$!7BF~kZCCR3Bd}2O9(a?kZCAbPOypK z69iif$TSqpA-J1hCc%IKnTCQR2_{Ykcmctk24orvo<MLE!9xl9zH%CzX(;&j831z$ z{syZ&$$(5l!DfP01nUV7Hz3nca1p^4g3l4mH6T+1n$z7w1f%Z;IGJFb0hxw+978aP z;C~1<8IWlxm_#sxU;@E512PQ-_a!)s;2)<0>@*<LQ1C}&`)de(PB7|gryZGwg6|M) zBlt4GL<2Gn1q%qqWCNT=Fxh}iL&2K}CKJ387N?>mZ*X$#khhR}Qw6Vnl8H_tnrP6? zPg$oLE~O43QbMG=B0ia9yw!)J8<T)G68#>QuFUH2NnWqS4!HY}%uX_k9Y*r;v7Hd) zB_gAz0C@@)XQCrM=J$AFq!-c<G>2#b(M)<9>RcuE#QlPq6ZqZOj+rZlNWw>(tP?xy zbRlJa%1-}xnS4kYTJ3zhRLZ+iUVjhdTTjzDHPDDO?Efy;V3)s>&}XpBS1-0%b<Ljy zExgqb?0ql53WE5J#e@ffA7#})BYlF%BqB2m^4~A4NuQ_pJBavlfLyOgr!2uI{X!b+ zQX&J0oU2Hk+|g<wTs0*U8Al`@R(YH0V@yN)*q&1X77*MFi|gO(z6|r#O2kj3QIS%2 z;cq_B9K3<%u9Hd-!2+<(d7_m1R_Y5>-ypl1tRm_GPbHEx704~H%6FS^nTCd&PB4RD zDlE63xX+5%wdPgvq{a?}AJ&)*{IDiQ9@GpsM0Vl5>8yy(ww<EgoIjIaG6M&MznG7a z4?Z&{J~sie?v0bPT{B)zrfGY86Mp<P^jHpyUBCx~JwM7u+4mkH8hanmdsujc)AMJG z?9($fS5T8e&0uOq1Q_ss8ZgWliPL~#;&BVa3dG^>=8YLI_qk?oxf3R*lD0;!ZhUfs zZsYH!H1)|yO*`chq+T6)Kk~Ew2x1(Acpnz))>qLE>8)v_%q^hHc8SsLR*BX$Ms~l- zBHLuUruhCF(%D0st<QHgW2pP28T+yFijhwZxJuI&SxSN1-dv1d$XHq#%jqVT5=A?t zh-ifGJ>_73uuHK%f1eB=x%b1zZ?MXvo1F=ssXlYOSUq;i`I-jgY)#wcR84(yg4sS= z(+)Y*>_5=#-v_A|H0SC97FfXor?J2oQy^0m*eS`=tto*KUQ0pJGzcz*#oMxPz2Y3a z<343eH_MTlHp#)7HcAgo>tt_D8|1G~$koVws%w|Yn%2uY-QOxdXxb)Yb$_i~p=qb2 zY3h@~n)2`FS#FD*p=p(zgw(5B8A7c-389W+sAaHNn_N>wj;76$Ws1r)`^O>mT=0(a z?R4RL04}bB<qmQ8$8(s+o$td34<biKGDYJlO4M>=#0S57rgUPV95{Mv=qj04p8HZT z;6VufIFW(I$m)+h!EZUC0+#SCFn=ZmAF2SKTdcGy&#C)uBE>{rQlvv>!Y3P{n~l=j zETRoWa}2t6q2-Op1R~psTxF12AoNzFX`ED15}}V5V}G!D*n<wIujJ|QwV(Q`m!{cR z9+=Z?aQbW%KlVqMK5_p`ol=3HB^t$F?29LO89p!L56&zHcp0%?#%A``QC=CTUdD0` z{2vzBfpdV5OGMxq3_Kmy?4j+}WYMmZ#WkbwJ$bgue25v(TunP<4pOgUaookxR||bb z!_teJkI?tJG(wB)?f7hzU03q2*gIsf`fQg$nl?zyqdcw+Ql)9Ue5D*dH^wr<+K3hF zhW!Y#Nyg;!=2C-fd6~iDcDtqx@)J@o*m?vzu^)on&0w#A#oG+aY=oz;Aw<e@feawx z&Wp@Cky$&Lb-1JEiDJ!R*6;cB{70(q3{cxnaLU;JtTh<f3EPn2Pbbo(NQZoBBOFQZ z6R9Th8WA@PX1&O)xQCGSWO&x2%qnKqz2RAtn6;Bx8L-Mz&HTtT*sD3-E+RO5CcrZZ zW*CrZD0l?H9D@79@<Qb0?4IM1)yk~Ru)HkRy`5PZdB|#pRXC!re0%c_56K_ztooLb znnmjMa0f3jtBqMt83#{W4$^qRol7L<VIWzGB*<hN;ZeGdNHUQTir`IPAnZ&DyZ`XQ zNoxdp2GL1G`@mwS`RcZ?W8RZU36VX0S*a?SoP=)$73QEeG7+ZR1o_!c{eA@IZ>8XK z6~steHW%?N(t^~ZGab5`bmk+V%V05r8RrFk>R&|^5-BF~fN|J)nuW06+)AX5$XNA) zr=zJB!h>@Okq#mQVU_#Mv1b~3?2jfG|0uu%3C4fZCw6ArKQA#21$P_=a0tQmusEX( zf03iP>wixS!2Y0?(Y!}(4YjYRwq0Vu(1-6|d~}xEKG+qe&_^eIOi&;A`Y0Iss7LBH zwElm18qvP9fDVEcK7(<>Id~@jhTa{E>_&%DlTOV(>K^YusCyJg_YtZ&0{eqLSk15c zz()antc1m<87HcbPB~W7b~#+rW;sYxEKW5I$X=S(%l&%qwo$f}v1&0Qns&%fn%2vA zn%2sd;JontDEb-}UCp8|(W0B>bwvZRK+|@auW5(O)wEGI<#DR55}y`XBT<^x%1*48 zd1tqi>t?rwDpADtV^PGY$52E&ES?`ORaXsik#T*lrtNa3rp<D)rk(h^dDbQ%N1FWy zBlTQ!Hh+e$o9Oy6b=`{BgL!6YlM+okrR@dBMT@3Qa)m}2kOs3o*lhdF_8Gd}A(dvk zk8U@~5r!+${jo9&>Fl8`)@idvPn%iTuV<u>X0n;u<pzRob8s?QpMaQ$=OgBCV6l2B zHo|4aN+MCSfxM+ij2y1TIalxQvV#3_FBa#yXMcQz+5yzwW3+4LJ5BHn(nx*!ee4hV zVEKdTBa1%HfE7ve7&VMNmrmX4QM(Vd71aKIj8nbq{-xZZUCR9g3V#c=OH}K_-_2X@ zIhq#|i7o_2h%wdr{ctzFi`@Is^ZHfocpy;j}F$VwaGsc#sO@kEkgm5(yB8dF^i zZJ%s)ZVuhUC@7&|Ukauf0aMea=APW9qXE_v{1Fz%=ui~SX=w2>_>3@59M6h`RNz(m zh$@7SXJPRya38g9^YidON~AxLd$ky>bJTs;uJiO*`*9BIaw)ars6AJ;9dhKqXvcKX z_N2C$+C4`(hkfn)tX9`@j|$PU%X|%mzk%9Ss_l@IN}Z<ZgEZ1ge1Gf@HVu6|P9M>8 z;A6V_@X0UFL5n8(k*VE8<B6sc9i=EfH$fyqsO!3fnn-OnwehNrk?H@UUD!q2(Hq)I zYFlAND(~(t8b3A7)KtRalDVgr*LA)A;w0RS<A~h!tW{rj`)vA%eH=c<s}KC#5(s<X zDxwj3-mhcAyG9ay45yC-SiI@?sQN&2tB<aSd0`hH9Y?}P5q-46;wt^3f6?C7MO#g6 zJ+)=9!eeH&|9FO7f|c>^Pj%q_RJDw|pQmhQco$e5xWMwuC0>Sifz^QvtX8S=TzMB* z9k{@1lc&6l1or}~V=eFP?Y_?~!@Kh8SkBr1zp8M1Un!2pFGrvz=&tzvH>^m#pygKk zb}X;3-lArB5i~EVrt9Aq{8^%tUZ-@zV8H=R1Jb5xhqNH|Mge_ZPoG)zc^Rz25pnX4 zqMh;@(FncbY3xT2i<bfgV<gW7Lt4C9HcfR~Bc#Oxa;4*;Q5r!o%E9U>AcHiGmov=v zNt(7xAG7}mllIcIQ3_NaFWq#zRi^27K(@|vYQIs_82K5gSL-^|I`eSUx|X#b4J%UX zzX1tq*&z$mN3+b=v`OY_S|zbsR;xUs+l}&|rtNYMQg!IHMko4TlU$Ge&XvE{8lC8W z%`()>@cLgT`d^FmXGUQmFBIHc!bNh;)%^5moAg8`d+)xQmdXXXAMd}+<^EdPtZAKW z(6nCGBGs_GzTByO`6KLi!t(lZ=UVpu*S!p{FLy3ySWhz}G^|poyGp-^DmlpH1$dUG zMN+Bzn`E4B*UM;4>m*&%S{a7aJu>-Os3;E3r-$L-6g`21vlQ0sp_$g|Dif=#Z0Q9R z4o;KQOysqaU#c`6Cx1T8T0-D8ekK}!mK=*PP)lTZjh~6e?=KAyI2m5!XQJ`(x+OFC zXD7dmV$J%>eAl(tfSG8(D)|ukjt8#+GuIZ5NRrz<*Iol=F6X}@jB;ET%WQQWCl_Hy z;fM@5SJTmQrl!eqvZe#%I8A%Yk(wsT!J7J{ho<qex27@jS26uW%Qj7;<X5C_<EG`I zW$!u^Ej!>TwCsOjaq2($*2s&F6BpYTI9wH+MQu_sw8z6LuQw|kromG%*G@46GYIZJ z1YolPnTCSvknNvE@M~C%W{?IRkTW#J{ZCC>rH`f^a)hQ0(o55N+23q;(-ilUo?-*k z$yQC<WuvBk{M|hF*UI;rHpy3-Hp?ew|4L2$vP9Dsc}vqac~#Q}dC}xQi*)wT8mm9n z=xYBV><`wB7d!j1ZdI(?A8}}eR?`SfgCG}bKO);-`82@KVX;rYJ`LC6L+iB==eBG; z3Tbqv0CY+Bb!zu)!uhNOTIXrd9QtdgzXxHJx0`~QI>US~@2hA3c)pw*j2ZV!X}G2^ z<$3+53B{aF=LvJ+{8&2oed}E8GY!^?eZWU>IKiC<1B^8w(@=0Nvi&&(zkuaV#36U1 zbMa_2C}LN9m7)rYo`r?c>cr}vtQ>U*8qK`&7F2VIIEm^OsxwrL_T(R;&K}xiHF=ZM z<je@F>!Cgs8mFcE(of7h_=!_L4Q>>5mY+KKsSj_;TKM^;m+Pk$mOqt#8e!=%apI}A z{8YnFjqwwF+t=*^RdD#U=WsS1PNT#7U59K#_az*sc^WK--Z3tNpAnv)i|D7Ce$M1R zb0^%92Ow_`uNUtv9Y|3tMgJVc+Vpo@CB~{v4Ai~D)w~VS1kLQU@vuIG<&Q0apT*qQ z<>27XVra+UD}hf?ltR%AScPsGcn!&+3r8fo#wcSH#^a<Trx$U|Ijh%T=X1*_9AW;F z#%-v4bZ?%ij%8^11=0Gam2oV591D-;ZnJXwA37r|yfzl1dWyb)Ri11H3e#Y}<A_>J zu#?~df~f{%8VVK??EMVD2VixrlsmA!!S8h^YmfH~+DtYc<F-Ir31aHQqEcB@FIZeO zOqy%mM`U-{(-TMqk<GB&KIGiG&^{#lY!seo&FH}y)j2R;L7YwBqn9>%d4*owZqK=3 zKC_aaMb@0~teMOzV%FWTP&@hTX)8QVXyb^~5=o~T%e~8SXU{8uH8_t*@8^J=VvtkA zkt2vqBeK6idW0i?90;V9$Oc$m0bGH%GHXC7vKpC%7(TP_&M}7fh!hif#a44Ro6oG> z%$fs>ORqpN7c33ZhSV#FQ`g-@Q=bQVlkJ7=Fj~DZYZ$X|xjgs{sQH{eUPfMz8__hA z<n@p7Sc~Q`Img{QPEK{r94RE=9v`0H{y6}J4x10pn_yvG<PN~$u2Jh6=C?nd+z<J3 zh-Rl{!+M8~YU$`@b!2*`N3$AFD7_ojqof0*?^U`?9=i^;h;VU#7xtt7`K9_PtG)8z z<0AU#`vQENsXl`5V@RIOa^^XV>}az4DjTenjJ8?U>DL&r1!RAKg+CbP40Hyl!on1o zZgZHHax0jR8)}?$UV~<KS`Mt2=%<N(o}wQv4D`g|Ha}Zry3%ZsDWrFko}jdu2iQ}R zDuPcM(%4h}LpG@l>^aKD$*wWmQG(k7g&BV%<ky<{2WjqcC>+IoUy&>H!E~$P%^)sl z!pn~agtFH3V0{?j*RcGfSn4WRSP!}`8fDH>6jeA1US%fD5fyU3rUMM){B_<$#rhM= z(CkDRh16?8JeOpVw`!3Yu*R{-Iu@C(MK;M#&sc96Hvl<LVa9hR;r``-k5f2KYHYX@ zNGy@jM4}AxgpF{*`fYz8c|_L0;sy5|Ho`IU36W|dOJM1E^U3TbsE9KPul(E_g-3m8 z%yH7oHFM<ou{vUBtkD0+d)(cs<Ui)kaJTBX<#SxkSg{jZPFtdo87t!OR;<}{yAvZz zVr0#XEI}i~dt*M?@*X3DnI!Lh#&BQ`lbIhFbDZS3W{&KwrFWRfc8p=1*wV;0xLX?8 z9geHe$bedrQJEABH0=D1wX{=%E~{JbD<8o#XEiE!<$kE#uoqFei(qjg9`b;7GT>~R zM5L8S0<6Nq-E6}juV$Yg&0bfr36Bm78@;yV1!63!#RnpBA9G#~NZ*FwJd@x4kM_tG z9}3Lp@Apv1r`YgEy@W!R!YVABM9&3&G_tuWa894RDrk~y?8nu32?M#OktGz%IP7CO z+N9}B3vt74j|?@t&eL55RGndVon+EJn&N+te&$=@bZo}hh%DDAmcQSnOOB`DKIyWr z%*}L_w!6Y145&s$Rw;$)L8pbSXdZc@3ldG`sZRtCPJWBijz#;j9qSM?+Hoc}{26S= zyJ7L)d!y%CgS!IAI3igUK+>t?@WR6elxIeoeBzC?w^w>2t<p7f<jiaAk#@YhrTzIZ zcZ>1Je8*L2e-0gK9C*S0%)av2A6pT4o6OL(N*-B^(A)vZmC+0PpaR9Lz~iujvoX%# zRnJ?qI?n}nlTCdY>`ls=;o<pf1T&IM8JP=|!6U}8!DiNf$m&m|gGg^!Xeb$Mm&9pe zKOzGb0Qs}KgOqFuc6xnG{R=Yu<A{6<i#OVy-pSq@BP(`UC}+&2M2m?oQWVSb-B((# z%W`1OBU4A_QDty#62i2BxtmM}nVVpF)n>q>nU%W`S;JtJmzvcz)8HJz3H~&KRRoWL z#q&`1W-DA?K*b=#IiYnU+(LLOdMsON8{SU|DR?b1{Lz&_zJSHc|2yM3cpGJ+ruA|I zQcuF=Llu4L3G+pYQz?E@#VxXa&(<K!_b;XsnMCAH%KrCjI5t!oMI{ssg0*LgFA#^+ zdT*C4aXg`VLWjU&XKns{GhYb{Y}h*l=Hc0iUH+Yf1F+Z<HJxZSj<-1ZoGnPRzl=P{ z8+v|sZ?atLnxiDzt{^?nr{~_U!1EmAd2G<L9vjE=j#$t0^{%^Q*^8z-p4bsa(p?ta zT>y)Vqknd=Tee94KOBlaIi$aJJnA9oO-VB)F)C@5Pa$Ee{n#y}AzA=$#xB3_RlsXu z;R;ozA8PqycW)#zfJiMYw$-(p9Dj4LZ5;*1`vT!i!jBucXx0W4-Vyk3C``|j36~PS z5f-00&d>b|X}c^w+6sbQ;1Z%uL<hpsqZ2J(|K`N84|X9AHf(QMoz$t7-LhAg;JVRC z+#)#HicI5V4xAWiDWq!lmBKTOnJAa`v|?c$mqP3xO*e~zZqm;Vqn;*}N9ti%oHTzt z!9rSDe<IaHZd9a076T#rwvBSGyo6{w(SgR>@7tWy_d~m_Ax5vgiN;p}je&*wNQ+y= zc)WjMYMUhc9oxAlv$WF}du#NqLwF@pmz*9bLYG;UIrY@NVsG91))?&VJ`4+*^gs^x zhxE*MqEJi<i+LFqW_lTqh&-eLkvvJHh{!{Vw97YtS;6wS-btjE$PKU<?8(7kxBcn` zn~@M9*mXFbk%Ik{``O`t+w)I&2mJ@T{B1076D;<%*S1<=Go~Miq`U^?Q$-q`RfAVG zUSGY79B0ydjdUjI=at4~1+RMa;w0qqhq7Exb`NExl-<mI<|eLlcZN4{tDQo5CFm|% zyepUDuz-r-`2^2%Z+dQ{=NMStDY$TicN4|)*u~JbU8r~WZ;e0r$F1>FSpMkOQNSYZ zbMI>E$mwmw9E-`Jj`TD;o!TsF?}TN3UGe3};J|QyU2!#C>se(uC8d<4aGyOpp3bc8 z%sST2;@om5vxdKctbM|>{`wnP70mh-7T47scUfx+PKzx>qN{;4z%pT;WQUoF6A{2S z=t0ALnUW+*o~8uXQM)b+R!dhZ4-v^AGMO?Ie0O-kHxQ{MGLnc}S&r)=%!+#xSp#6P zfM@IiSm|Slq!KyEAoth^C$E2Y1DQl*6RcqGa8|$X-5(qa`KeA78^JkMTuE&iwQs4m zT5f(mIG*#TIee+|(@@rv<QvI9#C;K--JSq_a9ZI4;d*LzQgazKXrqx?VF%}2BBS2| za<U?wR-a3->=YS!+s0rUvi4Dw7E{{!7i(W9^0jr4DuJv)hEv_IVfpI_uj0OtejZxR zhFh(2I9-=ex|`BjunI@y$sGgu$J9}>@Ecskcvmikyy9^}4&KxayHo4YxNdY_BQW=H z@g&jQ2lkrK9jx&TI6vTAcl2N|32!5qzjh&*Lhg3Ubngq<*NC=_r+_<}dEM1$iONhP zyS=j%HC_PMv-4w}AFn=x4gWNj_!xJ)9J}a)%!;W&)*azlH!*8Gv#x~2#`0fk9UQK0 zQmM&jqhaGr@<rs2BVX8p-E!`|JcCBbnMl2YIi$O*wAKl5=bw-^QyPH9UM9DP^|Eh> z6ublE14S^Q`DE*hdPbVDqJd@gy8>nKB8iP7vyU-f!D;8#y^onZy(B;VeZ5$7?iR?L z|Co!k{)k4-+K4ekFUi>Qy6=n?qe3^c$R2!=6=fr8bsD3rW|YSSqZ}R*<&4YiDAylt zNBQL}JIdL$c9el(c9f6H|9zCV54NJ@uzPGLqU^gEQBH-WCkme|D7V}4hjcs23qqni zIV8&UOYJBJheRoX|20atGcv9%e;}?B#`P1dLg$vmpV^4SQ2Bfs1F(T$%)0>n3g&im z4;A~`q6;}fqOec)`48_ySlQ0*&BG$@ZsBfxdt&#)TcF~6E2TH%MN#`53%!wJhHHr9 zN_L3h2$mjtCSiIh%%F#{^x&=^LSxBBzUxZm2T<<Fj?;qe$SpePPG#TT?Uee=X`Ix| zQYEw~4dsgo;gwPOJe9jLPwyFe2Rd|)aql)?@H;1fN;EZ&${E=3C-JEC;qDQ69HJv% zV7JOMLo|=)KW^y|4IIhNk1ZXd%@3PA9insIW4A&cZ|KRdL)rPUr9<?|U)Zg%We-to z+CvnZIz+QB;5$TRatwaf6+FG-e*QJcaQjtSF2cWi2ZGkM!!5A<wSH7&4EJ&I<da9{ z+v8&?PCvo9<`}IA<_xV!53LBcv?3q)?eWn^D}p?&$j9sd*YUxbNGr1Nd{&@UUO?)_ z&6#xRc0@buJw&?*mWj6Ic{|zzLZZFv2z$=CF3;3NqdhDn+Uz0roO9&=L$rUM$7t)N z61PYhwP4$ex(-oyXVmqKddD`NUCaYMkKyU%C*=6kmw@>amial^7lZZJVP<PZ$kyA= zmgj_LxKcVPpp$~2ll%za-30vvZ-V9d;9Z2#%!*x#tYOT;`RP9st@;o-i%1rc;|+3x zjc^sxi%1iZZm_fhzCe^!0bgM2g~7`C0_`DN-#S}fV4N|RZ-vXaTDW`zR^f;tW;z*> z=o(RS*NdDT%J4-E>)S3|BRoX$Xo@GRxJE7}>fBIHuxNJ~b2$YC6kG@kzi*X8R4|P5 z+~&8rk}8r7NZlCohad+f#Z%Zop^rj$&S#_iy#-kb?<4CsSa=!B4ZK49<qW(@ZqK!D z%jQAzF-T{mE~h$!>Niwvo(Z{Y+yCL|I=jXUs*9+;OVzmka;_E4MWYueuN6lDaSBbN zte&z#+&8q*dUc_Zcio*TM0gjc0e)gUKi%kOC;e>gWYx_D<?Ny1Z-|&HUT;~cU*@TY z#))SMEPwxH@bjwrLHT;68}`5h-PQ!=)r(7(Y4npH=S<;u($zS+x<OreSEMEGVF_=V zVz@YmE_CKRjrvmRk5Rp;QrD~RYRI~IvYneDYoaUwOIspx4SeA>U>90Kb@X!9U)7jO zLay{VmCPlRMCK7?YUMjT$M71W1jyY)GKk!yNRuqK5w=x2ky%7i6-jqn#T#z!n;=7d zR;TdcRVvf3anXPryh;^|Rq4zLzQ3K}W~${~LFm&>yAtjY{CpFeIvugp!}3=#mKs?2 z2^pWSp2KG$ZbvFCOb$M1)#tBHF>bB%2RM&d?^B<<;WLXq6YJn}T+ruwJXElJj`n<d ze)>Cp&hY#s($9GMiRZp99nn3Eo?F*d8jt73-=Hp``g>T;2`%i9a_(D2te)80usl~@ z8-~9Wgv&m+_waQg?-(@U81VK%*JA*l$AC}i7FkbL+}|D!W^~%^lNm~Yp(JW3W(M$T z#l90qX7~y)(aN;Qub)~!AoK&-(&0MX0L!04cr`4{>#~gS&}geyMPsTl7buu&ydLNo z?zQBI7N=(36LT*tmid5|nF;G|mRZU&Z-SK>5WK&G+x3aKL>Mz>mD%nH#5>!b6HcVb zl=@b({;<k3R`-eJul$$>C#_C^JqZpVxaU{aD-~Y`#1g|jA#h>PfeimRBCW9W=trA= z%e7D*#*Nu@RqPClsVb&wfjW+nf%jQw4VL{BkvbwX4U(|lngWPq5$PZ@&LCf%W_?41 z$Ot0wtAL#6AQ6H&k<1V>hr{|`tI#o9e^$6{BUCw5t%JpzA@4qfwlRYzM&}EDjKwG8 z+VN1=YqVNK^)9tl)GkzQj3iIBs?QcGCelJAPZ7V2rhB&$d5XJ>NOV1r|0+@`XW2*v zkjsc95jkIx82MqH)rc(UWFi?vj#Q*fHqYQA?grWL4A2Pm`2zcc_2JTFgTO}#eXNE> z?IQT_g5``}Po$nmjX`Fym_klQaw&s~P|}&$@0FCFXy!k9iuwSaZdFe)(t3(@)LEx% zi1a6Ni7D(zEli)imk)|u*kjlqEX>@YJb<1u>FMtPYlg4o{~XqU8<F8JCi1;O`u%1h z?1di@sUz|(EU#S{Y8A8MKSWk3vm!LYu_(}sE3F-x9BPJ8lL?E>ol+9HPJOXIsO51; zp*Dxw{;GB7zAgoK$U8sT;zo$~Y=F3m;?1xk1^ddm;cuFMN=*wjOJT7EeH~Wwunj7S zM1KUNM3Fcda~5Av!rja7ab4v0c}`sq5KSg}yQ1-Os-o?(tBvP9d{@Pmv_X<aNj4>e z9Em%>Hpub2*lf5hh}Wo{5zF_C1CqPPt~r~nJDpV1$&O!Gi+EW)zzMPHJ1a!qgZ&<W zzn$nO2Ayrt88*t=yg@X+0q6?`9cR$1ZIl7z5gkr6+n~edvck18s*<1NbKZ8fr=8K= zt#A9K@#K+8AG7Eq$@tiECM!`dyPtL%Z*7ZJ8BXs9P*P9H-|L-v&&kH!7D!}g<hC2~ zkKK0k@iCPCsE^^}J>%m(EjA!oc5&?4^N9{1I>(?Ri58}FmN<T`6XYOEl|S5>6eduZ zMd4LOxCD<B`D2l^e~I(8zwJ2lQ24R*QAHmI86RJr!R9HFJJeT))UCFfrvQ>oc;m+( zpyWqb?A$Lv;`LaL{ZEO+eF9{uL8jS=_J1O&L`oEims5U>Jf8pF-#(@-a6gIKY-%%% z_MbJVc;PU%*oxhekI^#QP5uz43H#7fH9hq*p1wXktS)=j0cj<&85WltA0rKWi2Xew z-=}~+fyJxuPp`4Az8UnpL^6pigvE2`?a}O2U&vprh}a$QJXIFZhpyTlqNtRj$tvnC zXCgk1faFUMXM_<@dx+gy90BLkM+<$Nsy^anbCNRxwjBO@L?5jeZ?|SpcIRC`!$({r zd~Afpp8zdVAGJ~qHc}h|y2P=VKGNx9f%@=E@nLL$2I>A6yX{A^^#`jVc($Jj&}oRN z6c<o@i;4p>U~h_h%KPD>%ZSzyJ>Q_Cw47=gw3j2vw<T35=SWI+Q_@2v)pCML>f~0; zmW3mh%QfMWz)x;yKf>}Se+KdAu*`=tem#^$&60Cf|EL^h>D>=!yzIGnjxMt4Vm9}o z`xIOi)_rn_G!w~$g<GhSGL=h~7MWZNG(t}pi~Yg#AgeimK4L$IkG|@oL3ZYFJ;JY} z%J$A+iTNqm1Hs-D4546K8w>4$lM~w`Aa9~6y*|rXtObBShiHSM0jcf7CTNoL_H|l4 z4pL9j2+7No)KK!YO4{Y1<A_E{FO_VQpT4ssJg-d#h!37RcLF9*-%0&ds&A2rOCvYM zNbC<b1y5KfQrq_nXb-2hFq2KNWwX@;<DDjmBA8CFb1j=7Uf#sY3zu@TYYFcgcE}4~ zSrcRve18VeUqH$GM)Dvfh4d(eD1)k7ELHwEr>tTM8z{_EVGn6*ahm(qxGk7^I{1dd z<WoaGJ;lbqmcr;J2ro6lg+_Q_RM>G!BAQGz!JyL&dTOwY10$62$Bz(ZQ@8;Z`@%&= zxa(jqxNlDB8r(7pt0{cl2=_O_iCA)YJ%aUkifB90nFd|E+G&92f@Rzlp^UK<CVUBD z8Z2DS$U$G=zO_54w!-&7BEyOFQ{Qzm=Xa}k&bx8c>b$!@;T*!d*08czzw@->`l|-K z0U7=ZBC8eg%lWoHPG9xNaQrPH+(h_Qg>&)zA?VM24qoi>`Q&$#zfbuFxoiqY`z+b_ z`p7Gv&DY^aC|-a(wO>ph$zQ?8+3F)kCZ1?@2A-#nBQl=I!HV>dJHK_>d(Y7p%0siW z6=(_304yH<AqLGj#ykAqp4|2DFQ>4X!Z%bHkV}#{%Kb7Wl>@1#{Pj(+DfGMO1(d{o z4aqbkIb0>x^5cQdT+(1mIJJ$TWH=@NQAvYTZ@0YG138;W4v`ZS@ykhnSqKl<!9*&E z?5zmqf7=WDNaqhgnuxT);t?5bBW(E3i0mfvJ}l1W%SHw#mNYH~UL}&z4CGn$5--=D z$i}FWei^(+jl1`sTeC_fB==HMLdisxG)ucZ2Xo>XMWmj{5F&-CTn~L{QTZv(vgc%E zJ00^_N;)Yyh!QO32KTd$d<VS#^F5H>-vHSJ%ehq`{XRrD<Wr{@$(XB8k7lmuE0?=w zirj^NMNnXrcV}egiY(8bv7&&_y!($w!|<MozHWR?BGwYzYGmHCC*g9MTl&N*^-wL) zd17U`i4T3|Js`O04p!D-5bKc2I-CTHi@0c{V{lWd-uQB9u6ANbx02rd9UG-prrOge z51=5!@B0?WcSM|}=d~8)t}yEe4j@>qzG7tdK&yc{3ZEx3j!2<Fri3H+5h);Yt0Fz* z!>^oyx~so8`bH;q9eo#4*g)awMp$Ts9|ncTL=gHYj9v}l&K9;ot$dhbt&F*_T#pQY z5|M8diI-c)u=7^RYiFa15tbz14zd@g74T6`ACu_g3H1>plc;r%29Mo?L`sO<VUVlC zk!y+66S-6opTwNN;Z%ovcUI6Gzez-Q5>0^B^+MPuFOSxr^OeY5xMJX|mCHV{hGH>% zbgYJt0WI*+3afBLiCnB`yF3++t{|F8^i5ciiaYyDT$2@!D3ET($4J}9EEM+ueN@oL z?OI%stlp221*ETy76841XbaK7ik3;0LI1>WH@s#o1=^2j%y&Q!gB2;VA0E-jN+eT# zw8=ZR4>rWQZ{cGYeS8hed#>-kr0rap^GA{$lF>wG&R68(jlT(&KX*}FM3)70nF}kD zr*HacSjF<C&pAFvTW->d5Y}+|XrPZ24XZ*HDB3RDtY5CAl>t4L=x(A1DOxJ`8??bj zOMw3V4bY_Tf&K!EM?GE9fIM%bY?n`ojwiZQQG8c7nJ;|Aas_xu3I|8m8!%U;TZ1D% z##s{1pr<l=x=TIz<Wyjsz%Ige*j4B#!p($-!0K9tPcE*;LYSdHtt;#{`S~NOTQKxk z`iT7jKBE4`$EWSa$K}Sy{BR$Q&G0dtK5Aic&AjwzRzHc=zh`9R>UUmlSHHhg{fFpj z7ClW?PXW39N*?qQnT<Jsi-%>OS?6$8U?e5=lw6<^pUj14w%9?~4r{SKgm)6|rEm|q z1O7O)e!s$-SEG*WI<Lyt5DsXC@H<#|Q&x7JWzAdcFCP*aM`W=gKDqlc3*prE5|IKT zPbpF+HMSQH(_A8cB3ZB^9n&3+Iv(mJ{#ed=1@azlg7G!weLl2~Ehmxz^tGG5`f71L zxgVX$n-v(*K|~VQ0NLwbihIN<&M&Vdu((`F)8blW-Uq?r+!gK0ui$PH-Ms}1?*#Hq znJfr-JZ4}QPr;q?-TORmL`iXPE^fm=3e+LJSf&>z&%d`oiwi-x!$t;6DPk$Zxf^ei z=r8MG;PrmXPPXj-X;~7sBw)Mz`6Y^IWf1}ko@K>!+&p0k_;J>!Rv#q&De2T7K`(V^ ztKk2SfVdc{=F+HJc!6VC;CL38<`jt6fg;r6Okxehj)TQ+-tRiA18|)mOQio=AW^W) zzli*EOxF>xp$T9C!PT(5gTv}KGOL|gwRRTo{=Uhqls06Q!{X8^a|JHcx=e>YIr@|E zV?Kr2ENUmH7Ps?N+x0f^s7z}v(eLV?Lv01MC#u#bNnk>vK9ookk$qr!S*?iruP>05 z_!F{zg;iMC#Dg#*gTpLJh9dQ7_RY`0%+9ZJ`eq%alPImG6crwyLtQ}LnCQ%4yBn<D zLwzA7Q9ncSfJ!i(*RhSd)^ieE1jhvr-{sT}p!Py)3yV1AzH}{1n&ote!oqQU7iK9A zJf1_#+g1n2FK}kv7&^(Jlii;)=73b+Yt@nE2r~Q?M7~p`UD|H85Z<f#kVq4e#Rj<) zHRZL<MNA9J7}}Z}7)HA!nXE)jqa;6`Gr}y1(=e+g#tyU833CG6dUL>NmbRUx4b#%l z#j(KU&z<&Nu5Yl(o@Le@0rth?Dal#~$ssDiSJRL6CjA~qb?x%oKVzjSXotl~VCqLW zcFrWQs!}gyX0Aw-ntk-`HU5S;9|v23Om7PK*9XK;(|rToKMc$Ks(!<mV6(cfG)^Me zw;f;xLCnE3K{35w(<ph3N4!vfMxJRqNOWFyIvKLr`7urpJ(}J!>Fq%ERwF-8<8g|@ zKPB<3-NZS27cRee8{{L+s*&ZI7Rb9uz0S{bOj9FW=k2W%^D1ok3+Vc7Skxb7-}0#j zUq&QAq(~9`#pg-RaU1!*b-XyOOd;BPJ<tiTy8bUfn`~aGOOtjv7+T&N-FrEI@>C;# zAC7aC^9%du@T|s-*!|bGBk4Jno_qX@=Ow4=MM1l~SL=9wWtrporJ&~vBY0l%DO-S^ z--N}bP!>G#^ITbU<g5s@9>+26G6e>t<q2zeyDP#w>2W7L-T=$3iT+e(6tmKQLDmp0 ztVV9Th8=oT;81L1=`%FLdhD0MuP4d6c;4%0hWEj-4E#(WN<Q&2ybq3L;Dcic@+LD1 zM+}qKms$siORwfnP<}ScuZP8XV>S@Zd8=*=_F}yO@(NMk2B6O<+AhyN&BGog>x!6e zll7~D$4S40eGkCd`5jKDy@mQA)Q?epK*mCEZjp{WyzAIarXYucL<$OhoPF*^S#AsF zM?14hPh>myM!Hi{LCKDfS)C54UBY9g(v%3&W?=pn3hH5TemHPmumC+oZxV?P04XP8 zU+2zcRtB>k3D3HpSvAbMjahK~#9TP$#N(5G2ujU(d7{Y7K`D}Pxb-puN6$d|*hwG# zjE@oYVMh>0q^|&phUL6dF6Y4~7u-E8hxu8~JhH9<g3%Ow4J*V~1GB1`<qyw#jaj~p z$a)?YewGxrQsLbE7?}ZNrbc8~qX}fjk-174^Cq7cMm?Adk>ecAfusva_lrpL=D@)o zy&q{m=|4YWjIHv?L2QR2a}q^I9dS6%V$E0zxF=S>W#?LUsb%Xo4Dv3vmdfS_1M^VM z?0mlAj6m|S;csQ}_nG2<e+c)}+=IoMO(d^hQMrzA`mcaTa36Zd-NnJ)@f&_<#Ez0E z%hRp9kZi!d6c$hz2aA)^%U6YUiM@#UiEQ~$5x4&J(tI^v_X=N>bjUzFvJNgv>QGKC zr2g%6Qsp?2gTZ*U;XSZth$M6Xc}$Vs(#glcZiN}`Jw%2RxfvF#S@4us&D0L-_f({Z zk<KNZtPZ0j<{mi2R}JUEF@K)Edx}*+10;t~QcFp9m6XVLK+I41KBtKrO7~f}a@}7Z zwtm1vu^TSFg5}>y7c05X4*y+drT>Pkh0H?upFL^9kCxMyGd8`L$ZiNb1P@YJK;a#* zxS~00v5t5-g{fNxN6nQ)>xf=N)VbTTZQ!3C<wkrGvYm(%DCwXimirLa*}<@$U1l{A zTXkza=!8w6e}=_h6u$BfV(4=2>XgRrJFH&7!L^v$QPeIl+S{S!oy7?eeFS7yhz~z} zOs0<_`nXYj_+&g7uMOCfMiQwda)CiE1ftjf*bcw`C)`Q6m%{Dx!P&vq(m&wbvkJ|U z&*9AaW5eHjGx(oj@v{G=gS?f+k`IGN&Rtoopdg)sH&sw2s}AOaoC3KOLN9QxoaPeE zBl-v|FN@87KeJkybz6AWIA#s#L{>VpaQvR-naSx(*Ptvl6J<C}x36#o-;cs93J<e= z@&Y7=JJNQ->PD!U(AJe!OpVCez#R&$f#n~!1<+@(_#XfKnBYv4&&v()?<$`S>oxK< z<e%q0guIFiAm?oM-o{<QI9d1UqywbygvCpiizag@Hp?8KTrr&Rc5oQDXQuzqbJ`^6 zFQC5fR_ISteWUEH`Y74-7Q3HM7G4^RHmwSh7!^;0)s5nD6mMODw?;Et`o!|BQKrEu zt_k3G$o3Zy{1}$k(5%2RX0<cx_3*5hn3b{(Sx+$wEwN^fX^Ch#YN?qM;^py!tb<3N zw^Eox;aFH4L#N(l4b@5@m(XKAPfyqwM81OjNwD@zi3vm_4I2!H5NaaS9Ts2AILpTt zYLHWqdUfK-XJZ}Exa~l{hs9T;Ue7}LUFHGYe8c`=Q}Jx@I<;lg&R1=We7>*co*i&D zkwzl-!(zLX7kWKp;F}iB#<-4j)DF-i)M2Z{0pV3;jHXpm7;j0~I44n(Ldg*-X^_v( z2#$OAn?}*db7sk1%fV-o-w2Cm%9VXAm+S$ni4+t0ND-gBU?Xg`8X|Q>DijIGO>bc# zV9ue=FG2M6S?44hY&MS9dnw*d@kAAux@Tgu>~YRh?oRWoh&@w^0!IK39%=Uskchob z-HxW?_}}69Ky_^1#rBRjN5rmWU?!2-2n&x1-EwLi!-FdTe@3{B@cXcM^lo5FaC|4p zy0eX$Ebkp?W~X%HghZD7_;}c<`~mu_r@z~^aNI$2-g$QyUL!`i;g~yoy!1Gw#5yrB ztg{(R8b@`1I*k1T4tuLZ{P~^@w*uLZ$ao@uzONOQHS;Wg?4-XS!(T+?TSf5an?N|B zyk(=!K$jA&C%Q<{RC(N>k7_!^jlan?P*=_Ic6f$iy%ukT|7+pZne8rTNdcC0A@`x} z*ClvuKk+QD?aw<PV%y(1XCr0@U*MNo_8IR73tnOD=$nw|AHEYs{0NJ0_&omxuZ1h+ z)k&O~BXx--)YMV)s%l!LHioCcR;e**m8SJlfz&IG)5Ua3qyL2TPFUKDqNQ@7_xO1_ zKQ_#s6DOI}((EtSx#keL!ZkDG64%W3dYt)=+meOqWyXpcOqjC%Xl<w&E4ZSU)$W%5 zg!`@i%tLDaC|>4e7}CePB-h=5E%zkLscGd>1fR&@-+~ovPxJdJ=K&eNu-hn$dRQOJ zcb5+jLFJ6n9D1s!r%d(KDEC2tM{Y8BI$M91^uLX*KTG<Wv^P>Om^=h?7F`7B;&@nl zrql=aED1TxT+j4Xug#`?+`5!N{yShNmJV3{QM=%%6&61M^t_MH0%9a~fjKVG(%m)j zuKIo6A^Ko{?+`6<%^~uJYi3A=Yj!zAhb^!V(cq)(Lo~qM(nHh}(V!p9SfPh#``EC9 zatg!GVfaUB_yK9Hf@`;~oNV_e689I7UGK4mr4qxqT!hWB0U7>OBC8c?m$~qQvt?M* z)q`D1Hk<4sWt-)Rt^CQgH;1Pf(NHWe@Lsm_%d6Ob?4NaGG$uGy;fT?$VWxTSlP_+B z?lNdFit`q)XEBNrMsd7Gfq9f4ATEqBeR?x%nQYj?NJqJBo@;d7<4wMvVHhteeqj*J zQRQb(;!OM^EPu>yg!CjVt|KlU!&7&ol=|4atE3pIt54&p`%X&yl-!__b~$>Hb@Vtx z4JXo0Bn6hv2tL`>T{{IYgr9jx`wr)cjg`h6=G4n8ilaB0eiHwNpY885x+v)})9OnB zAU`2vc7BDk%4)`je-!z8^3DepTUeOsIQjhkCsd25(hJ6NN^&WAA}D#;mJD|!IiBPW zN~$QiJ}8-NOZfdklrq$loJ&ayB`3q$^A5uZbc2aG-ih*z2>R}x{;$Q*$NU5RudssC z7)~#F)z&P-#{YusFtW>Gq4DLvHo|tTB9cv{RNZyT!jJ#<8cFYyJw~LA$W%o-B#+4d zzEt8t8BTFC#VIQGg&o^YFo|TM_JE0prG3N<FZW<+9D5P#Pi)IOtT`^u-mof6Pd_5V zKbpwru+&quJh>ov)YXxnR352HQeEzw_~aBg4leoFPI=T+Q<DvgH;=my!7|vLg;@B1 ziL?^AoNnDLsxM~NfT*MK{$F_3$;>KX){(F<%-liUAhXV~?lW<`?WuuZ?W;Rr`5UNO z4~w_euYb&{Wi{Zhh-@dak}@3pkB3_kGpsj=B<uy`1@+S6mR%`rvn+R9vdttritOFW zwo8YNv;i4MB$r6KA|0~+HJ%3>W%EKjpmiIh0q9voYlt4NXr26dDJGW)hoZT{{>V@* zw12)0ZGc*V)m76Wk3DN^*bP6RCaxPa@4&+EA7vW+dW+{sPA>1_B$rOo=_E^?#LHfT z!&>w@BGZVBPy~PTjB>oHv(X0;sU&g|tdOi@m=(1*vU;kzw|x5&qeOQ`8iH<r3+Mo% z?XY-(HMPnb3_KiP5*bHi1uXOUc==vk@5fgXtRq;WzGB^O;FnEBk#8(+!^4E&0I5M~ zH_^#%I=K=SyIWk8bytNoPbHEV4J64aN21=fs>LyM6p>Lx4lrIO<XH&4?0OSOE|HC} z@W%o2VWWjK0a;C?ipWQ>cxx<U5j$dxJo2K2(pweLHln2ly(t`dj7Us(AX8yE)06ao zLp2j+P(FNeiNhb8$_-n?YMn;;Fv<sM2~l$Sw5>QCoq-r^b7kKo@{je;pN$CX5SHYg z%Y5{ZM-MxzvD+O-91Fi;hrg9sYhdxYNJY7Gy?yJetZ}YnR|JQi`zpx0RK@QD)k0Op z$Q`OGllX^&?c@G%`7togtTUau;ndy9eQqEeVB?up!K_iRI6oc<mtDt|Prk)>L4sX} z7kG)(won_d+TOCZEV8!S7W>yQ)ONf9ZOp#Vw!#Vt=}TsfXVwZ>ybis572Bq#9P)}a zRM^}Lh?WqYYkOe_na!+DX5Ft|e3J6_Ha&bJu+764kR*odwg%U%S5wsA2hqhUYLx?Q zgnjf(BBO~M2aDsS?{U_>FBTn3B#%gxdT9<jck-0b@j94lGOe(*M@GvJo5T9xhoo9b zEr!J>hnH5ed&J9>7b3TG!hYMVqr`w8qL29f;A65|Qlj)+X|4Ada|Wp)q=q|`9R6$= zat@I!A}11Y+l}g@nbp9o1MMtcx9`oY{`(_q+iR>sl&r-9kjv8L*Rd+z^1Di2#}3ae z8|fn`X6Gk655kvV!(U2Auc{*-{w<ph+GQY8PsbVbaiUQ@fKI0eH&XWZY-WvS)_C=j zDkslpIQW410(z^EZ=bX}MKL57(nne<tbr64Q``?0r-HqZvM<%kkGrg?pbqf<gc}I& zs$#_p<n9?P32y;sSn<vRx)y+cH_<O(@m0^J1glT+PDw41j2IwQ>a9gC)OcIu9Hd?q z+2T(SEh9QZ(RNA2*O@rSG%mEN#)i6?X#WF%UJc9i!b7@S%NHKqR8pf!B{`HVKhml! zk)w#@5jg-Bu63kG0V^9Ndn5J2V@<X$LP`0&M}Up>*zh+{_YExam*rA7TyA`shoe>| zz3{tkUtzX0%=TcjJ=|=cq1$<~`|;m#WYPl@;g3fqU9POQBFIIdS&Trhoo;6FLk?v9 zwfGJ>s+7gI%eo2{Un9TG4^G4SEaOZ{S|~YACCySgoswoL*0e@W)wEdhka{&QLb*F% zg|v51NCU7U&9QIe_fVm8Y&|u@sHuU4#Xw*VQoe@}`qYru*Vpc}$38ExAE7#r>U&^$ z!SFEL#;jImT?>mZdh~gY^=OeJka{RPR4UPgSfELY2Bgk@uY?olQA8?;8~}^6;ve=Z zlU-!jD?plvY=mW=jE{RTSeARi{UyQO1XmD5U%L7w9*lU&#nO(G;KjP#Ea}g)Z`8;U zmKQxpb0BoSpOQys2?xPhHut$x0Z&1<FsqDNV_=z=bUxXOcVVJrB~p)Od!0*pew8y9 zol0ptrAJeWh03Pa7+ReCf;2?8H__Z)K(|#A?JalWnTdyV!gU)m{Lu#kX;K8w5pUTB zv{A0uo9Qvq8y{fuBwW?M2GFVCOBAP4{1o@O6=aLgVpa*Wa$s?~x&kQ&MV@THT88Ob zldd-D7fcJ2ad9j4FkOH71DxyOv*@yxE{}&5-U<2DihlUh8<fy2<@#NxR(S@g>n5!M zVQpCmABl1B@e?ez$aVJP2+q=<6B$Kh87y|EUWLJ6^kQ%kkz69rsh1YHv4mA>l0+@I zK@wPS*f3#)KI{(;vU(JE1AW!g*GQ*0z7x`nMTZwRoAVq}oup3G5(Dzy5-tewlfsz5 zF~9%H@27YI4hkOyeGh?P=K@yLCr`G9`CN|-e>#zG6ls@3CR$S~=jfG0rV)7y7Te;w z$v~V(0gq3&Xa-qKx|(#JI`qk?MQj%Q(K=EuJl6UaqU}V-C|V%5{r(%!fE=rmTKVw> zj=M(rR?`Y;dxqn!UOvRO=ZYt=qv^_bC|n%~i#;vyveVN#<?}!J-`8!jYA$<LG_qxa zwQSCh!XCKz0RsOty7&~9R?jDoZ8J4Zlm}gNnAGq1jez-$)6=|);1++zBo98QiWw_X zxs}B&dq_-SDP=5W0xZ46-D5QiyXO@|b`u$_NU@AUdF)tU%x817$VZyi$#SHgcTVt! zQJQ)fr2DG0Qa*ng-iKCLuZ&gTPIZke#(s_xXJxo&N@?KT3T?1L{mR<s*2R<ib+sh` zoaKBqEdO{GQwED|I}z^qW<?*nGQ7@sm}ni*DT=mBilQAdfRVXP!wGII(d|Uj6m6AL z{q$PlURBl^!+8gA+bde6o9R&j`M#JrJ!InZ!RB#q#_xCug~Z3BkoB-QB<`~)eXZ>) zB6&nsDiSNr+t~hz(umXx*^iJH67>_EXT0^NHx7*iIo353CEc3Ibn>`^!tE4Zufl*F zuR)KKUrTw6@w(bvcJ*=cgV|nhw*P)A*lhWDn8L1`KyN9B!&|I+Ym@DGt7OlVcAl>H z*%~@A@XWLMMF^@XSPKht65oKoe-75$G!x~wku2O?&g;HmasvW^iJ$WEi>JvSAq;Ls z;e;e7xm&%tRqk$a;VkpEa<G6*=hl@xadT@DxBhw*&*Qko)0(`17d>^$&#ki#{{t~J z%RZePP+&$!V{g>)d}AM5$@^jJ(ECkZCAWr7F<VXC8t877?2oO@b$>a!R&Fi5+>pDu z^_IKUw+FWNUxhmtEFqO!lW#WUIBpfXWG=TJxX9#{aO;ddd~5<;3%9BQSU+<s6VHd_ zjJ*uWueC^d15WMC8-mBh(x1zHZVl(w(eBo0ZoSTr)HBb|t)BWxUu>oH#MadNjcz=* zzSv;4a=G>AR8w9xx2D}=^6GkF>!lY=OT@-uYs)UYs=*TCxb^I-hK%RdGaF1^61QG< zeP(j&^IAjB;?_-W>6P5N-zA&4_31oA?&Q{>vrS|ThhS^|3e(md+{)Qt+HBmR*qYPV zkU8AC9Dk3kaTal_Q`ccN@?!SZJ>}cY3mr@`rKLJEf;Ud9(ckyHz^N+})(%+yX7>E` zu(;5|zf)s|bpGhnd6vh&G-{9=`L!snP@We4l|_4CE(Bb=bjZ{qPB3k90T9l|w_uz1 zlMcm{L~@cLTjVGbg$+Cv^nHqBs!~!YcBZf+9-&#!+@3J$;%Lpy=JIDh&E==7<sbX* zN}RJ2IvIt`&Nr{p9*qsZ|43BpKv>>K)HY!)%tb-iB7~=%H#)dhXNLFAF#jRCO6F>Y znV8)-4VKM^|M9)y|8-d5{%~OA%n~+NVIohjbMC^Sb3OER=BR1(P)84w=z&utKGT`c z{tYux?z@x&8|E<CF;C}EGt+#&k}ZSNtIjla?v~Cp1Gz+Ep3XF<Y%-^1ooNIo56#n= z=82h{X+Y{sbJkKV7vqXE&8Knfg~-zxW`2SOVrH0{d)Nz+r!&mDEVHFE%s1|q&M<|w z99JN9h8Z)$kUGPpyIVTLR4y~+=?oKlqak&MIoTz3hB@*AlczIG(^2|h*32+z_z9nu zr!!2`Zc|&GVJ@iW41-v7hWUg`S8nMHQ|oT&3^N>m>Y{l%!@M@!w7kwRhuv#*I>X$) z&TQ!nGf!t%_|zHZh{+~TXP670GcBPr%;Udv76GX<OfsLTa7$;Hf$L13&M+6bK6Qqf z<Q_krVfJ!M*BRz;m(&^N7M>F6Q)if#(@mS{43qM{X=|Nf4qa#3OlO$>35L`eX7fEJ zPiL4pSS-3-Sbuy}`yBdjJNs`HEMB4Ctv47N<@_%#l&i2Oh?X4<bcUh<8K!8H9BiY! zwR1DkW};Us>ODxoYb}`Dya;#|JP3qy*C2_i*khndP*tiV=$)MgIq6rfR8l2YxBJVC zJ2_MJm#LcK7yX(JkXw*?&hy}W&9ii#1M6#8{sDBp3Kn1QNU>qA)T)V;5Gf<#OlF5# zl)Kt`6xq%@Ee}vqPs#0+;J(T)cQCXe__u6MqRkRL$GXwM#Z?+5Q3;R?qQv=U$L~P9 zf#>t<S^$qlwzDujjFSG8><f#R0Y5#%N!wNE`fe+B&CXB6ybA4lZ1_i0@eM5el^zy1 z?vgS}ZewhPrCjhFhkvChEZj+RNFslj)5x3l6L<54a;$%OE8ktr@?aHeA$>8uU?Z1> zl(CR37UHhD-Dwo(c6_5X;!9&qP!FcM@3ByyL8rKq@~=h5bxY$#*D*xWiS*P0s$^Xf zAHBObe$D*<KNM66FW;5GO98!n42z4<vHhH%@yy~gLKK{9KPwDCvVf8XO6IC0PWl<i zRYo!*Tyi%h(S0DfNhSSd`w1*1Rys8G$q_2;kS~9<s>#xlDIG>>qDt}QjaJ^D@W}?= z>_LEQ?VCQ7bf+Ybk{$C{C;a{cNO{V4ee@+zrorApK{GJFpMrW7#LL6$S%&xSR)<XH zS<7wyMrg{Y*-lN7YU1QrQ<af+JUmiUh$bEfbb_M&<@e*A+Hca-C%v^Q9r7c#y;2z2 zAWA1udXh@<!&D=YN3Gt+QhE|CBf4j<b0qKj!D*;v;b=Pme>2f$Me!~5Q~5wO{I~5s z**U}hI!zslsifA|7uph7Zg+MTQO+ks>q9gQEt{GF)QqPF$L!C?^`sO0wJTQvea$M4 zw!5OEogsI@C1jx=BB|qGyk(;POu}52U&}4`D6!;SPow0~EO{d=mOTCct>iy)|E=WB z_!otcvgWX?T9)-7EZ&zJ$^~B7I*jY4%x}Y=OkF{3;_=W9R;~AnPn<+?Nr?L&r)|Q> z=yHexl7M>@!S2jM)Sb>I(b<k-2GU!`{=$3l_}5shDb4RlD}RpcZq09&yL|q)13bPB zKmKZZd`UgV%Xr9ngJ<=0{wgjYS3GKs58j8$rKE$BES1E`KrU#_-vB!O#reX-*l+CC z;0=T!)Fzw&?Es_wi}xlXwB*qtT28_~YDZDK^C_*oJF~~hVmRRqi}hITMrz4#w^&uz z51}uG3x5fnEmCI*L1(uZXP5sJ+1bPPl3JbJL1(RWcD*|D-nOz1_Q9+tn)4g{pq0;s zcD6<G-Y%zwcrQb}W9dDrAG}AY_c-}zX5=>8__f{MJhwML3GH}l>tV5@%>Ebc>mgd6 zsY<9Vp>~#P<K;h$*&c*bh}09Apa}jM`)4j$eA1W2pcnOK>Pk584W=Y25t1{EWQdV$ zdB{RJ#1A7nfat!82IOPCo!){kA@H_(Pq}h-aQ%?RKGOaKBw3U+!z#qPn3X5;)Y&3$ zzKcN}p`Sg2{lP(21s`SfQAHm`#>WSEdy(C1_C^kk<<gpO6-&wO0G&0<O%w+xzEZ^j zX;N{MjQGll`2}0t2yqf6eNTiWK_w+pqLNBEPRm;;lWa*bB!3sV<!yuIA4l;zSgi1? zc;AA-uKAMbayiWwGuS#$yqMxriWeC1j$V%VWlTvFZ{<HAxrdM9nVxtm#Vr)yqT+Vh zU&D@)Y@v9Yykm>oAikL5eE#+h8|P3TcM|j`ayQQ9Cq-k;?iR+G=1?NpMD~Hj=`OyF z-78K$(8qd>GIbwZ8bvs&=k&BkLIZq#@;H3?>1zorKK{9X4a01fdGGLbN__wCA#0-J z0GLO~c1j*q30_`1fX#!CwxD?S?(><t5wmxXrzGiQNJgoohg8qvf;b=t?y<%WD|Zgj z@kCEl)F&r5Sr3UifE-Gsh{!&Qw2IG0IKa2f0a8n39V}L7{TG%OR-=hXfJmJpepzWF zH9%fNhSPsvA{^Hr@KXv`%ES{mfSTm4k0KACG1wm*Ko#(I1AU~^$4K>oAFswZ?RKF3 z43jk+Ks1kNUqyRJ?xRk7U5=MS^<juF&}&WTJx{jYUxg6XQTQt?-XFfi2*>fQQumk; zZ6dmzXq`cO8#F0c#_O$J%a})D(kT!=YJ}_X{UsjEi}CJ9NEwrejwhO7P`^Q6LQgdH zNQ+R$nG}{$c$^VVH^SOzPk2xS;jRJ*TPfTKiwCIbgUAQSkNv>|)QA>YMs4h=(7vwP zfJ}LSC(stD{LE@RPN+{29YS=bLDLj%k_T**UNed25FM>(ha975tz2QFycj%>Xcf^@ z6!l9ImgQcHvP&L;45v%R5^f<JrEr<_u;Eg`zs+{xb+G)=rvd&N7QbouJ!Yd2&vhQW zm~ax|1q#Q@#P2vKG)i8*Gbdd2pfx9O8ktGSBueh4#CcVBW_z%R{87%rYAmvy_|qvV zp(K?Obk$P)dlI|R-`%X%W>-C)Xd}@>6g5|TjOc6JAm)$0_qEDO<GEl<zFW`+Sbkp; z)T?2!fcYx&%UA1y0qXZ0Yl)^1tupA{dIP%CT?UoO0$amIo<&U#H94y3kPD3a$)8&F z;K93&Xcf^B#(kVYhX=wUIfG~$(LTnj+{dLXUrd*itQg#e-HU>_(;?XM7;D)fehM)2 z{rZU&24}u+0r-az{m`I=iZ)7}jq<oIB07!ebBgws+&9<-;$*CmwDp1a2&bAg=Y^kY zZlJF^`WmUe0y6h}=d}8wo*{e6a}QakRj!NsQ?i?q-YV&kbyHcXS~+rq)nFVudl5}K z1L&4ntiRPq-cU`6Z1}~}u#bEO(&>z=VEHFe{kEz*<USSE%WEH7t;dUv5~5{9XHh=1 z*?R2QjGO9h(t-6LZlSl!+3KT3PQYJ}@(qfFZ!wIV8%fKS1gq-aNIIXM>*@Ja4WeCk z<gm7_vL3%nVXfDG!*Q4=xt3c0Z*6Z%lg@;6+oP;~n=Daji@d5*zf`C+SB6?r_l?I7 zpz&u@{SK_IR|-CPclB?qQk&dl++JzijxcUFy=T>Dnlsk#pxY9<y&hKiXmdM)sW#7H z@YVGrT0S}IHO$OhtHr_K^!v+HR=-Tzn%RE*^9Om*E^oY3-an6^ympqi2^QP!9p2pS zas}p-UX%4BDIKyO433dJEulsp)DjrK^tMaLaY`s<38@26LIJEup7~$dh`m(?p=f$O z$$0J?^t{r~d9GP_>zV1kM4WE15Lxc5>~@QOEVP(~9;Vf5kRSQ1%RJ3-Zg=r%PMtGJ zp>(hB*T|wAHeIp2{56}7SGRJJU55Fg%c_Unk?<ZY|4x?n3M@{`-KRU#a$t~m=AGBv zby<*0;rO#4%u->!e2P=GTbVQto$H7c5gDOKKn}`uW`H-&VcJukc`#Uiy@ouAl1567 zFp{69u+{icddoW}i#>Tjqs|7p85SeI6y7-BFPi8@zUJ$$k$*^G3WbYdl}|JMl&SX9 zJ5ge!etOUQ+E4v*I}G;I^Y3M2mq_wgY;65{)whd-6>@JbT+Q;vvAl~}Ual#Rsg}2g zH^sYrT+S!^xaIv_>y-ETJx+NIUwY-;9HG2lW}>`WmiH|z-dagbw%U$IW)+cyfk56? zBp~-82sZN}Hp*r$Av%iaELh(0<+AkwW>qokb~}p;@*9~Ios6t2!m}=6RtB>M+F7ko z^=DQcvwGWEdB{45JM>rm`w|*{4xm3C!aiJo?Dw_x3IhXcM~1(QNHdWLr>k$j!UX44 zh9{J2Y8t62Q%zrMp6`p{mLxBRXxNO?NTy}OnoRXhs&9nFhRg=dPBICpR}dTY5~BSF z0Ub!WIq=T7ZVMUL_3kpndk@6h6K;4Vl%a(6Gf+Z0OZWy>*AiOYnWL~B4-DKw%zR@1 zsTv<8ANV~wn>*R?S??VS*&AINzw5kyiM7KG#QoE?F^nKT29FpJ*l-3`!N5{rVOimp zo#YxNuHpJG<nIW=cLqy$u?Tz2ht2TXt1GXS>wEIHlP3x<%?(~xlrQ8m@+#*t{Yh;2 z<IhFp55X#r`M!_dYG)ekMxChQEd=Wcj)BD|010<tc)M3(?41`A=_GQtB60G^XVyxE zUXCNuI|azW#!GWJ5=CSfk<RHXC{f-7@<0BFr~N5=jm8W0rI7mb=wy*PNs`G~oCk0t z+b)k$7ZLRn&4q<w$Jc>+O$|<W`VP>oq}oZ1btpL&4!!EL%u9&Go(E*0LAoure!<SN z`VvVY5@(R^&LdVlNp}vW=aKl12Z3i1Uk|GgL$yjD3F1Qzjc8cR5T(|0JpIG4m6TLb z@)j)58{=EZtmyNRHBY_umeKISX>{y6h%>@uG8FfUgS~(g!%g&&N*`CM51$+hhR^Pf z$F}wCj^Uq8IGgYZ3Mb2N`WP`@)_%(HJ7kS+`{mCP%;OOPnD(4~V0r2B^8@f%LZ4s3 z^6JOpK4Mn<1;~0A7VqPn2RUPV4BKI`Jxh2v;e1$oro;xuheGVFQwZe{ngEL)e|^?E z;jqvvh*S_642y^4j=4bifV+r~IcoPY532bY(FljQ7xit_cQg8rZ%4mkFZ4+UKS@t> zyiw9^Ze&LvPlKbrsc`fjEXMk1`0d;UMAC`ORisf$-sf_qMv9PnZCQ<K-A^=+=xxT^ z83+si-~JaCUN>5Felzw!kOs`T1WBdTPic~o{xONtVSL%7pDi8Yylm3blXj=HgVG)M zvkoy*ODR^Nn`@mwZ|}}WxTP{d(^^@r`}5=~Y<m^RMLbL3z#n@dT)k>s-DO-=K;of1 zr9VzIo9J{{{20R+r06d=m?<i1mjOsUQ5!^KDXOL@4Hlo;AEaoE?ENtZm07xankHyY z0O_<*Z>l?}j!`vkXWYh$`sITLs?D1Po|-*Ba33^@gQ01G#m0F?S@W!u(azExMbbRS zs$v1ORn$(Rwp6w8a+8)9BiCx$B6F5n5-uC2Qc_9DEwJ`XX$f3}l&ym6K#H7&{`d2O zI(MOeK0v3Q1L&lkPWr+sPc>&3ronlIBdrI)*oy%EHI<c%mzB4o#Uo4!>zCM50vA_b zK;a)k?Q&R=G;fAzIBcJzCX1TcT3(A3g5gkj5~<hj912-PD~OI$G)DR%G~Tmm>&DL5 zC@q>cOPac9lm@fE4yos=9<Gk3s|LC{#JFm`g|3?AX&Y?>x+@20{~<s(!s2j#Q_)6g zf6oe#>#i?|jw8BUQT+bVpcmL)c^jmHXfe@ZgI;R_m}7foXPrv4f#@v;O;WT~ZVE>) zBf6XD`HJFK(~8E(-<hmllO)-a3V1(~lH{R~^ng{KZ8`?i(2lY7UV!5X{tU}&O`gwI zGpm+aAHm|CqDOA!bwv0yTMBj&#reJQ0x34;Q`kx293vb7VTkYhm5*}xJIMFG82t6z zje>6Y)%wvBW4V;bFe2x|DlazmVTwzkhOmjBec^B_rctq<ak{_lloQkM_W)@n@(V0I z5kyO7D-ORdQoM6Q@S(fC8uL>fe+kr;j@shQgG=?3A}@ZZuj0*IG0H-+!(!&BnLw8* zba@r5u9F-)?u9H&f4x4CbP?%(k!bgA#aK_U4+XUp{62+K4t^>T2yCzKdZD`p+5X<c z0DcCGGherP`sNtEJ}!UEHRfo^S!FFhS%C@)M^jkr2xqQ{mX|&-)lZOXI!)uIN(!}X z=W%knW6oGHi)Zv60cB>a&=1h0T&CEJ6-j*c^Hg_hG`AAmty$dqc%0S87|dY|W*URp z7Z&fcHQ<*?yv|=Xk^R`aIGW`g3TuzanvJ1Vywa*8FDUD>(Ioj%&V|X_*zgBf#!Ij` zjf}T{{lqYehz$P^kX%LZAtNGPURdzS*MHknFT4FHYICU_Vzk{=8~STAzBw^3MB5H+ zJhe5{`i%BtJWq%;eP8>3SbP7#EXOu}c(QcUs?lg_X;_31!f28dGwX*;hG-=WqfiOO zWSF%v48t%QhS6el%dl#g45MLcGS4&I2g7(mvFiPNj_W$F``o?D^L^g$`~Gzu=XrcS z$9bH;e_X%1aXI9-UdL>a+X#t8_UsN0-z{<^usnc?zsg#`H-qvVDM@LdJnT~DgQATr zCUno*o{ek~37I5hyMzs0*2v2&oI^++Arlo+ZYrwQ2yODXP2y0L2<WncY^Qz((n1|A z?5Y-;WbGxa`v$qx=IQ)@EudQnZGpr`I3C7}3e5XGO6l2L%s_~ib#)z=6&|Eb`q<{# zZ0>^5Wd*T#Y#)KeOe_9Oq?My-1>}prt-Q0@oJU9=A!jHA_lMyQ$}=<sVXPC}xf{>4 z>+^E%S3SRdn_CL%x;@EUEsdVS`}%PwzJ6RRuTX)R*(p*cu=*M=fxv(~H-SIh1oAvP zvF3NHoxkwL`IVj`(NlcQ1g3RMz)S<?e#A9MY+1n;=h?tH2m~vc=?q9L`@QwXM~C#C z!)gnfdM`AB7vl+0awl(`;|%)Cx2&$4k23A8X(c#yuyr2N%1B3AAxLc7&t7beAe{L> zBczUycNEejc{YU0xR;^uMuVq`?;!pG#dk=Cjpv-R)W$C$K7JDLmnc3Y2kG6C7D)gP zuV>*H)?_rdhmb7GTR2oUO6Qv#BpW5ftJ^Nj<Bj-wfx|={dp5iWYuqM`_dhWq$Xh?- zUUd;q$=$??CRlQkC5HfybjY!BquQ`}VS76lw1qC5>oqR4P`7d6Z}5pQi0zAMy=bJa z?r;3|i@Ls^u3Mwj)6-vSwGF%Z^O_h6m3ycDNOD<0g;VXjAP`Jpng4pV)5KoZTNQ0m zIqMhnucpu&h-d$D9{O{<=-7crZt2DCOi6WK|LVY-0%elpDLmIZ;JV%-nCiG!?v$A4 zp8Hj!xk%6J0kaVZ=1hir(;(5Ek^kThi&*}6!`Gb>`N~stb7wwDYpBEdbA&rAWt3Li zRhBy&5D3OifjjFUaZt?Dn-T4DBc@yDd%UKtYzdzU7PVONR?g0kzsXb05`*P^5+mDK zTUOqs<mqRBec)kx7SD^s8D!zQzpYfm8smo-Q^Yq*+!Vr*QS|&9bh4tNf681t`^_Cc zvfuEgiE+}(U)Y=tuw-n%zx+Ks`WLi0tu`}<^$@+AP8eq*5X@&ijA1m_P0^B8>n*Hy ze8-UhvE$_5uX8Zag;fhgj=)V$l)J!sezRiT1=gks3U?P+ADU1mv;MXT=>jYJTs<wh zbxpZfR;DSZ6{6uhdnJ6VnF=2tg5;?<krz^xa~4#KAr(!UV~RT22t7t5uh@*RY+|)_ zvR;h??;7d%gY}6){ZrNfOgb$KX~r|nVx}2j9GY&&goxw9->(2<3nAY^G9#z`$nF+U z!W$;e%WKF<oCeNHNIWK(cOlAUVw~k%9Gr`nCFB-ON-<e%kt-47zK#?fnu*moUPr=X zSq4xcw*yc#DOssr0hS}xGwEO297v}y{RvF}D8{j(1M<d{h@1@}s+y?2M45dHXP_vm z0%t?jc{wu>kY20VH%G~FW2^^v>j3=>fM5!t?<h1u3eV?~Xq@EXx^uyZoeL5}uLN~% z=Z2nkLSBlTBku;;x!aLPgSj*~9}<oZx!kxmg2I$9Ah3$SGa>O!thU*_M^`I9%;1}2 zRnp{!H@e|EH@w~rSG(cW2x~&Y(C)@lBpVF<y{g-q)O_#Yn{1@q#FRgQ#1t>3r6La2 zautl3tQEN5v8yH_BLjqTNJguN+7D1wMb+(UD<Esm##7U#HrSl5C8ULr*<?E%d;QVY zX&6!IL`9ziREj|bWYa7zb8uo=!S^uMpKUE($cZN>nVbM5Hq>Fq_^tmtWWcj_Bj>)O z^)hgC$ZdqAi}+Az{cGI{ER7xe6#^RxTn>ph{%_9YH>?N9pIO!hfqRO4LZhYwx=5iR zd3ps~dxISHDu<~7Qg2i0K{<z%6jCNa>Q-(iQdL6Lp=vEkPO%G(tG7Yqn6E$WL3|zY ze_d*sVrG9qL@@qbsJ^yUZBR8+l|@xOByJ&ZJCEzoDA{n7RYin8N3Kb&jJ$gC3YFI> z4QE*u&s1+9q?3@#UC7gb@T}^(*Q^_VJSv(@Xi_GiV-*@LH!3tFIrp&yy``@!cm>66 z&7Pn*ZyoianQWT*^ActzB%e;l8)v39vO3$L2$m4i>_T>ViJzL+|1__!@u`0j8c0|U z$+N``VJTHH=RuWktC;sCRMk>-RitV*RdMG-H7!zgI#oGT9S_M}kDXl+9{CE~1=W58 zmJ--sffYPfSa>8yu69|AS&S99*C>W-q~>MJf2It09@#d>s>lrp1Y2op9VC|7&MD4w z{l6Bo=+W=gZmGOkW7S#-^KaW(MmvcYz|Ku-2hV+|ANXmO+N+TzHlKcEk}`voRHZb^ z`G7DBi$U>RZUFRfLW>C<s?c^h&xWvh?m<W`A%9)$wB+M#2rKM+D1sqEzEDW5JpCl| z7?8ezy7N|NsE`YItdC8ZafGiTHE9N@Wl9Z5%VZW)mCS|-m)agWD}q`H>NTWhkvdDM z`1zz#gK}_~8VKzZL1oiEj?^+z4{}qTt<+i>^@>#)bg(a>O@#hE8`bL!v)ewmP8m65 zehXc&i>S|tGC8DbJyjVOLbcj4AZ2WM9DZ9l{GK`4T^wy;=-jj1P&8ku9rmV+)E9I2 zH%NUkcm2Oz-5eroO-Nt9efSesmyfNB^sROmYLyJ-o78I<N`4<m+ub2_cM;v~3rX8) z2HSl=PM%~no<`)Xa~86yFFSq*DHwebNS`y#*yG^+0aY`odIJ*g<{vN~hx0}AI4cf< zXwc@=@evZrNhnZ4i<~vh8ZkMnT~A2nOh7JkZ5{+4cP^+6oq#Y_Mn$??*;5^lmsumx zVT&4hgDj5ivM8qu;_fO|auwdXVJl+GDSm~?u&5}W&V5P|{dDL`ZX`;meOtBsbC^^r zXEeow($Qj_=O*uCEJor7707vB0;<(TK(1OWmqn`8ZP*WIk~<%7V7hC$q9!IZT@iH@ z&r~s=;yC3;$+GI7G`DAF>3-8K?t%vAhTnOJ#qu9ZZ4^~H0>N4qRSKiAmfi0uw{2+a z`|wP=^?hktn6|zrSG!1Ueaj6}TVMJ&u1;IuSQFCLH{@eir>(E(Mb6Q2@_fFVlD5KL z#tUtQFTV?hX*KLL56pzy$+O`0?T~n*V!|}mMxnHy%v(E!(u%7`$p>XNDXpYTgXDJ9 zpVN@2Z8(Lfz-*vK5_NkgN?zCB19=+uG=n>q6?J&^fwr^-0l9Hic(5-BAqFXSUIYtz zp#B}CU<$2%4hhdsnuU3-5xgy;w`TV?Fz)6)d~b1LhI-_j!(?Db;BI=tBWEsBzm{oc zG0oYUW|>LKo79_~7_&Pu=Q=p_brfNHrLcDZ?X}b1UTUw@*fXze>WPGjbPxSZ*_s=S zUtNeIF@M@<LLfNeVpyz$<a{&8b;&f@C^T!N{S0YZl4ay%kW;9fD6b~Gq`J_1nSYOy zO-?R3ndF35HEsdmkfnRFY0U4@<QK3LATXRJYH4C`UladB8FF6PJOgI7(#%JY{#Q>b zfyLW7PKSMzCPvSJiDfiVG!7-y-TQ(Rr_in;O$+TZa<a%dmz?lv-T#L+VV>OWOWS$0 z{r3g59obr~U1+Uo9A49QTm7>CbBiuR>6IgaU=x!n)}$KUd`Fy1`m|pzWoDC|atYYe zlpWa({9D0DV3!r}h7n8*qlrZ{F@Vt+EWZ!9pVLS*d5bh_nx#J7zxjL^sHK6AAay$s zHEqzZQRM!w87<(MB^+JIblRBCrI6_8SUPGCbY~Niaw#CE(v=>`dtmm3gJ`8-j?)+R zC37B`yDQT?#$c>->i_*b5_rmmKnQ_g83`?rdft5GlwGfcW(=|jtRkU-glCmdWePX) zb}W~91<G`NTS8_RnO7;Z#~@|yM)d5k9Zn+QL61xA!_~O!Rw9j$y9~x-X}oAr&#{LS zHE4fiBKz9)Iv@pe$Z3V--3)P#Z%wwm5tP+uB3;+bX|XdpcVM*djBwOE)O#xvHDl|1 zrd!N(=X6WgoXuj&bj*15%<PU;6K+`^MH5{#vA>%5uPr;;X8w6Dn4_}6{2mgY-Fqn& zOEfgYV@|S`YMjU$37tb|EhIvI8y(S7pChE0kcVB!$AE;J5trP_5t(6=x`w=F@@7G@ z@p8AF2C)-~jlCS$V-*{a^;4}=hE6~ZAS8v5y&%!k*V7_A-8mhQY(jp4M98Trn(y1z zj5gK!UrX^V8mOXyms|tAjDi1cfLTHVoiuQjYhcY7*MoTDftmJMZmwHiBVbvaKpSya zz{Vl2jU^E_JUDA`55ngW{?|E9rYA?jnNo^L{=XK$n=lb9p|KYs{lA(`%pY5wjxqxs zCEH0d+@m>(T)-6Cn8KNwLO|Lk>uHw^+0`A(@o)m8%y`C34ks)9O0f1;R*lI`WG|`) zcxwjAp`h3qEq_EHm`mm+Mx#wEO?A_mYK;8XB6*$$>S^E+8gM5&`zSf1^81LR<b~vP zl5;5}9)*s>HGFH=X7AID9fJSKWGCf-J;G)8`X_d%<ykvzvi~|8>`bzMfaK$EsG=K( z#rrNfdE~qX2`|`S7?nwB;T3$r9A{vCj3#wpy`Pk7Qf?y!`_Ficj4a=elOx8MY(m=! z&2*u|CPY9c5)ykAAjd+26?_^)-s5MQ>{c+0s1%|Gs3H8Ej1ZqHnYYWIR+aDo?BCPC zok#8lNZjx|aw?qY@vugxyxHxU=sIwpCAWgyhm;#H7lF%z*XgujTx<q(F`+Gl<|q`O zj)yrv7pM0~W*oUOSA#oBxdEAbr8UBF5FAQKG9mpG5--i;9Zwo@^*mvn{&p6iIfVWT z5}j?o&)<_q#D_a+Be<`TTTbpXF8A9j;E7K`e~9=nmuu`B$!#Y03YYubKXC8u#^qXK zEV+TX;2xpefLukcDPU%62qB{h>8p^C?0W-eqbBK%Z1Ax8+%&7%FgKy8pv)ts1rm?4 zcZu%8wLw0;mz2JeWK(!P{VFL{q&#gX3z<rtJfW0<^6ME^Dm;{4N=k^7YhB8hH<D5* z&t1;zKzYliRDd#tl%#o}oU9bQr=*miEL6$>S!PpMx(TFYkrLxlmMEoKPIW1nHl+#_ znF2}~DPKb3N$2D5am(Kz8;YG08*WpW{ntooA>|pR1f&vBuO8T+?k6Pq8bEGSNV`<^ z!p3hwh);yy@ObwF<u(vzlaNEgG$pjjOY?aHN59^g8bRPZcoYfcB<!z*fMjJ`je$<| zCnV}xKz2-aYW5N|2G{16$GST~n_mGI98JQ9N(jjbAau*vYC^IIdESK#iG(~vNFgD2 zDg+<Uy(gl0<`dFE$Q;+oH}8Z`DD)1?S%k!22goTdWVd%CAV&}~fsp+aQZE-?X1U9; zsV^b(2>E*wi=b9cv>`kq4M7nsBcw$kH8RMCaLRm#kOo3tRY;pG9&3#!JScpMkS&DV zr;tV&{DpPO+5pHcge1-fWUfL&vd;omhkm*FlCtjA!TOs_LIw$AT|#=8FxrPOl!SZ| z`YEAK(l2%T<pjOvOA4-DedZyJAJRdoCuJifPEd1CL)YaL<DRp))6JPYG-mWT3B=(K zn>+#5o8_Gx<QdAweoFRQ?tb=<52DGGN8Gd9e1=Xjp-P61F`)*A(ucc9e$vrdd8kny z-dVwn?!kH8gM|pn`ukje^s|mzlB`C<5pvs^$Z&`m7D&9UF#9j7OxPDcC!}NnAnz)q zK^h7<6jVzcu3qtR^mu{L20|ZIXp20i&=z?>uR$rYDIB8~krKTSlx(Fm$`v+*E#(|S zMiDa6wR*Z*tCf>&C|mELgw7#!utHm9-B+CQyhrlt%rY)lw$IVVU?Mz7NM6L6m?Qm( z6T-u`IYMbjLkjs!AqWYTB9n;f*+LF!_FBkyd)h7Jqf_h_(phe|ki$#u7Bb9)w1w<x zLfS$OJ@Egp7E+1Nt7_xY7V_x<uH6o{o>Lx;IC6de3}nB9*?%1pS8|h2<sJD}S#%-` ztw9dh%3^Jh!MJ*jqaJm0H>ttvLA_b29WqfVUX`@U+ybjXah^P%oGs*}DW_S|0pT5` zTW4G5xg0o>&=HFO9j4G$`CuMB@#@v2<2;PD6MXAcJ`aUkaVI#npEBO6eLl&9MAoMw zk#r`q8WOWVg(%j3qD(O22)S;5w@mYR)3Nj}D_iV!x6w=!&0MEu+9Y9<_i^gWAL>5# zaXg(yLi7zFjCTn?&-Lc6WFNx*BqWotCnQd@Kc234Q*aODBdobmL#E;5J3xtyXqV1> z%g+)dy9pfUrqCylf-`7u4J0m$*4beC_!1#OLLOI0vCMpcONVMX7gw(-6f*w+I6H$I zNa`TzawWCOm9SfchyO>|JA)RGCKH-?BcNjy>SX{wo3VXiV>p1=3}W|EY>a$)ypzXI zaP@rQkn!hffaVkWJtVFTUs7nPWd5%0N4~t19+k)^daaQ6^_nS3rM!z#A+NjfEA@(d z%)^*ejXa64mlS80LL{)Ppw2lryM^giG2OYEZnCKlcYwz~HcU){D-^Y%DrML^{FG3m z^iekp<wQ-kP>$BCIeshRbBcz?`*X%vanDHOWI?NQ7~MXRelEt}I^pye2m}*vf}ig} z;+o;^<Jh<(_rdIxEAFsz%zAi)mUIhPOf!u%ldEQ0WhubS$Bj0L<NYOsMlA;P9EDcM zA-`M0P&pvu2^mSq(FzGjS1JE!&>%Znt$V&4b_NleMQ9&|hUDGjVa;cI@;Xd}w<qo3 zZkhmY3ArCYGR35CfYwpfK~*(Xm<N^(ao>o*NH7X1a8O8=*M8OeXMDk7>U~x>;4rY5 zHbyOhjU3m;>0ujDVH?+mZN$(9mlwGlSgySUN!lBpLuoOC76(IOH)?;#`P0KE$5}<# zjKp`I3TQi_zd$1Nb%nOdGd7e9;bub9Zw9npp?ITllU2&Bvz3G_BIHSh;6~QHR&GOp z+)YRYAvZ(P;>mK_Vz(?@MpzSJ=SIR<qKkbfqe+Rr1(YO6%*wxywQ|eE_atN#A-gC9 zKX6Y85AXVz*3aVsnL)^ANIVFg`-uhVgq05n$tUCuNS@nFpqi>Ss>+oeC#`kXV>PVq zB0^$v0a>DufV7_<k-!y%BolJJLa?3T(^{sA>BH%S%pv4>g(OIy(>dPYbsqcCCqfel zEhRKYp&hcphS2S8rvOq<h(O{U^09Ao)C)-^p_mk|9>e+F9c(>M*t6aQV_89?Gn`e^ zP>6=g8ST@(8b{(QDty;y768_hBkX9`l0D&8uxCT!^l}K3_xTpf*C*OPis8I-9J!0g zJxIA7@&+)xasN)_$#Gvos|fuYx8nHz;|CL2b^%#!Kgh+(Y6BqHMre}@z4va;W&yc} zQ1tgZZ3@fsMN$%$g7O$7uc)ZHkE;1pEmdpna_lR7xS&R!Nx(V==Pf6|8e8tp6X<)5 z+|77X@6|9dg(gaA;$$_^A<YUck;TVa&|*N72<;*?PN6ZfNgs1+mnTUn(#JI_j|sEP z;~GDn3}W(aAZ~)hCBZx;@Y#KtHr(;>Lf6B~Yy<AStmkQ9F%3MT20G+OMdwKa@<W5e zG+Zl(SZw_!(OgpNNSz7E%Q|Z~gR1yEs3xe@IO&W0__eVka_!S8wybz^)5#4e7w2T> zTAhwn{rgxz77_9-B({oY3Z1I1z*AkGCxosiw2IKxkUSL=T0vFx?NB{ot62LbRL!6& z4-&t?SXXO}4P4w@Lr6X$vm)8kscNI@G+WgO))+?US51y0Xu=%;?H>u+hpHy3c7w#j z%ny%X>2+9-D(kH(>Acx4y#^$(@g#6Z-U;q{NaWtD+>pg}zEWG$jmw4A<K$+Md$)3H z<o9z>@;)QOXPEWE6E7S4Y;sG;ou=F*8Mus95+{2ieSS>gdCrtRwk{ZD+v1_eKD5<B zTf3<(?C*5v*DTln$Tm4Zrr|40UR^eU^6wN-;_^Y+0EwObvnAHbhAp9vka2`mI}q*w z#?ugIsS$F`-a1OS58FQ&Nxzl!#iU;YiNnedKZN_E&PNv!Qc1{U7jnyye_|=$8A?Rh z8bImJQ3SUVyuX4w<h5ftkQB?Q)<9yus<JE5v3CLepD|3mL3$Tj6FLX?HYkEAgfux2 zvwk$|ROf$W_pRn))T~sUxSKW3U5J`;E#T8tu$vES&KLV{W(rwM;c87G)uhl<NRh#O z>}%3!*-Nh#GKim^pOh*?ce;yVC+wM!Xjk#`4+J*KckXqwd;Q$Ke&k-?)vK3ui?LK8 zRn$0}#wQ_q8FIITt4?Hw<{@h@LJHO}Lys{It>*EUtV1sj5(R|h765W1B(~?Yll@1s z2@AGaeS)LNWHnFjSmh>3e{gAI`=S0e*3Yr~0!Pw4Xrq%h{yM>N@fl!DmbBS@4@EFx z86aOc5H{?~kMSCI>0WljzATbnNqQ#frI5H?*tu``)=(M;hT93rBV>U>@D9bQh~aQH zA=QLTQwY9he>9tOhwRC`nt74May+5!gdR+&Q&G2^&L1VU%C7O@+?mIkb_2}WlXNA6 z8ea%%2PCc-hJD9pYvbjQd|spEXI#D1I5NCXN(L#fD<xj;!d-ISFj;hnTM6D9Vf=SY zn`9wAJh)Xb|Fls|8w()uwcS?x{x#3sW)o6N$TUr+RZbWb&WXNfb27QQwK|sI5W&M; z@am&jSmwaP6YO{T!q1T8nx^jJO@7VuDW4w?^D#v*|1Kmh4e!jf#!EKqR|uI$$a00? z8TwbP8sz|0Oh_3axeAGs?+01!q7#s-2x%bXLKjkRLue(9kS&CqsE~l;yK!0H{W%C4 zr(hC@PP`lF7)6hiCr7bhs^x`4Ir8J{RCltTo8;hjJ{GE<3M_`o*fW1^-f$dEX2F5? zAqBH(@^wgT-XGjyH4!%NX9#H|<Uxg0%G$lcCezpgZX;wXA=fFSRnFf#T)igM3!!r| zayIcv_W*yY;uGZ@q{;?6iC5=CedAS(=2Go=%cp_{XH!3bHnM4B=dtW3Sv;TKV|RXg zD@uCdYBH@q1o;LStnG0Y4R@On2v(6=Pbyl#9Zy@EJGOw8gp4W%<Vl4jNEH7dWI8IV z_ijRF5OT9Zg7WR&Rtw-^@Rfw*6LJA0zv=y`tL@M5vPT|IP7OH+tJws(V<1vS&%2pd z;{mt4F@%N)?HbK|bYL~Z_K+tJ4|7(hw`#avM)H?xhMEiNCm;kz-V5p)rMAm-h1N>e z2#0!_OPz|aM`e3>kkt94-T}!|aqPN@sxGRoRI6<g1uGteK4%g#;yyr96@srh9ZsLC z<cc^ep-MmxCv*m(Llqj5mlfI|wFg_!dO&*-T1@C~$FL*<a^S&MVX>=y4Mnh)kdGD8 zB*nK{mEH(QEg>O7sua>Lr)Yu|a>jlv6x@LVh2?t=uKeWBrNBA=3p*o;!)Ch-P)44t zK9CITe?~HQ719S5yn<j2OkrX%_am{BHL*lF>o)d*WI02x0lDroK26*#p<K&PHjy|| z%Snxf#EJPGK-ll!w4uzB91UnQp<hDs9H5nts2W)U)mxB?@a4K6`s*2Ns2E}93ZHhg z?d5^=FiF`Y-KC^@c@-pfx%-z!j2l-IT1Mza3ayp`Ks^_#VC_so8VDJqkXpI^NxooF zZiaCD@NY$UiIP?Z&LAL{6|_6M^gU>xg9iROig}2Vy=^?R`8^aKej@_GaSs5$Uhz#b z^Dx#=y^LwIe5(U*1)=i^eL|t>vhr5ePob>e%qvC)giUq|5}oDX4P;f5b-A)CrHS{K zQAKqFtOm(Jb26drgpO5cj6A)kHGZ@Jau^}84+1j8g&a}Ag@Cu3^PXzOsmZa_co7~1 ze;CB!ebJ;LGUiaLFR~{$jzZDsFZ0$y3XWz%FGJ!=WBqcP^KK)Uxz~Al;nUGnnz%43 zB;z%$zVh)Q;j{|4KSy#GGLcdyGD#DOk}EWkMpN6>M!>U|nt~VMK|<1|hx-HMDl3IF zHl`g%GB-Jpwm=GYF`;%y%+1;r|0Os17yMIh=4)DgWfv<glbd^(NY+D0<Q683F8*Q_ zn$V;Qeoba~5-4WMgxxrLSK#k*JmGw3Fy2#PsEVQBHvIpGp&Ev+<xwv~Eexf6>+-fR zlsVN6#d4b4-UlNBkt2C?b<#mx!6KB*P~TfzD^nTTezP0OW@uQYYbA%FnhZ>m<mE9` z*4x!pAmlDXsI2QA<TL4(R)3aNY7&XHZrIYh?!naVLB5<}S;|FF>R0h5BdDbeE#7Gg zt2?xT%7+cKjiKi2T_QiZA<uoNHG#jyF;saI2ggb$Ek2J{eYoy7BTfuBdT))_FC$mU zFJ&Bu@*R%*g3apZ`5sS4=o+Q-+h&)k<k>DN>fjBHR(u{lGOoe;WPCxfvx1ofw$uGi zg%qr3TRMhu7%gT!&m3Uqogi->qyq@s($-yBM>s9lwsa<()sVKOoIlx?pwqT=&_>of zLfV!(|K;+uEyYZBL)w;B_GViGQrprln8q}uZRzdBt`%)dD@{n-(uSv9E83Q_r?D-; zingVx#!tH~L20)o1nstjpthxSlZf4xptRc(f_7U%&~8fzYFk?Ls@|}6+tR4*rm)Z? zOtS-2+tMTh)wYzsz$I#1y6^+73AZiHxWSr>xlqhM3{{u>Fsg15B+ft|R$@Xdsza}J zTMyRf+mbNLIB#Lyt4lL%;KNZjYgDcDPGI4;%Ll5mE!4{@jnj9(PU#De+{Ii$oHMrW zg2a~<gper5zeC|u`Xe0wAaPND1KIeT$8Gj1q!iHi32h_vbx8b3St9O#8|(Vv*JlWc zc@&Tb)mow)rq=T1SX~v3kV!*0!MKm}78U86WoJCcgN#Jkc_4GHC$vxR!<9m!bcCbs z)2LArhl5G?eaeJT0#^2X6%!``{~63pX!nm0aJ{|>@#|bdbm&K{gO!jZYYoBMwZ>uB z8j|NpVC_5!0SgSd|9TDz_<IkoCc6cE>kWlca|k=;3`oyI3T80xk3iz~cNP;cD`~D1 z?j$6&43O&;k{~h6AJz#=1I%xNbRFOneuZ85`JkqgT1aY&QUme{py)<CqIlPcBjop8 z+)k-q5*vI)#L-=EnrWh$-$&5NfD{;RqTFJ{5%N+uGfU1!|1}xufH!Y}9E^JmW?oV= zRWcVpM&+nD1~z!+G|@VGOXCWC87Wgqxk)K8GJancZ-WF#(fzr+WUcGX9()?$&Q>s$ zCJJdHSxuBn+9EEmg7WKvaLwq-Zz!R4g!WTthdi~vQ?gY<SkjI1mQ7*v{^4Lyx=7gw z34^jc3J9<F>$OE@s)=g3945Tt;PPw*sS_Rt^$Dex%fH{ZmS<dw77|iU$YO=G$vuzo zL{p#YyLMsE#~v;qp_zm;UBbm-!YMw4LrDlc0m5LHaD12$>qFRf5C|zG2qZSx_nz@w z`g%c6ml{ZzM?z2ub+Y<0t9{iXn@>aGRMw*eml3>7!PQb^gSiS@<bkgyxPjn{6x=L( zoMkmRuFcORWD6l<6w)qD!`N;(^vMFPRPX-3#{IYhAFM9QK{u6wNSTfEab@T<H)1z7 z1H84ooYw|<bszSdCb>x=Jl}K&elvJZb^3e#aAdGxob$raDg=V@<?!iQNJT}p^yNxe z;#TY^wWOo)7ke_1`DTT{&-NO53s(WD6&wIVvSUByNGTOc3CWKdrKdB$#nVc;nJJ=V zcg^7_=J2RX!xd4`>8u&{Rab*Z48<2iS1aghR}w4RtoggW3|VSy<F$tETp~otGdRNI zJ-HjFgzLkcCI(^2`KrlFkb=oi!usR1?tBO9xj(rs>X3_hI%tY<p5xmR5^6}eiiGeJ z6=lYSW+UXfLQxHiYUpwlRZ$hirlBk?&Hlnz6pi!Z^XhPHmc}Z!A{?6*j=eh^J31V@ zC>*<AICge8HlVR{;Dd2Z-=w~=iwzE^3p?ehIcRW2Hlm5qnTkkdh2;X_70M_mQAgPa zn$B|(q+kn+XEG$zmi#+`!&jaBgjvw=^tTVk5E@tx=z$7tl%PV}q*|{fvRWt3HYs<* z&uh3|iWzoh;D;=$W@g)X01T(o@OnsG87#vOuDPf!LzsJh{2if+Pgs=6HT?CpnIJfr zK1OnE1;|B8?vMjCbsR5g>g}?Zh709|oz^SUoatthnnCI`rPj*#Lzwq6`E_r00Iy+` z$zO9hKzkAO@+OhaRC2au*GwgSV9*(zw(pNb7BP{ZAn{KWJFnqXQZ0Yt>Sd(_{(MSk zJE3b88j^E06&+bFQkSY^jj{`6<43g8B6GRVGHsr{7l!Vlp^;C+&<$!RPnOwf<pOdk zA;pADC!{FX8Y%t<8U6I9JvolyKRCGZ7TAV9xH>=BXi(8ML&r=vi;}6=;`jt>ku<&U zZR0E%)$rN8a0!`r`d&=ru*j_ja#4;zu!gxPhQ#kGovYqN%Pzn3Cj#!^w{t;y=qv#E zy3Yvfrs{|t91D{`K^se#B)#{JyP#^LQhHy_N^g+uS6OY2v+yDGK|kX#j1DY%1`Z5R z2SQS@FB^td*$V@;6-lF>!ZpYnu~t>_Za++I9tHzh&%(e*kk~Blu~XyZ^#&oeguI}T zM#-@u4S<vq5+WpDAz2dp9Q(^SQ|6w~BD>N-jJJLFpm#G2B2o5%)uKsR@)=%#GA$~t z9M(^S&1D6A$P$6WnN&<Ak{YT>jWPz(dkALa5C7Z&|1^$g>ZMY&J5z6!Y$S%yS%qHS z h7t9lYqJsooU0N&b}2!*$LPQ>atUUH})ccF4Q?Uu~s^xG<X!78sMS39e=F*#NZ zva4MNiZh{H2q`#^`I!WXU&J`rHCHRQ?9O?mNqQkA=L?a-36{s+zw~F6?jSZsQ{+*b ze5_)4PA@9b@%jZXTFN0}EiEg;{71t4dnlseuQ*jVu5t)&b@QRfDTCOk7Bh+Ibinj? zcm92ND09O@rh6a-lb%CvZh^FOK}P62T-ok3t%A)&!8YT|=lVTED7=ErM8QT$KTqL( zzBCh`FHMv!SLnwKQ{~rw;g+ngaSvj;O-#2BB=)MZedv0fJcB9B_^Z=MM*^V5&jZ>D zi8KD3XINW}ayco^S>Dxs!Yp&P^$LlNBraECha_tng)�GM;92!!r@~(&R|Lh}75@ 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%0Dn)~Gjjz7CPa`}8; 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 diff --git a/lib/pyparsing.py b/lib/pyparsing.py new file mode 100644 index 00000000..581d5bbb --- /dev/null +++ b/lib/pyparsing.py @@ -0,0 +1,7107 @@ +# -*- coding: utf-8 -*- +# module pyparsing.py +# +# Copyright (c) 2003-2019 Paul T. McGuire +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars +============================================================================= + +The pyparsing module is an alternative approach to creating and +executing simple grammars, vs. the traditional lex/yacc approach, or the +use of regular expressions. With pyparsing, you don't need to learn +a new syntax for defining grammars or matching expressions - the parsing +module provides a library of classes that you use to construct the +grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +``"<salutation>, <addressee>!"``), built up using :class:`Word`, +:class:`Literal`, and :class:`And` elements +(the :class:`'+'<ParserElement.__add__>` operators create :class:`And` expressions, +and the strings are auto-converted to :class:`Literal` expressions):: + + from pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the +self-explanatory class names, and the use of '+', '|' and '^' operators. + +The :class:`ParseResults` object returned from +:class:`ParserElement.parseString` can be +accessed as a nested list, a dictionary, or an object with named +attributes. + +The pyparsing module handles some of the problems that are typically +vexing when writing text parsers: + + - extra or missing whitespace (the above program will also handle + "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments + + +Getting Started - +----------------- +Visit the classes :class:`ParserElement` and :class:`ParseResults` to +see the base classes that most other pyparsing +classes inherit from. Use the docstrings for examples of how to: + + - construct literal match expressions from :class:`Literal` and + :class:`CaselessLiteral` classes + - construct character word-group expressions using the :class:`Word` + class + - see how to create repetitive expressions using :class:`ZeroOrMore` + and :class:`OneOrMore` classes + - use :class:`'+'<And>`, :class:`'|'<MatchFirst>`, :class:`'^'<Or>`, + and :class:`'&'<Each>` operators to combine simple expressions into + more complex ones + - associate names with your parsed results using + :class:`ParserElement.setResultsName` + - access the parsed data, which is returned as a :class:`ParseResults` + object + - find some helpful expression short-cuts like :class:`delimitedList` + and :class:`oneOf` + - find more useful common expressions in the :class:`pyparsing_common` + namespace class +""" + +__version__ = "2.4.7" +__versionTime__ = "30 Mar 2020 00:43 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime +from operator import itemgetter +import itertools +from functools import wraps +from contextlib import contextmanager + +try: + # Python 3 + from itertools import filterfalse +except ImportError: + from itertools import ifilterfalse as filterfalse + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + # Python 3 + from collections.abc import Iterable + from collections.abc import MutableMapping, Mapping +except ImportError: + # Python 2.7 + from collections import Iterable + from collections import MutableMapping, Mapping + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None + +try: + from types import SimpleNamespace +except ImportError: + class SimpleNamespace: pass + +# version compatibility configuration +__compat__ = SimpleNamespace() +__compat__.__doc__ = """ + A cross-version compatibility configuration for pyparsing features that will be + released in a future version. By setting values in this configuration to True, + those features can be enabled in prior versions for compatibility development + and testing. + + - collect_all_And_tokens - flag to enable fix for Issue #63 that fixes erroneous grouping + of results names when an And expression is nested within an Or or MatchFirst; set to + True to enable bugfix released in pyparsing 2.3.0, or False to preserve + pre-2.3.0 handling of named results +""" +__compat__.collect_all_And_tokens = True + +__diag__ = SimpleNamespace() +__diag__.__doc__ = """ +Diagnostic configuration (all default to False) + - warn_multiple_tokens_in_named_alternation - flag to enable warnings when a results + name is defined on a MatchFirst or Or expression with one or more And subexpressions + (only warns if __compat__.collect_all_And_tokens is False) + - warn_ungrouped_named_tokens_in_collection - flag to enable warnings when a results + name is defined on a containing expression with ungrouped subexpressions that also + have results names + - warn_name_set_on_empty_Forward - flag to enable warnings whan a Forward is defined + with a results name, but has no contents defined + - warn_on_multiple_string_args_to_oneof - flag to enable warnings whan oneOf is + incorrectly called with multiple str arguments + - enable_debug_on_named_expressions - flag to auto-enable debug on all subsequent + calls to ParserElement.setName() +""" +__diag__.warn_multiple_tokens_in_named_alternation = False +__diag__.warn_ungrouped_named_tokens_in_collection = False +__diag__.warn_name_set_on_empty_Forward = False +__diag__.warn_on_multiple_string_args_to_oneof = False +__diag__.enable_debug_on_named_expressions = False +__diag__._all_names = [nm for nm in vars(__diag__) if nm.startswith("enable_") or nm.startswith("warn_")] + +def _enable_all_warnings(): + __diag__.warn_multiple_tokens_in_named_alternation = True + __diag__.warn_ungrouped_named_tokens_in_collection = True + __diag__.warn_name_set_on_empty_Forward = True + __diag__.warn_on_multiple_string_args_to_oneof = True +__diag__.enable_all_warnings = _enable_all_warnings + + +__all__ = ['__version__', '__versionTime__', '__author__', '__compat__', '__diag__', + 'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', + 'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', + 'PrecededBy', 'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', + 'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', + 'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', + 'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', + 'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', 'Char', + 'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', + 'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', + 'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', + 'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', + 'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', + 'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', + 'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', + 'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', + 'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', + 'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation', 'locatedExpr', 'withClass', + 'CloseMatch', 'tokenMap', 'pyparsing_common', 'pyparsing_unicode', 'unicode_set', + 'conditionAsParseAction', 're', + ] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + unicode = str + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode + friendly. It first tries str(obj). If that fails with + a UnicodeEncodeError, then it tries unicode(obj). It then + < returns the unicode object | encodes it with the default + encoding | ... >. + """ + if isinstance(obj, unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex(r'&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__, fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&' + s + ';' for s in "amp gt lt quot apos".split()) + for from_, to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + + +def conditionAsParseAction(fn, message=None, fatal=False): + msg = message if message is not None else "failed user-defined condition" + exc_type = ParseFatalException if fatal else ParseException + fn = _trim_arity(fn) + + @wraps(fn) + def pa(s, l, t): + if not bool(fn(s, l, t)): + raise exc_type(s, l, msg) + + return pa + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__(self, pstr, loc=0, msg=None, elem=None): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__(self, aname): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if aname == "lineno": + return lineno(self.loc, self.pstr) + elif aname in ("col", "column"): + return col(self.loc, self.pstr) + elif aname == "line": + return line(self.loc, self.pstr) + else: + raise AttributeError(aname) + + def __str__(self): + if self.pstr: + if self.loc >= len(self.pstr): + foundstr = ', found end of text' + else: + foundstr = (', found %r' % self.pstr[self.loc:self.loc + 1]).replace(r'\\', '\\') + else: + foundstr = '' + return ("%s%s (at char %d), (line:%d, col:%d)" % + (self.msg, foundstr, self.loc, self.lineno, self.column)) + def __repr__(self): + return _ustr(self) + def markInputline(self, markerString=">!<"): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + + Expected integer (at char 0), (line:1, col:1) + column: 1 + + """ + + @staticmethod + def explain(exc, depth=16): + """ + Method to take an exception and translate the Python internal traceback into a list + of the pyparsing expressions that caused the exception to be raised. + + Parameters: + + - exc - exception raised during parsing (need not be a ParseException, in support + of Python exceptions that might be raised in a parse action) + - depth (default=16) - number of levels back in the stack trace to list expression + and function names; if None, the full stack trace names will be listed; if 0, only + the failing input line, marker, and exception string will be shown + + Returns a multi-line string listing the ParserElements and/or function names in the + exception's stack trace. + + Note: the diagnostic output will include string representations of the expressions + that failed to parse. These representations will be more helpful if you use `setName` to + give identifiable names to your expressions. Otherwise they will use the default string + forms, which may be cryptic to read. + + explain() is only supported under Python 3. + """ + import inspect + + if depth is None: + depth = sys.getrecursionlimit() + ret = [] + if isinstance(exc, ParseBaseException): + ret.append(exc.line) + ret.append(' ' * (exc.col - 1) + '^') + ret.append("{0}: {1}".format(type(exc).__name__, exc)) + + if depth > 0: + callers = inspect.getinnerframes(exc.__traceback__, context=depth) + seen = set() + for i, ff in enumerate(callers[-depth:]): + frm = ff[0] + + f_self = frm.f_locals.get('self', None) + if isinstance(f_self, ParserElement): + if frm.f_code.co_name not in ('parseImpl', '_parseNoCache'): + continue + if f_self in seen: + continue + seen.add(f_self) + + self_type = type(f_self) + ret.append("{0}.{1} - {2}".format(self_type.__module__, + self_type.__name__, + f_self)) + elif f_self is not None: + self_type = type(f_self) + ret.append("{0}.{1}".format(self_type.__module__, + self_type.__name__)) + else: + code = frm.f_code + if code.co_name in ('wrapper', '<module>'): + continue + + ret.append("{0}".format(code.co_name)) + + depth -= 1 + if not depth: + break + + return '\n'.join(ret) + + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like :class:`ParseFatalException`, but thrown internally + when an :class:`ErrorStop<And._ErrorStop>` ('-' operator) indicates + that parsing is to stop immediately because an unbacktrackable + syntax error has been found. + """ + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by :class:`ParserElement.validate` if the + grammar could be improperly recursive + """ + def __init__(self, parseElementList): + self.parseElementTrace = parseElementList + + def __str__(self): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self, p1, p2): + self.tup = (p1, p2) + def __getitem__(self, i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self, i): + self.tup = (self.tup[0], i) + +class ParseResults(object): + """Structured parse results, to provide multiple means of access to + the parsed data: + + - as a list (``len(results)``) + - by list index (``results[0], results[1]``, etc.) + - by attribute (``results.<resultsName>`` - see :class:`ParserElement.setResultsName`) + + Example:: + + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + + prints:: + + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__(self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name, int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None, '', [])): + if isinstance(toklist, basestring): + toklist = [toklist] + if asList: + if isinstance(toklist, ParseResults): + self[name] = _ParseResultsWithOffset(ParseResults(toklist.__toklist), 0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]), 0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError, TypeError, IndexError): + self[name] = toklist + + def __getitem__(self, i): + if isinstance(i, (int, slice)): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([v[0] for v in self.__tokdict[i]]) + + def __setitem__(self, k, v, isinstance=isinstance): + if isinstance(v, _ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k, list()) + [v] + sub = v[0] + elif isinstance(k, (int, slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k, list()) + [_ParseResultsWithOffset(v, 0)] + sub = v + if isinstance(sub, ParseResults): + sub.__parent = wkref(self) + + def __delitem__(self, i): + if isinstance(i, (int, slice)): + mylen = len(self.__toklist) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i + 1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name, occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__(self, k): + return k in self.__tokdict + + def __len__(self): + return len(self.__toklist) + + def __bool__(self): + return (not not self.__toklist) + __nonzero__ = __bool__ + + def __iter__(self): + return iter(self.__toklist) + + def __reversed__(self): + return iter(self.__toklist[::-1]) + + def _iterkeys(self): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues(self): + return (self[k] for k in self._iterkeys()) + + def _iteritems(self): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys.""" + + values = _itervalues + """Returns an iterator of all named result values.""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples.""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys(self): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values(self): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items(self): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys(self): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop(self, *args, **kwargs): + """ + Removes and returns item at specified index (default= ``last``). + Supports both ``list`` and ``dict`` semantics for ``pop()``. If + passed no argument or an integer argument, it will use ``list`` + semantics and pop tokens from the list of parsed tokens. If passed + a non-integer argument (most likely a string), it will use ``dict`` + semantics and pop the corresponding value from any defined results + names. A second default return value argument is supported, just as in + ``dict.pop()``. + + Example:: + + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + + prints:: + + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k, v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) + or len(args) == 1 + or args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given ``defaultValue`` or ``None`` if no + ``defaultValue`` is specified. + + Similar to ``dict.get()``. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert(self, index, insStr): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to ``list.insert()``. + + Example:: + + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name, occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append(self, item): + """ + Add single element to end of ParseResults list of elements. + + Example:: + + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend(self, itemseq): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self.__iadd__(itemseq) + else: + self.__toklist.extend(itemseq) + + def clear(self): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__(self, name): + try: + return self[name] + except KeyError: + return "" + + def __add__(self, other): + ret = self.copy() + ret += other + return ret + + def __iadd__(self, other): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a < 0 else a + offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0], addoffset(v[1]))) + for k, vlist in otheritems for v in vlist] + for k, v in otherdictitems: + self[k] = v + if isinstance(v[0], ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update(other.__accumNames) + return self + + def __radd__(self, other): + if isinstance(other, int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__(self): + return "(%s, %s)" % (repr(self.__toklist), repr(self.__tokdict)) + + def __str__(self): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList(self, sep=''): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance(item, ParseResults): + out += item._asStringList() + else: + out.append(_ustr(item)) + return out + + def asList(self): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res, ParseResults) else res for res in self.__toklist] + + def asDict(self): + """ + Returns the named parse results as a nested dictionary. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k, toItem(v)) for k, v in item_fn()) + + def copy(self): + """ + Returns a new copy of a :class:`ParseResults` object. + """ + ret = ParseResults(self.__toklist) + ret.__tokdict = dict(self.__tokdict.items()) + ret.__parent = self.__parent + ret.__accumNames.update(self.__accumNames) + ret.__name = self.__name + return ret + + def asXML(self, doctag=None, namedItemsOnly=False, indent="", formatted=True): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1], k) for (k, vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [nl, indent, "<", selfTag, ">"] + + for i, res in enumerate(self.__toklist): + if isinstance(res, ParseResults): + if i in namedItems: + out += [res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">"] + + out += [nl, indent, "</", selfTag, ">"] + return "".join(out) + + def __lookup(self, sub): + for k, vlist in self.__tokdict.items(): + for v, loc in vlist: + if sub is v: + return k + return None + + def getName(self): + r""" + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + + prints:: + + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 + and len(self.__tokdict) == 1 + and next(iter(self.__tokdict.values()))[0][1] in (0, -1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', full=True, include_list=True, _depth=0): + """ + Diagnostic method for listing out the contents of + a :class:`ParseResults`. Accepts an optional ``indent`` argument so + that this string can be embedded in a nested display of other data. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + + prints:: + + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + if include_list: + out.append(indent + _ustr(self.asList())) + else: + out.append('') + + if full: + if self.haskeys(): + items = sorted((str(k), v) for k, v in self.items()) + for k, v in items: + if out: + out.append(NL) + out.append("%s%s- %s: " % (indent, (' ' * _depth), k)) + if isinstance(v, ParseResults): + if v: + out.append(v.dump(indent=indent, full=full, include_list=include_list, _depth=_depth + 1)) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv, ParseResults) for vv in self): + v = self + for i, vv in enumerate(v): + if isinstance(vv, ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent, + (' ' * (_depth)), + i, + indent, + (' ' * (_depth + 1)), + vv.dump(indent=indent, + full=full, + include_list=include_list, + _depth=_depth + 1))) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent, + (' ' * (_depth)), + i, + indent, + (' ' * (_depth + 1)), + _ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the + `pprint <https://docs.python.org/3/library/pprint.html>`_ module. + Accepts additional positional or keyword args as defined for + `pprint.pprint <https://docs.python.org/3/library/pprint.html#pprint.pprint>`_ . + + Example:: + + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + + prints:: + + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return (self.__toklist, + (self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name)) + + def __setstate__(self, state): + self.__toklist = state[0] + self.__tokdict, par, inAccumNames, self.__name = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return dir(type(self)) + list(self.keys()) + + @classmethod + def from_dict(cls, other, name=None): + """ + Helper classmethod to construct a ParseResults from a dict, preserving the + name-value relations as results names. If an optional 'name' argument is + given, a nested ParseResults will be returned + """ + def is_iterable(obj): + try: + iter(obj) + except Exception: + return False + else: + if PY_3: + return not isinstance(obj, (str, bytes)) + else: + return not isinstance(obj, basestring) + + ret = cls([]) + for k, v in other.items(): + if isinstance(v, Mapping): + ret += cls.from_dict(v, name=k) + else: + ret += cls([v], name=k, asList=is_iterable(v)) + if name is not None: + ret = cls([ret], name=name) + return ret + +MutableMapping.register(ParseResults) + +def col (loc, strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See + :class:`ParserElement.parseString` for more + information on parsing strings containing ``<TAB>`` s, and suggested + methods to maintain a consistent view of the parsed string, the parse + location, and line and column positions within the parsed string. + """ + s = strg + return 1 if 0 < loc < len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc, strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note - the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See :class:`ParserElement.parseString` + for more information on parsing strings containing ``<TAB>`` s, and + suggested methods to maintain a consistent view of the parsed string, the + parse location, and line and column positions within the parsed string. + """ + return strg.count("\n", 0, loc) + 1 + +def line(loc, strg): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR + 1:nextCR] + else: + return strg[lastCR + 1:] + +def _defaultStartDebugAction(instring, loc, expr): + print(("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % (lineno(loc, instring), col(loc, instring)))) + +def _defaultSuccessDebugAction(instring, startloc, endloc, expr, toks): + print("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction(instring, loc, expr, exc): + print("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s, l, t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3, 5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3, 5, 0) else -2 + frame_summary = traceback.extract_stack(limit=-offset + limit - 1)[offset] + return [frame_summary[:2]] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [frame_summary[:2]] + else: + extract_stack = traceback.extract_stack + extract_tb = traceback.extract_tb + + # synthesize what would be returned by traceback.extract_stack at the call to + # user's parse action 'func', so that we don't incur call penalty at parse time + + LINE_DIFF = 6 + # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND + # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! + this_line = extract_stack(limit=2)[-1] + pa_call_line_synth = (this_line[0], this_line[1] + LINE_DIFF) + + def wrapper(*args): + while 1: + try: + ret = func(*args[limit[0]:]) + foundArity[0] = True + return ret + except TypeError: + # re-raise TypeErrors if they did not come from our arity testing + if foundArity[0]: + raise + else: + try: + tb = sys.exc_info()[-1] + if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: + raise + finally: + try: + del tb + except NameError: + pass + + if limit[0] <= maxargs: + limit[0] += 1 + continue + raise + + # copy func name to wrapper for sensible debug output + func_name = "<parse action>" + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + wrapper.__name__ = func_name + + return wrapper + + +class ParserElement(object): + """Abstract base level parser element class.""" + DEFAULT_WHITE_CHARS = " \n\t\r" + verbose_stacktrace = False + + @staticmethod + def setDefaultWhitespaceChars(chars): + r""" + Overrides the default whitespace chars + + Example:: + + # default whitespace chars are space, <TAB> and newline + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] + + # change to just treat newline as significant + ParserElement.setDefaultWhitespaceChars(" \t") + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] + """ + ParserElement.DEFAULT_WHITE_CHARS = chars + + @staticmethod + def inlineLiteralsUsing(cls): + """ + Set class to be used for inclusion of string literals into a parser. + + Example:: + + # default literal class used is Literal + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + + # change to Suppress + ParserElement.inlineLiteralsUsing(Suppress) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] + """ + ParserElement._literalStringClass = cls + + @classmethod + def _trim_traceback(cls, tb): + while tb.tb_next: + tb = tb.tb_next + return tb + + def __init__(self, savelist=False): + self.parseAction = list() + self.failAction = None + # ~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall + self.strRepr = None + self.resultsName = None + self.saveAsList = savelist + self.skipWhitespace = True + self.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS) + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = (None, None, None) # custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy(self): + """ + Make a copy of this :class:`ParserElement`. Useful for defining + different parse actions for the same parsing pattern, using copies of + the original parse element. + + Example:: + + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0] * 1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0] * 1024 * 1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + + prints:: + + [5120, 100, 655360, 268435456] + + Equivalent form of ``expr.copy()`` is just ``expr()``:: + + integerM = integer().addParseAction(lambda toks: toks[0] * 1024 * 1024) + Suppress("M") + """ + cpy = copy.copy(self) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName(self, name): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if __diag__.enable_debug_on_named_expressions: + self.setDebug() + return self + + def setResultsName(self, name, listAllMatches=False): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original :class:`ParserElement` object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + ``expr("name")`` in place of ``expr.setResultsName("name")`` + - see :class:`__call__`. + + Example:: + + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + return self._setResultsName(name, listAllMatches) + + def _setResultsName(self, name, listAllMatches=False): + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches = True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self, breakFlag=True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set ``breakFlag`` to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + # this call to pdb.set_trace() is intentional, not a checkin error + pdb.set_trace() + return _parseMethod(instring, loc, doActions, callPreParse) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse, "_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction(self, *fns, **kwargs): + """ + Define one or more actions to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as ``fn(s, loc, toks)`` , + ``fn(loc, toks)`` , ``fn(toks)`` , or just ``fn()`` , where: + + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a :class:`ParseResults` object + + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + If None is passed as the parse action, all previously added parse actions for this + expression are cleared. + + Optional keyword arguments: + - callDuringTry = (default= ``False``) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See :class:`parseString for more + information on parsing strings containing ``<TAB>`` s, and suggested + methods to maintain a consistent view of the parsed string, the parse + location, and line and column positions within the parsed string. + + Example:: + + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + if list(fns) == [None,]: + self.parseAction = [] + else: + if not all(callable(fn) for fn in fns): + raise TypeError("parse actions must be callable") + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction(self, *fns, **kwargs): + """ + Add one or more parse actions to expression's list of parse actions. See :class:`setParseAction`. + + See examples in :class:`copy`. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + :class:`setParseAction` for function call signatures. Unlike ``setParseAction``, + functions passed to ``addCondition`` need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + for fn in fns: + self.parseAction.append(conditionAsParseAction(fn, message=kwargs.get('message'), + fatal=kwargs.get('fatal', False))) + + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction(self, fn): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + ``fn(s, loc, expr, err)`` where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw :class:`ParseFatalException` + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables(self, instring, loc): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc, dummy = e._parse(instring, loc) + exprsFound = True + except ParseException: + pass + return loc + + def preParse(self, instring, loc): + if self.ignoreExprs: + loc = self._skipIgnorables(instring, loc) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl(self, instring, loc, doActions=True): + return loc, [] + + def postParse(self, instring, loc, tokenlist): + return tokenlist + + # ~ @profile + def _parseNoCache(self, instring, loc, doActions=True, callPreParse=True): + TRY, MATCH, FAIL = 0, 1, 2 + debugging = (self.debug) # and doActions) + + if debugging or self.failAction: + # ~ print ("Match", self, "at loc", loc, "(%d, %d)" % (lineno(loc, instring), col(loc, instring))) + if self.debugActions[TRY]: + self.debugActions[TRY](instring, loc, self) + try: + if callPreParse and self.callPreparse: + preloc = self.preParse(instring, loc) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or preloc >= len(instring): + try: + loc, tokens = self.parseImpl(instring, preloc, doActions) + except IndexError: + raise ParseException(instring, len(instring), self.errmsg, self) + else: + loc, tokens = self.parseImpl(instring, preloc, doActions) + except Exception as err: + # ~ print ("Exception raised:", err) + if self.debugActions[FAIL]: + self.debugActions[FAIL](instring, tokensStart, self, err) + if self.failAction: + self.failAction(instring, tokensStart, self, err) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse(instring, loc) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or preloc >= len(instring): + try: + loc, tokens = self.parseImpl(instring, preloc, doActions) + except IndexError: + raise ParseException(instring, len(instring), self.errmsg, self) + else: + loc, tokens = self.parseImpl(instring, preloc, doActions) + + tokens = self.postParse(instring, loc, tokens) + + retTokens = ParseResults(tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults) + if self.parseAction and (doActions or self.callDuringTry): + if debugging: + try: + for fn in self.parseAction: + try: + tokens = fn(instring, tokensStart, retTokens) + except IndexError as parse_action_exc: + exc = ParseException("exception raised in parse action") + exc.__cause__ = parse_action_exc + raise exc + + if tokens is not None and tokens is not retTokens: + retTokens = ParseResults(tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens, (ParseResults, list)), + modal=self.modalResults) + except Exception as err: + # ~ print "Exception raised in user parse action:", err + if self.debugActions[FAIL]: + self.debugActions[FAIL](instring, tokensStart, self, err) + raise + else: + for fn in self.parseAction: + try: + tokens = fn(instring, tokensStart, retTokens) + except IndexError as parse_action_exc: + exc = ParseException("exception raised in parse action") + exc.__cause__ = parse_action_exc + raise exc + + if tokens is not None and tokens is not retTokens: + retTokens = ParseResults(tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens, (ParseResults, list)), + modal=self.modalResults) + if debugging: + # ~ print ("Matched", self, "->", retTokens.asList()) + if self.debugActions[MATCH]: + self.debugActions[MATCH](instring, tokensStart, loc, self, retTokens) + + return loc, retTokens + + def tryParse(self, instring, loc): + try: + return self._parse(instring, loc, doActions=False)[0] + except ParseFatalException: + raise ParseException(instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(cache) > size: + try: + cache.popitem(False) + except KeyError: + pass + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(key_fifo) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache(self, instring, loc, doActions=True, callPreParse=True): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return value[0], value[1].copy() + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + + - cache_size_limit - (default= ``128``) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method :class:`ParserElement.enablePackrat`. + For best results, call ``enablePackrat()`` immediately after + importing pyparsing. + + Example:: + + import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString(self, instring, parseAll=False): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + Returns the parsed data as a :class:`ParseResults` object, which may be + accessed as a list, or as a dict or object with attributes if the given parser + includes results names. + + If you want the grammar to require that the entire input string be + successfully parsed, then set ``parseAll`` to True (equivalent to ending + the grammar with ``StringEnd()``). + + Note: ``parseString`` implicitly calls ``expandtabs()`` on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the ``loc`` argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + + - calling ``parseWithTabs`` on your grammar before calling ``parseString`` + (see :class:`parseWithTabs`) + - define your parse action using the full ``(s, loc, toks)`` signature, and + reference the input string using the parse action's ``s`` argument + - explictly expand the tabs in your input string before calling + ``parseString`` + + Example:: + + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + # ~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse(instring, 0) + if parseAll: + loc = self.preParse(instring, loc) + se = Empty() + StringEnd() + se._parse(instring, loc) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + if getattr(exc, '__traceback__', None) is not None: + exc.__traceback__ = self._trim_traceback(exc.__traceback__) + raise exc + else: + return tokens + + def scanString(self, instring, maxMatches=_MAX_INT, overlap=False): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + ``maxMatches`` argument, to clip scanning after 'n' matches are found. If + ``overlap`` is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See :class:`parseString` for more information on parsing + strings with embedded tabs. + + Example:: + + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens, start, end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn(instring, loc) + nextLoc, tokens = parseFn(instring, preloc, callPreParse=False) + except ParseException: + loc = preloc + 1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn(instring, loc) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc + 1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + if getattr(exc, '__traceback__', None) is not None: + exc.__traceback__ = self._trim_traceback(exc.__traceback__) + raise exc + + def transformString(self, instring): + """ + Extension to :class:`scanString`, to modify matching text with modified tokens that may + be returned from a parse action. To use ``transformString``, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking ``transformString()`` on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. ``transformString()`` returns the resulting transformed string. + + Example:: + + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + + prints:: + + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t, s, e in self.scanString(instring): + out.append(instring[lastE:s]) + if t: + if isinstance(t, ParseResults): + out += t.asList() + elif isinstance(t, list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr, _flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + if getattr(exc, '__traceback__', None) is not None: + exc.__traceback__ = self._trim_traceback(exc.__traceback__) + raise exc + + def searchString(self, instring, maxMatches=_MAX_INT): + """ + Another extension to :class:`scanString`, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + ``maxMatches`` argument, to clip searching after 'n' matches are found. + + Example:: + + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + + # the sum() builtin can be used to merge results into a single ParseResults object + print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) + + prints:: + + [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] + ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] + """ + try: + return ParseResults([t for t, s, e in self.scanString(instring, maxMatches)]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + if getattr(exc, '__traceback__', None) is not None: + exc.__traceback__ = self._trim_traceback(exc.__traceback__) + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional ``maxsplit`` argument, to limit the number of splits; + and the optional ``includeSeparators`` argument (default= ``False``), if the separating + matching text should be included in the split results. + + Example:: + + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + + prints:: + + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t, s, e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other): + """ + Implementation of + operator - returns :class:`And`. Adding strings to a ParserElement + converts them to :class:`Literal`s by default. + + Example:: + + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + + prints:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + + ``...`` may be used as a parse expression as a short form of :class:`SkipTo`. + + Literal('start') + ... + Literal('end') + + is equivalent to: + + Literal('start') + SkipTo('end')("_skipped*") + Literal('end') + + Note that the skipped text is returned with '_skipped' as a results name, + and to support having multiple skips in the same parser, the value returned is + a list of all skipped text. + """ + if other is Ellipsis: + return _PendingSkip(self) + + if isinstance(other, basestring): + other = self._literalStringClass(other) + if not isinstance(other, ParserElement): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And([self, other]) + + def __radd__(self, other): + """ + Implementation of + operator when left operand is not a :class:`ParserElement` + """ + if other is Ellipsis: + return SkipTo(self)("_skipped*") + self + + if isinstance(other, basestring): + other = self._literalStringClass(other) + if not isinstance(other, ParserElement): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns :class:`And` with error stop + """ + if isinstance(other, basestring): + other = self._literalStringClass(other) + if not isinstance(other, ParserElement): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return self + And._ErrorStop() + other + + def __rsub__(self, other): + """ + Implementation of - operator when left operand is not a :class:`ParserElement` + """ + if isinstance(other, basestring): + other = self._literalStringClass(other) + if not isinstance(other, ParserElement): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self, other): + """ + Implementation of * operator, allows use of ``expr * 3`` in place of + ``expr + expr + expr``. Expressions may also me multiplied by a 2-integer + tuple, similar to ``{min, max}`` multipliers in regular expressions. Tuples + may also include ``None`` as in: + - ``expr*(n, None)`` or ``expr*(n, )`` is equivalent + to ``expr*n + ZeroOrMore(expr)`` + (read as "at least n instances of ``expr``") + - ``expr*(None, n)`` is equivalent to ``expr*(0, n)`` + (read as "0 to n instances of ``expr``") + - ``expr*(None, None)`` is equivalent to ``ZeroOrMore(expr)`` + - ``expr*(1, None)`` is equivalent to ``OneOrMore(expr)`` + + Note that ``expr*(None, n)`` does not raise an exception if + more than n exprs exist in the input stream; that is, + ``expr*(None, n)`` does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + ``expr*(None, n) + ~expr`` + """ + if other is Ellipsis: + other = (0, None) + elif isinstance(other, tuple) and other[:1] == (Ellipsis,): + other = ((0, ) + other[1:] + (None,))[:2] + + if isinstance(other, int): + minElements, optElements = other, 0 + elif isinstance(other, tuple): + other = tuple(o if o is not Ellipsis else None for o in other) + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0], int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self * other[0] + ZeroOrMore(self) + elif isinstance(other[0], int) and isinstance(other[1], int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s', '%s') objects", type(other[0]), type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0, 0)") + + if optElements: + def makeOptionalList(n): + if n > 1: + return Optional(self + makeOptionalList(n - 1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self] * minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self] * minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other): + """ + Implementation of | operator - returns :class:`MatchFirst` + """ + if other is Ellipsis: + return _PendingSkip(self, must_skip=True) + + if isinstance(other, basestring): + other = self._literalStringClass(other) + if not isinstance(other, ParserElement): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst([self, other]) + + def __ror__(self, other): + """ + Implementation of | operator when left operand is not a :class:`ParserElement` + """ + if isinstance(other, basestring): + other = self._literalStringClass(other) + if not isinstance(other, ParserElement): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other): + """ + Implementation of ^ operator - returns :class:`Or` + """ + if isinstance(other, basestring): + other = self._literalStringClass(other) + if not isinstance(other, ParserElement): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or([self, other]) + + def __rxor__(self, other): + """ + Implementation of ^ operator when left operand is not a :class:`ParserElement` + """ + if isinstance(other, basestring): + other = self._literalStringClass(other) + if not isinstance(other, ParserElement): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other): + """ + Implementation of & operator - returns :class:`Each` + """ + if isinstance(other, basestring): + other = self._literalStringClass(other) + if not isinstance(other, ParserElement): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each([self, other]) + + def __rand__(self, other): + """ + Implementation of & operator when left operand is not a :class:`ParserElement` + """ + if isinstance(other, basestring): + other = self._literalStringClass(other) + if not isinstance(other, ParserElement): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__(self): + """ + Implementation of ~ operator - returns :class:`NotAny` + """ + return NotAny(self) + + def __iter__(self): + # must implement __iter__ to override legacy use of sequential access to __getitem__ to + # iterate over a sequence + raise TypeError('%r object is not iterable' % self.__class__.__name__) + + def __getitem__(self, key): + """ + use ``[]`` indexing notation as a short form for expression repetition: + - ``expr[n]`` is equivalent to ``expr*n`` + - ``expr[m, n]`` is equivalent to ``expr*(m, n)`` + - ``expr[n, ...]`` or ``expr[n,]`` is equivalent + to ``expr*n + ZeroOrMore(expr)`` + (read as "at least n instances of ``expr``") + - ``expr[..., n]`` is equivalent to ``expr*(0, n)`` + (read as "0 to n instances of ``expr``") + - ``expr[...]`` and ``expr[0, ...]`` are equivalent to ``ZeroOrMore(expr)`` + - ``expr[1, ...]`` is equivalent to ``OneOrMore(expr)`` + ``None`` may be used in place of ``...``. + + Note that ``expr[..., n]`` and ``expr[m, n]``do not raise an exception + if more than ``n`` ``expr``s exist in the input stream. If this behavior is + desired, then write ``expr[..., n] + ~expr``. + """ + + # convert single arg keys to tuples + try: + if isinstance(key, str): + key = (key,) + iter(key) + except TypeError: + key = (key, key) + + if len(key) > 2: + warnings.warn("only 1 or 2 index arguments supported ({0}{1})".format(key[:5], + '... [{0}]'.format(len(key)) + if len(key) > 5 else '')) + + # clip to 2 elements + ret = self * tuple(key[:2]) + return ret + + def __call__(self, name=None): + """ + Shortcut for :class:`setResultsName`, with ``listAllMatches=False``. + + If ``name`` is given with a trailing ``'*'`` character, then ``listAllMatches`` will be + passed as ``True``. + + If ``name` is omitted, same as calling :class:`copy`. + + Example:: + + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums + "-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums + "-")("socsecno") + """ + if name is not None: + return self._setResultsName(name) + else: + return self.copy() + + def suppress(self): + """ + Suppresses the output of this :class:`ParserElement`; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress(self) + + def leaveWhitespace(self): + """ + Disables the skipping of whitespace before matching the characters in the + :class:`ParserElement`'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars(self, chars): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs(self): + """ + Overrides default behavior to expand ``<TAB>``s to spaces before parsing the input string. + Must be called before ``parseString`` when the input grammar contains elements that + match ``<TAB>`` characters. + """ + self.keepTabs = True + return self + + def ignore(self, other): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance(other, Suppress): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append(Suppress(other.copy())) + return self + + def setDebugActions(self, startAction, successAction, exceptionAction): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug(self, flag=True): + """ + Enable display of debugging messages while doing pattern matching. + Set ``flag`` to True to enable, False to disable. + + Example:: + + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using :class:`setDebugActions`. Prior to attempting + to match the ``wd`` expression, the debugging message ``"Match <exprname> at loc <n>(<line>,<col>)"`` + is shown. Then if the parse succeeds, a ``"Matched"`` message is shown, or an ``"Exception raised"`` + message is shown. Also note the use of :class:`setName` to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the :class:`Word` expression without calling ``setName`` is ``"W:(ABCD...)"``. + """ + if flag: + self.setDebugActions(_defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction) + else: + self.debug = False + return self + + def __str__(self): + return self.name + + def __repr__(self): + return _ustr(self) + + def streamline(self): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion(self, parseElementList): + pass + + def validate(self, validateTrace=None): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion([]) + + def parseFile(self, file_or_filename, parseAll=False): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clearing out pyparsing internal stack trace + if getattr(exc, '__traceback__', None) is not None: + exc.__traceback__ = self._trim_traceback(exc.__traceback__) + raise exc + + def __eq__(self, other): + if self is other: + return True + elif isinstance(other, basestring): + return self.matches(other) + elif isinstance(other, ParserElement): + return vars(self) == vars(other) + return False + + def __ne__(self, other): + return not (self == other) + + def __hash__(self): + return id(self) + + def __req__(self, other): + return self == other + + def __rne__(self, other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests + + Example:: + + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', + fullDump=True, printResults=True, failureTests=False, postParse=None, + file=None): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests + - comment - (default= ``'#'``) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default= ``True``) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default= ``True``) prints test output to stdout + - failureTests - (default= ``False``) indicates if these tests are expected to fail parsing + - postParse - (default= ``None``) optional callback for successful parse results; called as + `fn(test_string, parse_results)` and returns a string to be added to the test output + - file - (default=``None``) optional file-like object to which test output will be written; + if None, will default to ``sys.stdout`` + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if ``failureTests`` is True), and the results contain a list of lines of each + test's output + + Example:: + + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + + prints:: + + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + if file is None: + file = sys.stdout + print_ = file.write + + allResults = [] + comments = [] + success = True + NL = Literal(r'\n').addParseAction(replaceWith('\n')).ignore(quotedString) + BOM = u'\ufeff' + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n' + '\n'.join(comments) if comments else '', t] + comments = [] + try: + # convert newline marks to actual newlines, and strip leading BOM if present + t = NL.transformString(t.lstrip(BOM)) + result = self.parseString(t, parseAll=parseAll) + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' ' * (col(pe.loc, t) - 1) + '^' + fatal) + else: + out.append(' ' * pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + else: + success = success and not failureTests + if postParse is not None: + try: + pp_value = postParse(t, result) + if pp_value is not None: + if isinstance(pp_value, ParseResults): + out.append(pp_value.dump()) + else: + out.append(str(pp_value)) + else: + out.append(result.dump()) + except Exception as e: + out.append(result.dump(full=fullDump)) + out.append("{0} failed: {1}: {2}".format(postParse.__name__, type(e).__name__, e)) + else: + out.append(result.dump(full=fullDump)) + + if printResults: + if fullDump: + out.append('') + print_('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class _PendingSkip(ParserElement): + # internal placeholder class to hold a place were '...' is added to a parser element, + # once another ParserElement is added, this placeholder will be replaced with a SkipTo + def __init__(self, expr, must_skip=False): + super(_PendingSkip, self).__init__() + self.strRepr = str(expr + Empty()).replace('Empty', '...') + self.name = self.strRepr + self.anchor = expr + self.must_skip = must_skip + + def __add__(self, other): + skipper = SkipTo(other).setName("...")("_skipped*") + if self.must_skip: + def must_skip(t): + if not t._skipped or t._skipped.asList() == ['']: + del t[0] + t.pop("_skipped", None) + def show_skip(t): + if t._skipped.asList()[-1:] == ['']: + skipped = t.pop('_skipped') + t['_skipped'] = 'missing <' + repr(self.anchor) + '>' + return (self.anchor + skipper().addParseAction(must_skip) + | skipper().addParseAction(show_skip)) + other + + return self.anchor + skipper + other + + def __repr__(self): + return self.strRepr + + def parseImpl(self, *args): + raise Exception("use of `...` expression without following SkipTo target expression") + + +class Token(ParserElement): + """Abstract :class:`ParserElement` subclass, for defining atomic + matching patterns. + """ + def __init__(self): + super(Token, self).__init__(savelist=False) + + +class Empty(Token): + """An empty token, will always match. + """ + def __init__(self): + super(Empty, self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """A token that will never match. + """ + def __init__(self): + super(NoMatch, self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl(self, instring, loc, doActions=True): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """Token to exactly match a specified string. + + Example:: + + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use :class:`CaselessLiteral`. + + For keyword matching (force word break before and after the matched string), + use :class:`Keyword` or :class:`CaselessKeyword`. + """ + def __init__(self, matchString): + super(Literal, self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: modify __class__ to select + # a parseImpl optimized for single-character check + if self.matchLen == 1 and type(self) is Literal: + self.__class__ = _SingleCharLiteral + + def parseImpl(self, instring, loc, doActions=True): + if instring[loc] == self.firstMatchChar and instring.startswith(self.match, loc): + return loc + self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + +class _SingleCharLiteral(Literal): + def parseImpl(self, instring, loc, doActions=True): + if instring[loc] == self.firstMatchChar: + return loc + 1, self.match + raise ParseException(instring, loc, self.errmsg, self) + +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """Token to exactly match a specified string as a keyword, that is, + it must be immediately followed by a non-keyword character. Compare + with :class:`Literal`: + + - ``Literal("if")`` will match the leading ``'if'`` in + ``'ifAndOnlyIf'``. + - ``Keyword("if")`` will not; it will only match the leading + ``'if'`` in ``'if x=1'``, or ``'if(y==2)'`` + + Accepts two optional constructor arguments in addition to the + keyword string: + + - ``identChars`` is a string of characters that would be valid + identifier characters, defaulting to all alphanumerics + "_" and + "$" + - ``caseless`` allows case-insensitive matching, default is ``False``. + + Example:: + + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use :class:`CaselessKeyword`. + """ + DEFAULT_KEYWORD_CHARS = alphanums + "_$" + + def __init__(self, matchString, identChars=None, caseless=False): + super(Keyword, self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl(self, instring, loc, doActions=True): + if self.caseless: + if ((instring[loc:loc + self.matchLen].upper() == self.caselessmatch) + and (loc >= len(instring) - self.matchLen + or instring[loc + self.matchLen].upper() not in self.identChars) + and (loc == 0 + or instring[loc - 1].upper() not in self.identChars)): + return loc + self.matchLen, self.match + + else: + if instring[loc] == self.firstMatchChar: + if ((self.matchLen == 1 or instring.startswith(self.match, loc)) + and (loc >= len(instring) - self.matchLen + or instring[loc + self.matchLen] not in self.identChars) + and (loc == 0 or instring[loc - 1] not in self.identChars)): + return loc + self.matchLen, self.match + + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword, self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars(chars): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for :class:`CaselessKeyword`.) + """ + def __init__(self, matchString): + super(CaselessLiteral, self).__init__(matchString.upper()) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl(self, instring, loc, doActions=True): + if instring[loc:loc + self.matchLen].upper() == self.match: + return loc + self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of :class:`Keyword`. + + Example:: + + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for :class:`CaselessLiteral`.) + """ + def __init__(self, matchString, identChars=None): + super(CaselessKeyword, self).__init__(matchString, identChars, caseless=True) + +class CloseMatch(Token): + """A variation on :class:`Literal` which matches "close" matches, + that is, strings with at most 'n' mismatching characters. + :class:`CloseMatch` takes parameters: + + - ``match_string`` - string to be matched + - ``maxMismatches`` - (``default=1``) maximum number of + mismatches allowed to count as a match + + The results from a successful parse will contain the matched text + from the input string and the following named results: + + - ``mismatches`` - a list of the positions within the + match_string where mismatches were found + - ``original`` - the original match_string used to compare + against the input string + + If ``mismatches`` is an empty list, then the match was an exact + match. + + Example:: + + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch, self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl(self, instring, loc, doActions=True): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc, s_m in enumerate(zip(instring[loc:maxloc], match_string)): + src, mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, an + optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for ``min`` is + 1 (a minimum value < 1 is not valid); the default values for + ``max`` and ``exact`` are 0, meaning no maximum or exact + length restriction. An optional ``excludeChars`` parameter can + list characters that might be found in the input ``bodyChars`` + string; useful to define a word of all printables except for one or + two characters, for instance. + + :class:`srange` is useful for defining custom character set strings + for defining ``Word`` expressions, using range notation from + regular expression character sets. + + A common mistake is to use :class:`Word` to match a specific literal + string, as in ``Word("Address")``. Remember that :class:`Word` + uses the string argument to define *sets* of matchable characters. + This expression would match "Add", "AAA", "dAred", or any other word + made up of the characters 'A', 'd', 'r', 'e', and 's'. To match an + exact literal string, use :class:`Literal` or :class:`Keyword`. + + pyparsing includes helper strings for building Words: + + - :class:`alphas` + - :class:`nums` + - :class:`alphanums` + - :class:`hexnums` + - :class:`alphas8bit` (alphabetic characters in ASCII range 128-255 + - accented, tilded, umlauted, etc.) + - :class:`punc8bit` (non-alphabetic characters in ASCII range + 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - :class:`printables` (any non-whitespace character) + + Example:: + + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums + '-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__(self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None): + super(Word, self).__init__() + if excludeChars: + excludeChars = set(excludeChars) + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars: + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig + self.bodyCharsOrig and (min == 1 and max == 0 and exact == 0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b" + self.reString + r"\b" + + try: + self.re = re.compile(self.reString) + except Exception: + self.re = None + else: + self.re_match = self.re.match + self.__class__ = _WordRegex + + def parseImpl(self, instring, loc, doActions=True): + if instring[loc] not in self.initChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min(maxloc, instrlen) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + elif self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + elif self.asKeyword: + if (start > 0 and instring[start - 1] in bodychars + or loc < instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__(self): + try: + return super(Word, self).__str__() + except Exception: + pass + + if self.strRepr is None: + + def charsAsStr(s): + if len(s) > 4: + return s[:4] + "..." + else: + return s + + if self.initCharsOrig != self.bodyCharsOrig: + self.strRepr = "W:(%s, %s)" % (charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig)) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + +class _WordRegex(Word): + def parseImpl(self, instring, loc, doActions=True): + result = self.re_match(instring, loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + +class Char(_WordRegex): + """A short-cut class for defining ``Word(characters, exact=1)``, + when defining a match of any single character in a string of + characters. + """ + def __init__(self, charset, asKeyword=False, excludeChars=None): + super(Char, self).__init__(charset, exact=1, asKeyword=asKeyword, excludeChars=excludeChars) + self.reString = "[%s]" % _escapeRegexRangeChars(''.join(self.initChars)) + if asKeyword: + self.reString = r"\b%s\b" % self.reString + self.re = re.compile(self.reString) + self.re_match = self.re.match + + +class Regex(Token): + r"""Token for matching strings that match a given regular + expression. Defined with string specifying the regular expression in + a form recognized by the stdlib Python `re module <https://docs.python.org/3/library/re.html>`_. + If the given regex contains named groups (defined using ``(?P<name>...)``), + these will be preserved as named parse results. + + If instead of the Python stdlib re module you wish to use a different RE module + (such as the `regex` module), you can replace it by either building your + Regex object with a compiled RE that was compiled using regex: + + Example:: + + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: https://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + + # use regex module instead of stdlib re module to construct a Regex using + # a compiled regular expression + import regex + parser = pp.Regex(regex.compile(r'[0-9]')) + + """ + def __init__(self, pattern, flags=0, asGroupList=False, asMatch=False): + """The parameters ``pattern`` and ``flags`` are passed + to the ``re.compile()`` function as-is. See the Python + `re module <https://docs.python.org/3/library/re.html>`_ module for an + explanation of the acceptable patterns and flags. + """ + super(Regex, self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif hasattr(pattern, 'pattern') and hasattr(pattern, 'match'): + self.re = pattern + self.pattern = self.reString = pattern.pattern + self.flags = flags + + else: + raise TypeError("Regex may only be constructed with a string or a compiled RE object") + + self.re_match = self.re.match + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = self.re_match("") is not None + self.asGroupList = asGroupList + self.asMatch = asMatch + if self.asGroupList: + self.parseImpl = self.parseImplAsGroupList + if self.asMatch: + self.parseImpl = self.parseImplAsMatch + + def parseImpl(self, instring, loc, doActions=True): + result = self.re_match(instring, loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = ParseResults(result.group()) + d = result.groupdict() + if d: + for k, v in d.items(): + ret[k] = v + return loc, ret + + def parseImplAsGroupList(self, instring, loc, doActions=True): + result = self.re_match(instring, loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.groups() + return loc, ret + + def parseImplAsMatch(self, instring, loc, doActions=True): + result = self.re_match(instring, loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result + return loc, ret + + def __str__(self): + try: + return super(Regex, self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + def sub(self, repl): + r""" + Return Regex with an attached parse action to transform the parsed + result as if called using `re.sub(expr, repl, string) <https://docs.python.org/3/library/re.html#re.sub>`_. + + Example:: + + make_html = Regex(r"(\w+):(.*?):").sub(r"<\1>\2</\1>") + print(make_html.transformString("h1:main title:")) + # prints "<h1>main title</h1>" + """ + if self.asGroupList: + warnings.warn("cannot use sub() with Regex(asGroupList=True)", + SyntaxWarning, stacklevel=2) + raise SyntaxError() + + if self.asMatch and callable(repl): + warnings.warn("cannot use sub() with a callable with Regex(asMatch=True)", + SyntaxWarning, stacklevel=2) + raise SyntaxError() + + if self.asMatch: + def pa(tokens): + return tokens[0].expand(repl) + else: + def pa(tokens): + return self.re.sub(repl, tokens[0]) + return self.addParseAction(pa) + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + + - quoteChar - string of one or more characters defining the + quote delimiting string + - escChar - character to escape quotes, typically backslash + (default= ``None``) + - escQuote - special quote sequence to escape an embedded quote + string (such as SQL's ``""`` to escape an embedded ``"``) + (default= ``None``) + - multiline - boolean indicating whether quotes can span + multiple lines (default= ``False``) + - unquoteResults - boolean indicating whether the matched text + should be unquoted (default= ``True``) + - endQuoteChar - string of one or more characters defining the + end of the quote delimited string (default= ``None`` => same as + quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace + (``'\t'``, ``'\n'``, etc.) to actual whitespace + (default= ``True``) + + Example:: + + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + + prints:: + + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__(self, quoteChar, escChar=None, escQuote=None, multiline=False, + unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString, self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string", SyntaxWarning, stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string", SyntaxWarning, stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % (re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '')) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % (re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '')) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar) - 1, 0, -1)) + ')') + + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar) + "(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + self.re_match = self.re.match + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl(self, instring, loc, doActions=True): + result = instring[loc] == self.firstQuoteChar and self.re_match(instring, loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen: -self.endQuoteCharLen] + + if isinstance(ret, basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t': '\t', + r'\n': '\n', + r'\f': '\f', + r'\r': '\r', + } + for wslit, wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__(self): + try: + return super(QuotedString, self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """Token for matching words composed of characters *not* in a given + set (will include whitespace in matched characters if not listed in + the provided exclusion set - see example). Defined with string + containing all disallowed characters, and an optional minimum, + maximum, and/or exact length. The default value for ``min`` is + 1 (a minimum value < 1 is not valid); the default values for + ``max`` and ``exact`` are 0, meaning no maximum or exact + length restriction. + + Example:: + + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + + prints:: + + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__(self, notChars, min=1, max=0, exact=0): + super(CharsNotIn, self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use " + "Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = (self.minLen == 0) + self.mayIndexError = False + + def parseImpl(self, instring, loc, doActions=True): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min(start + self.maxLen, len(instring)) + while loc < maxlen and instring[loc] not in notchars: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__(self): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """Special matching class for matching whitespace. Normally, + whitespace is ignored by pyparsing grammars. This class is included + when some whitespace structures are significant. Define with + a string containing the whitespace characters to be matched; default + is ``" \\t\\r\\n"``. Also takes optional ``min``, + ``max``, and ``exact`` arguments, as defined for the + :class:`Word` class. + """ + whiteStrs = { + ' ' : '<SP>', + '\t': '<TAB>', + '\n': '<LF>', + '\r': '<CR>', + '\f': '<FF>', + u'\u00A0': '<NBSP>', + u'\u1680': '<OGHAM_SPACE_MARK>', + u'\u180E': '<MONGOLIAN_VOWEL_SEPARATOR>', + u'\u2000': '<EN_QUAD>', + u'\u2001': '<EM_QUAD>', + u'\u2002': '<EN_SPACE>', + u'\u2003': '<EM_SPACE>', + u'\u2004': '<THREE-PER-EM_SPACE>', + u'\u2005': '<FOUR-PER-EM_SPACE>', + u'\u2006': '<SIX-PER-EM_SPACE>', + u'\u2007': '<FIGURE_SPACE>', + u'\u2008': '<PUNCTUATION_SPACE>', + u'\u2009': '<THIN_SPACE>', + u'\u200A': '<HAIR_SPACE>', + u'\u200B': '<ZERO_WIDTH_SPACE>', + u'\u202F': '<NNBSP>', + u'\u205F': '<MMSP>', + u'\u3000': '<IDEOGRAPHIC_SPACE>', + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White, self).__init__() + self.matchWhite = ws + self.setWhitespaceChars("".join(c for c in self.whiteChars if c not in self.matchWhite)) + # ~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl(self, instring, loc, doActions=True): + if instring[loc] not in self.matchWhite: + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min(maxloc, len(instring)) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__(self): + super(_PositionToken, self).__init__() + self.name = self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """Token to advance to a specific column of input text; useful for + tabular report scraping. + """ + def __init__(self, colno): + super(GoToColumn, self).__init__() + self.col = colno + + def preParse(self, instring, loc): + if col(loc, instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables(instring, loc) + while loc < instrlen and instring[loc].isspace() and col(loc, instring) != self.col: + loc += 1 + return loc + + def parseImpl(self, instring, loc, doActions=True): + thiscol = col(loc, instring) + if thiscol > self.col: + raise ParseException(instring, loc, "Text not in expected column", self) + newloc = loc + self.col - thiscol + ret = instring[loc: newloc] + return newloc, ret + + +class LineStart(_PositionToken): + r"""Matches if current position is at the beginning of a line within + the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + prints:: + + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__(self): + super(LineStart, self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl(self, instring, loc, doActions=True): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """Matches if current position is at the end of a line within the + parse string + """ + def __init__(self): + super(LineEnd, self).__init__() + self.setWhitespaceChars(ParserElement.DEFAULT_WHITE_CHARS.replace("\n", "")) + self.errmsg = "Expected end of line" + + def parseImpl(self, instring, loc, doActions=True): + if loc < len(instring): + if instring[loc] == "\n": + return loc + 1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc + 1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """Matches if current position is at the beginning of the parse + string + """ + def __init__(self): + super(StringStart, self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl(self, instring, loc, doActions=True): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse(instring, 0): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """Matches if current position is at the end of the parse string + """ + def __init__(self): + super(StringEnd, self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl(self, instring, loc, doActions=True): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc + 1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """Matches if the current position is at the beginning of a Word, + and is not preceded by any character in a given set of + ``wordChars`` (default= ``printables``). To emulate the + ``\b`` behavior of regular expressions, use + ``WordStart(alphanums)``. ``WordStart`` will also match at + the beginning of the string being parsed, or at the beginning of + a line. + """ + def __init__(self, wordChars=printables): + super(WordStart, self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True): + if loc != 0: + if (instring[loc - 1] in self.wordChars + or instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """Matches if the current position is at the end of a Word, and is + not followed by any character in a given set of ``wordChars`` + (default= ``printables``). To emulate the ``\b`` behavior of + regular expressions, use ``WordEnd(alphanums)``. ``WordEnd`` + will also match at the end of the string being parsed, or at the end + of a line. + """ + def __init__(self, wordChars=printables): + super(WordEnd, self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True): + instrlen = len(instring) + if instrlen > 0 and loc < instrlen: + if (instring[loc] in self.wordChars or + instring[loc - 1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """Abstract subclass of ParserElement, for combining and + post-processing parsed tokens. + """ + def __init__(self, exprs, savelist=False): + super(ParseExpression, self).__init__(savelist) + if isinstance(exprs, _generatorType): + exprs = list(exprs) + + if isinstance(exprs, basestring): + self.exprs = [self._literalStringClass(exprs)] + elif isinstance(exprs, ParserElement): + self.exprs = [exprs] + elif isinstance(exprs, Iterable): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if any(isinstance(expr, basestring) for expr in exprs): + exprs = (self._literalStringClass(e) if isinstance(e, basestring) else e for e in exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list(exprs) + except TypeError: + self.exprs = [exprs] + self.callPreparse = False + + def append(self, other): + self.exprs.append(other) + self.strRepr = None + return self + + def leaveWhitespace(self): + """Extends ``leaveWhitespace`` defined in base class, and also invokes ``leaveWhitespace`` on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [e.copy() for e in self.exprs] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore(self, other): + if isinstance(other, Suppress): + if other not in self.ignoreExprs: + super(ParseExpression, self).ignore(other) + for e in self.exprs: + e.ignore(self.ignoreExprs[-1]) + else: + super(ParseExpression, self).ignore(other) + for e in self.exprs: + e.ignore(self.ignoreExprs[-1]) + return self + + def __str__(self): + try: + return super(ParseExpression, self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % (self.__class__.__name__, _ustr(self.exprs)) + return self.strRepr + + def streamline(self): + super(ParseExpression, self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And(And(And(a, b), c), d) to And(a, b, c, d) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if len(self.exprs) == 2: + other = self.exprs[0] + if (isinstance(other, self.__class__) + and not other.parseAction + and other.resultsName is None + and not other.debug): + self.exprs = other.exprs[:] + [self.exprs[1]] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if (isinstance(other, self.__class__) + and not other.parseAction + and other.resultsName is None + and not other.debug): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def validate(self, validateTrace=None): + tmp = (validateTrace if validateTrace is not None else [])[:] + [self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion([]) + + def copy(self): + ret = super(ParseExpression, self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + + def _setResultsName(self, name, listAllMatches=False): + if __diag__.warn_ungrouped_named_tokens_in_collection: + for e in self.exprs: + if isinstance(e, ParserElement) and e.resultsName: + warnings.warn("{0}: setting results name {1!r} on {2} expression " + "collides with {3!r} on contained expression".format("warn_ungrouped_named_tokens_in_collection", + name, + type(self).__name__, + e.resultsName), + stacklevel=3) + + return super(ParseExpression, self)._setResultsName(name, listAllMatches) + + +class And(ParseExpression): + """ + Requires all given :class:`ParseExpression` s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the ``'+'`` operator. + May also be constructed using the ``'-'`` operator, which will + suppress backtracking. + + Example:: + + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"), name_expr("name"), integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop, self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__(self, exprs, savelist=True): + exprs = list(exprs) + if exprs and Ellipsis in exprs: + tmp = [] + for i, expr in enumerate(exprs): + if expr is Ellipsis: + if i < len(exprs) - 1: + skipto_arg = (Empty() + exprs[i + 1]).exprs[-1] + tmp.append(SkipTo(skipto_arg)("_skipped*")) + else: + raise Exception("cannot construct And with sequence ending in ...") + else: + tmp.append(expr) + exprs[:] = tmp + super(And, self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars(self.exprs[0].whiteChars) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def streamline(self): + # collapse any _PendingSkip's + if self.exprs: + if any(isinstance(e, ParseExpression) and e.exprs and isinstance(e.exprs[-1], _PendingSkip) + for e in self.exprs[:-1]): + for i, e in enumerate(self.exprs[:-1]): + if e is None: + continue + if (isinstance(e, ParseExpression) + and e.exprs and isinstance(e.exprs[-1], _PendingSkip)): + e.exprs[-1] = e.exprs[-1] + self.exprs[i + 1] + self.exprs[i + 1] = None + self.exprs = [e for e in self.exprs if e is not None] + + super(And, self).streamline() + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + return self + + def parseImpl(self, instring, loc, doActions=True): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse(instring, loc, doActions, callPreParse=False) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse(instring, loc, doActions) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse(instring, loc, doActions) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other): + if isinstance(other, basestring): + other = self._literalStringClass(other) + return self.append(other) # And([self, other]) + + def checkRecursion(self, parseElementList): + subRecCheckList = parseElementList[:] + [self] + for e in self.exprs: + e.checkRecursion(subRecCheckList) + if not e.mayReturnEmpty: + break + + def __str__(self): + if hasattr(self, "name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """Requires that at least one :class:`ParseExpression` is found. If + two expressions match, the expression that matches the longest + string will be used. May be constructed using the ``'^'`` + operator. + + Example:: + + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + + prints:: + + [['123'], ['3.1416'], ['789']] + """ + def __init__(self, exprs, savelist=False): + super(Or, self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def streamline(self): + super(Or, self).streamline() + if __compat__.collect_all_And_tokens: + self.saveAsList = any(e.saveAsList for e in self.exprs) + return self + + def parseImpl(self, instring, loc, doActions=True): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse(instring, loc) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring, len(instring), e.errmsg, self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + # re-evaluate all matches in descending order of length of match, in case attached actions + # might change whether or how much they match of the input. + matches.sort(key=itemgetter(0), reverse=True) + + if not doActions: + # no further conditions or parse actions to change the selection of + # alternative, so the first match will be the best match + best_expr = matches[0][1] + return best_expr._parse(instring, loc, doActions) + + longest = -1, None + for loc1, expr1 in matches: + if loc1 <= longest[0]: + # already have a longer match than this one will deliver, we are done + return longest + + try: + loc2, toks = expr1._parse(instring, loc, doActions) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + else: + if loc2 >= loc1: + return loc2, toks + # didn't match as much as before + elif loc2 > longest[0]: + longest = loc2, toks + + if longest != (-1, None): + return longest + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other): + if isinstance(other, basestring): + other = self._literalStringClass(other) + return self.append(other) # Or([self, other]) + + def __str__(self): + if hasattr(self, "name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion(self, parseElementList): + subRecCheckList = parseElementList[:] + [self] + for e in self.exprs: + e.checkRecursion(subRecCheckList) + + def _setResultsName(self, name, listAllMatches=False): + if (not __compat__.collect_all_And_tokens + and __diag__.warn_multiple_tokens_in_named_alternation): + if any(isinstance(e, And) for e in self.exprs): + warnings.warn("{0}: setting results name {1!r} on {2} expression " + "may only return a single token for an And alternative, " + "in future will return the full list of tokens".format( + "warn_multiple_tokens_in_named_alternation", name, type(self).__name__), + stacklevel=3) + + return super(Or, self)._setResultsName(name, listAllMatches) + + +class MatchFirst(ParseExpression): + """Requires that at least one :class:`ParseExpression` is found. If + two expressions match, the first one listed is the one that will + match. May be constructed using the ``'|'`` operator. + + Example:: + + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__(self, exprs, savelist=False): + super(MatchFirst, self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def streamline(self): + super(MatchFirst, self).streamline() + if __compat__.collect_all_And_tokens: + self.saveAsList = any(e.saveAsList for e in self.exprs) + return self + + def parseImpl(self, instring, loc, doActions=True): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse(instring, loc, doActions) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring, len(instring), e.errmsg, self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other): + if isinstance(other, basestring): + other = self._literalStringClass(other) + return self.append(other) # MatchFirst([self, other]) + + def __str__(self): + if hasattr(self, "name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion(self, parseElementList): + subRecCheckList = parseElementList[:] + [self] + for e in self.exprs: + e.checkRecursion(subRecCheckList) + + def _setResultsName(self, name, listAllMatches=False): + if (not __compat__.collect_all_And_tokens + and __diag__.warn_multiple_tokens_in_named_alternation): + if any(isinstance(e, And) for e in self.exprs): + warnings.warn("{0}: setting results name {1!r} on {2} expression " + "may only return a single token for an And alternative, " + "in future will return the full list of tokens".format( + "warn_multiple_tokens_in_named_alternation", name, type(self).__name__), + stacklevel=3) + + return super(MatchFirst, self)._setResultsName(name, listAllMatches) + + +class Each(ParseExpression): + """Requires all given :class:`ParseExpression` s to be found, but in + any order. Expressions may be separated by whitespace. + + May be constructed using the ``'&'`` operator. + + Example:: + + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + + prints:: + + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__(self, exprs, savelist=True): + super(Each, self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + self.saveAsList = True + + def streamline(self): + super(Each, self).streamline() + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + return self + + def parseImpl(self, instring, loc, doActions=True): + if self.initExprGroups: + self.opt1map = dict((id(e.expr), e) for e in self.exprs if isinstance(e, Optional)) + opt1 = [e.expr for e in self.exprs if isinstance(e, Optional)] + opt2 = [e for e in self.exprs if e.mayReturnEmpty and not isinstance(e, (Optional, Regex))] + self.optionals = opt1 + opt2 + self.multioptionals = [e.expr for e in self.exprs if isinstance(e, ZeroOrMore)] + self.multirequired = [e.expr for e in self.exprs if isinstance(e, OneOrMore)] + self.required = [e for e in self.exprs if not isinstance(e, (Optional, ZeroOrMore, OneOrMore))] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse(instring, tmpLoc) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e), e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring, loc, "Missing one or more required elements (%s)" % missing) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e, Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc, results = e._parse(instring, loc, doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__(self): + if hasattr(self, "name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion(self, parseElementList): + subRecCheckList = parseElementList[:] + [self] + for e in self.exprs: + e.checkRecursion(subRecCheckList) + + +class ParseElementEnhance(ParserElement): + """Abstract subclass of :class:`ParserElement`, for combining and + post-processing parsed tokens. + """ + def __init__(self, expr, savelist=False): + super(ParseElementEnhance, self).__init__(savelist) + if isinstance(expr, basestring): + if issubclass(self._literalStringClass, Token): + expr = self._literalStringClass(expr) + else: + expr = self._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars(expr.whiteChars) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl(self, instring, loc, doActions=True): + if self.expr is not None: + return self.expr._parse(instring, loc, doActions, callPreParse=False) + else: + raise ParseException("", loc, self.errmsg, self) + + def leaveWhitespace(self): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore(self, other): + if isinstance(other, Suppress): + if other not in self.ignoreExprs: + super(ParseElementEnhance, self).ignore(other) + if self.expr is not None: + self.expr.ignore(self.ignoreExprs[-1]) + else: + super(ParseElementEnhance, self).ignore(other) + if self.expr is not None: + self.expr.ignore(self.ignoreExprs[-1]) + return self + + def streamline(self): + super(ParseElementEnhance, self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion(self, parseElementList): + if self in parseElementList: + raise RecursiveGrammarException(parseElementList + [self]) + subRecCheckList = parseElementList[:] + [self] + if self.expr is not None: + self.expr.checkRecursion(subRecCheckList) + + def validate(self, validateTrace=None): + if validateTrace is None: + validateTrace = [] + tmp = validateTrace[:] + [self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__(self): + try: + return super(ParseElementEnhance, self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % (self.__class__.__name__, _ustr(self.expr)) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """Lookahead matching of the given parse expression. + ``FollowedBy`` does *not* advance the parsing position within + the input string, it only verifies that the specified parse + expression matches at the current position. ``FollowedBy`` + always returns a null token list. If any results names are defined + in the lookahead expression, those *will* be returned for access by + name. + + Example:: + + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + + prints:: + + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__(self, expr): + super(FollowedBy, self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl(self, instring, loc, doActions=True): + # by using self._expr.parse and deleting the contents of the returned ParseResults list + # we keep any named results that were defined in the FollowedBy expression + _, ret = self.expr._parse(instring, loc, doActions=doActions) + del ret[:] + + return loc, ret + + +class PrecededBy(ParseElementEnhance): + """Lookbehind matching of the given parse expression. + ``PrecededBy`` does not advance the parsing position within the + input string, it only verifies that the specified parse expression + matches prior to the current position. ``PrecededBy`` always + returns a null token list, but if a results name is defined on the + given expression, it is returned. + + Parameters: + + - expr - expression that must match prior to the current parse + location + - retreat - (default= ``None``) - (int) maximum number of characters + to lookbehind prior to the current parse location + + If the lookbehind expression is a string, Literal, Keyword, or + a Word or CharsNotIn with a specified exact or maximum length, then + the retreat parameter is not required. Otherwise, retreat must be + specified to give a maximum number of characters to look back from + the current parse position for a lookbehind match. + + Example:: + + # VB-style variable names with type prefixes + int_var = PrecededBy("#") + pyparsing_common.identifier + str_var = PrecededBy("$") + pyparsing_common.identifier + + """ + def __init__(self, expr, retreat=None): + super(PrecededBy, self).__init__(expr) + self.expr = self.expr().leaveWhitespace() + self.mayReturnEmpty = True + self.mayIndexError = False + self.exact = False + if isinstance(expr, str): + retreat = len(expr) + self.exact = True + elif isinstance(expr, (Literal, Keyword)): + retreat = expr.matchLen + self.exact = True + elif isinstance(expr, (Word, CharsNotIn)) and expr.maxLen != _MAX_INT: + retreat = expr.maxLen + self.exact = True + elif isinstance(expr, _PositionToken): + retreat = 0 + self.exact = True + self.retreat = retreat + self.errmsg = "not preceded by " + str(expr) + self.skipWhitespace = False + self.parseAction.append(lambda s, l, t: t.__delitem__(slice(None, None))) + + def parseImpl(self, instring, loc=0, doActions=True): + if self.exact: + if loc < self.retreat: + raise ParseException(instring, loc, self.errmsg) + start = loc - self.retreat + _, ret = self.expr._parse(instring, start) + else: + # retreat specified a maximum lookbehind window, iterate + test_expr = self.expr + StringEnd() + instring_slice = instring[max(0, loc - self.retreat):loc] + last_expr = ParseException(instring, loc, self.errmsg) + for offset in range(1, min(loc, self.retreat + 1)+1): + try: + # print('trying', offset, instring_slice, repr(instring_slice[loc - offset:])) + _, ret = test_expr._parse(instring_slice, len(instring_slice) - offset) + except ParseBaseException as pbe: + last_expr = pbe + else: + break + else: + raise last_expr + return loc, ret + + +class NotAny(ParseElementEnhance): + """Lookahead to disallow matching with the given parse expression. + ``NotAny`` does *not* advance the parsing position within the + input string, it only verifies that the specified parse expression + does *not* match at the current position. Also, ``NotAny`` does + *not* skip over leading whitespace. ``NotAny`` always returns + a null token list. May be constructed using the '~' operator. + + Example:: + + AND, OR, NOT = map(CaselessKeyword, "AND OR NOT".split()) + + # take care not to mistake keywords for identifiers + ident = ~(AND | OR | NOT) + Word(alphas) + boolean_term = Optional(NOT) + ident + + # very crude boolean expression - to support parenthesis groups and + # operation hierarchy, use infixNotation + boolean_expr = boolean_term + ZeroOrMore((AND | OR) + boolean_term) + + # integers that are followed by "." are actually floats + integer = Word(nums) + ~Char(".") + """ + def __init__(self, expr): + super(NotAny, self).__init__(expr) + # ~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, " + _ustr(self.expr) + + def parseImpl(self, instring, loc, doActions=True): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__(self): + if hasattr(self, "name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__(self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = self._literalStringClass(ender) + self.stopOn(ender) + + def stopOn(self, ender): + if isinstance(ender, basestring): + ender = self._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + return self + + def parseImpl(self, instring, loc, doActions=True): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse(instring, loc, doActions, callPreParse=False) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables(instring, loc) + else: + preloc = loc + loc, tmptokens = self_expr_parse(instring, preloc, doActions) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException, IndexError): + pass + + return loc, tokens + + def _setResultsName(self, name, listAllMatches=False): + if __diag__.warn_ungrouped_named_tokens_in_collection: + for e in [self.expr] + getattr(self.expr, 'exprs', []): + if isinstance(e, ParserElement) and e.resultsName: + warnings.warn("{0}: setting results name {1!r} on {2} expression " + "collides with {3!r} on contained expression".format("warn_ungrouped_named_tokens_in_collection", + name, + type(self).__name__, + e.resultsName), + stacklevel=3) + + return super(_MultipleMatch, self)._setResultsName(name, listAllMatches) + + +class OneOrMore(_MultipleMatch): + """Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default= ``None``) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__(self): + if hasattr(self, "name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default= ``None``) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to :class:`OneOrMore` + """ + def __init__(self, expr, stopOn=None): + super(ZeroOrMore, self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl(self, instring, loc, doActions=True): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException, IndexError): + return loc, [] + + def __str__(self): + if hasattr(self, "name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +class Optional(ParseElementEnhance): + """Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + + prints:: + + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + __optionalNotMatched = _NullToken() + + def __init__(self, expr, default=__optionalNotMatched): + super(Optional, self).__init__(expr, savelist=False) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl(self, instring, loc, doActions=True): + try: + loc, tokens = self.expr._parse(instring, loc, doActions, callPreParse=False) + except (ParseException, IndexError): + if self.defaultValue is not self.__optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([self.defaultValue]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [self.defaultValue] + else: + tokens = [] + return loc, tokens + + def __str__(self): + if hasattr(self, "name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """Token for skipping over all undefined text until the matched + expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default= ``False``) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default= ``None``) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default= ``None``) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + + prints:: + + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__(self, other, include=False, ignore=None, failOn=None): + super(SkipTo, self).__init__(other) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.saveAsList = False + if isinstance(failOn, basestring): + self.failOn = self._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for " + _ustr(self.expr) + + def parseImpl(self, instring, loc, doActions=True): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring, loc, doActions, callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the ``Forward`` + variable using the '<<' operator. + + Note: take care when assigning to ``Forward`` not to overlook + precedence of operators. + + Specifically, '|' has a lower precedence than '<<', so that:: + + fwdExpr << a | b | c + + will actually be evaluated as:: + + (fwdExpr << a) | b | c + + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the ``Forward``:: + + fwdExpr << (a | b | c) + + Converting to use the '<<=' operator instead will avoid this problem. + + See :class:`ParseResults.pprint` for an example of a recursive + parser created using ``Forward``. + """ + def __init__(self, other=None): + super(Forward, self).__init__(other, savelist=False) + + def __lshift__(self, other): + if isinstance(other, basestring): + other = self._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars(self.expr.whiteChars) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace(self): + self.skipWhitespace = False + return self + + def streamline(self): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate(self, validateTrace=None): + if validateTrace is None: + validateTrace = [] + + if self not in validateTrace: + tmp = validateTrace[:] + [self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__(self): + if hasattr(self, "name"): + return self.name + if self.strRepr is not None: + return self.strRepr + + # Avoid infinite recursion by setting a temporary strRepr + self.strRepr = ": ..." + + # Use the string representation of main expression. + retString = '...' + try: + if self.expr is not None: + retString = _ustr(self.expr)[:1000] + else: + retString = "None" + finally: + self.strRepr = self.__class__.__name__ + ": " + retString + return self.strRepr + + def copy(self): + if self.expr is not None: + return super(Forward, self).copy() + else: + ret = Forward() + ret <<= self + return ret + + def _setResultsName(self, name, listAllMatches=False): + if __diag__.warn_name_set_on_empty_Forward: + if self.expr is None: + warnings.warn("{0}: setting results name {0!r} on {1} expression " + "that has no contained expression".format("warn_name_set_on_empty_Forward", + name, + type(self).__name__), + stacklevel=3) + + return super(Forward, self)._setResultsName(name, listAllMatches) + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of :class:`ParseExpression`, for converting parsed results. + """ + def __init__(self, expr, savelist=False): + super(TokenConverter, self).__init__(expr) # , savelist) + self.saveAsList = False + +class Combine(TokenConverter): + """Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the + input string; this can be disabled by specifying + ``'adjacent=False'`` in the constructor. + + Example:: + + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__(self, expr, joinString="", adjacent=True): + super(Combine, self).__init__(expr) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore(self, other): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super(Combine, self).ignore(other) + return self + + def postParse(self, instring, loc, tokenlist): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults(["".join(tokenlist._asStringList(self.joinString))], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [retToks] + else: + return retToks + +class Group(TokenConverter): + """Converter to return the matched tokens as a list - useful for + returning tokens of :class:`ZeroOrMore` and :class:`OneOrMore` expressions. + + Example:: + + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a, b, 100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a, b, 100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__(self, expr): + super(Group, self).__init__(expr) + self.saveAsList = True + + def postParse(self, instring, loc, tokenlist): + return [tokenlist] + +class Dict(TokenConverter): + """Converter to return a repetitive expression as a list, but also + as a dictionary. Each element can also be referenced using the first + token in the expression as its key. Useful for tabular report + scraping when the first column can be used as a item key. + + Example:: + + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + + prints:: + + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + + See more examples at :class:`ParseResults` of accessing fields by results name. + """ + def __init__(self, expr): + super(Dict, self).__init__(expr) + self.saveAsList = True + + def postParse(self, instring, loc, tokenlist): + for i, tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey, int): + ikey = _ustr(tok[0]).strip() + if len(tok) == 1: + tokenlist[ikey] = _ParseResultsWithOffset("", i) + elif len(tok) == 2 and not isinstance(tok[1], ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1], i) + else: + dictvalue = tok.copy() # ParseResults(i) + del dictvalue[0] + if len(dictvalue) != 1 or (isinstance(dictvalue, ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue, i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0], i) + + if self.resultsName: + return [tokenlist] + else: + return tokenlist + + +class Suppress(TokenConverter): + """Converter for ignoring the results of a parsed expression. + + Example:: + + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + + prints:: + + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + + (See also :class:`delimitedList`.) + """ + def postParse(self, instring, loc, tokenlist): + return [] + + def suppress(self): + return self + + +class OnlyOnce(object): + """Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self, s, l, t): + if not self.called: + results = self.callable(s, l, t) + self.called = True + return results + raise ParseException(s, l, "") + def reset(self): + self.called = False + +def traceParseAction(f): + """Decorator for debugging parse actions. + + When the parse action is called, this decorator will print + ``">> entering method-name(line:<current_source_line>, <parse_location>, <matched_tokens>)"``. + When the parse action completes, the decorator will print + ``"<<"`` followed by the returned value, or any exception that the parse action raised. + + Example:: + + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens)))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + + prints:: + + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s, l, t = paArgs[-3:] + if len(paArgs) > 3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write(">>entering %s(line: '%s', %d, %r)\n" % (thisFunc, line(l, s), l, t)) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write("<<leaving %s (exception: %s)\n" % (thisFunc, exc)) + raise + sys.stderr.write("<<leaving %s (ret: %r)\n" % (thisFunc, ret)) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList(expr, delim=",", combine=False): + """Helper to define a delimited list of expressions - the delimiter + defaults to ','. By default, the list elements and delimiters can + have intervening whitespace, and comments, but this can be + overridden by passing ``combine=True`` in the constructor. If + ``combine`` is set to ``True``, the matching tokens are + returned as a single token string, with the delimiters included; + otherwise, the matching tokens are returned as a list of tokens, + with the delimiters suppressed. + + Example:: + + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr) + " [" + _ustr(delim) + " " + _ustr(expr) + "]..." + if combine: + return Combine(expr + ZeroOrMore(delim + expr)).setName(dlName) + else: + return (expr + ZeroOrMore(Suppress(delim) + expr)).setName(dlName) + +def countedArray(expr, intExpr=None): + """Helper to define a counted list of expressions. + + This helper defines a pattern of the form:: + + integer expr expr expr... + + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the + leading count token is suppressed. + + If ``intExpr`` is specified, it should be a pyparsing expression + that produces an integer value. + + Example:: + + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s, l, t): + n = t[0] + arrayExpr << (n and Group(And([expr] * n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t: int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return (intExpr + arrayExpr).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i, list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks for + a 'repeat' of a previous expression. For example:: + + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + + will match ``"1:1"``, but not ``"1:2"``. Because this + matches a previous literal, will also match the leading + ``"1:1"`` in ``"1:10"``. If this is not desired, use + :class:`matchPreviousExpr`. Do *not* use with packrat parsing + enabled. + """ + rep = Forward() + def copyTokenToRepeater(s, l, t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks for + a 'repeat' of a previous expression. For example:: + + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + + will match ``"1:1"``, but not ``"1:2"``. Because this + matches by expressions, will *not* match the leading ``"1:1"`` + in ``"1:10"``; the expressions are evaluated first, and then + compared, so ``"1"`` is compared with ``"10"``. Do *not* use + with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s, l, t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s, l, t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException('', 0, '') + rep.setParseAction(mustMatchTheseTokens, callDuringTry=True) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + # ~ escape these chars: ^-[] + for c in r"\^-[]": + s = s.replace(c, _bslash + c) + s = s.replace("\n", r"\n") + s = s.replace("\t", r"\t") + return _ustr(s) + +def oneOf(strs, caseless=False, useRegex=True, asKeyword=False): + """Helper to quickly define a set of alternative Literals, and makes + sure to do longest-first testing when there is a conflict, + regardless of the input order, but returns + a :class:`MatchFirst` for best performance. + + Parameters: + + - strs - a string of space-delimited literals, or a collection of + string literals + - caseless - (default= ``False``) - treat all literals as + caseless + - useRegex - (default= ``True``) - as an optimization, will + generate a Regex object; otherwise, will generate + a :class:`MatchFirst` object (if ``caseless=True`` or ``asKeyword=True``, or if + creating a :class:`Regex` raises an exception) + - asKeyword - (default=``False``) - enforce Keyword-style matching on the + generated expressions + + Example:: + + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + + prints:: + + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if isinstance(caseless, basestring): + warnings.warn("More than one string argument passed to oneOf, pass " + "choices as a list or space-delimited string", stacklevel=2) + + if caseless: + isequal = (lambda a, b: a.upper() == b.upper()) + masks = (lambda a, b: b.upper().startswith(a.upper())) + parseElementClass = CaselessKeyword if asKeyword else CaselessLiteral + else: + isequal = (lambda a, b: a == b) + masks = (lambda a, b: b.startswith(a)) + parseElementClass = Keyword if asKeyword else Literal + + symbols = [] + if isinstance(strs, basestring): + symbols = strs.split() + elif isinstance(strs, Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + if not asKeyword: + # if not producing keywords, need to reorder to take care to avoid masking + # longer choices with shorter ones + i = 0 + while i < len(symbols) - 1: + cur = symbols[i] + for j, other in enumerate(symbols[i + 1:]): + if isequal(other, cur): + del symbols[i + j + 1] + break + elif masks(cur, other): + del symbols[i + j + 1] + symbols.insert(i, other) + break + else: + i += 1 + + if not (caseless or asKeyword) and useRegex: + # ~ print (strs, "->", "|".join([_escapeRegexChars(sym) for sym in symbols])) + try: + if len(symbols) == len("".join(symbols)): + return Regex("[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols)).setName(' | '.join(symbols)) + else: + return Regex("|".join(re.escape(sym) for sym in symbols)).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf(key, value): + """Helper to easily and clearly define a dictionary by specifying + the respective patterns for the key and value. Takes care of + defining the :class:`Dict`, :class:`ZeroOrMore`, and + :class:`Group` tokens in the proper order. The key pattern + can include delimiting markers or punctuation, as long as they are + suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the :class:`Dict` results + can include named token fields. + + Example:: + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + + prints:: + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict(OneOrMore(Group(key + value))) + +def originalTextFor(expr, asString=True): + """Helper to return the original, untokenized text for a given + expression. Useful to restore the parsed fields of an HTML start + tag into the raw tag text itself, or to revert separate tokens with + intervening whitespace back to the original matching input text. By + default, returns astring containing the original parsed text. + + If the optional ``asString`` argument is passed as + ``False``, then the return value is + a :class:`ParseResults` containing any results names that + were originally matched, and a single token containing the original + matched text from the input string. So if the expression passed to + :class:`originalTextFor` contains expressions with defined + results names, you must set ``asString`` to ``False`` if you + want to preserve those results name values. + + Example:: + + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b", "i"): + opener, closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + + prints:: + + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s, loc, t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s, l, t: s[t._original_start: t._original_end] + else: + def extractText(s, l, t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """Helper to undo pyparsing's default grouping of And expressions, + even if all but one are non-empty. + """ + return TokenConverter(expr).addParseAction(lambda t: t[0]) + +def locatedExpr(expr): + """Helper to decorate a returned token with its starting and ending + locations in the input string. + + This helper adds the following results names: + + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains ``<TAB>`` characters, you + may want to call :class:`ParserElement.parseWithTabs` + + Example:: + + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + + prints:: + + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s, l, t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word(_bslash, r"\[]-*.$+^?()~ ", exact=2).setParseAction(lambda s, l, t: t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s, l, t: unichr(int(t[0].lstrip(r'\0x'), 16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s, l, t: unichr(int(t[0][1:], 8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) +_charRange = Group(_singleChar + Suppress("-") + _singleChar) +_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group(OneOrMore(_charRange | _singleChar)).setResultsName("body") + "]" + +def srange(s): + r"""Helper to easily define string ranges for use in Word + construction. Borrows syntax from regexp '[]' string range + definitions:: + + srange("[0-9]") -> "0123456789" + srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" + srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" + + The input string must be enclosed in []'s, and the returned string + is the expanded character set joined into a single string. The + values enclosed in the []'s may be: + + - a single character + - an escaped character with a leading backslash (such as ``\-`` + or ``\]``) + - an escaped hex character with a leading ``'\x'`` + (``\x21``, which is a ``'!'`` character) (``\0x##`` + is also supported for backwards compatibility) + - an escaped octal character with a leading ``'\0'`` + (``\041``, which is a ``'!'`` character) + - a range of any of the above, separated by a dash (``'a-z'``, + etc.) + - any combination of the above (``'aeiouy'``, + ``'a-zA-Z0-9_$'``, etc.) + """ + _expanded = lambda p: p if not isinstance(p, ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]), ord(p[1]) + 1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """Helper method for defining parse actions that require matching at + a specific column in the input text. + """ + def verifyCol(strg, locn, toks): + if col(locn, strg) != n: + raise ParseException(strg, locn, "matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """Helper method for common parse actions that simply return + a literal value. Especially useful when used with + :class:`transformString<ParserElement.transformString>` (). + + Example:: + + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s, l, t: [replStr] + +def removeQuotes(s, l, t): + """Helper parse action for removing quotation marks from parsed + quoted strings. + + Example:: + + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """Helper to define a parse action by mapping a function to all + elements of a ParseResults list. If any additional args are passed, + they are forwarded to the given function as additional arguments + after the token, as in + ``hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))``, + which will convert the parsed data to an integer using base 16. + + Example (compare the last to example in :class:`ParserElement.transformString`:: + + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + + prints:: + + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s, l, t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. +Deprecated in favor of :class:`pyparsing_common.upcaseTokens`""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. +Deprecated in favor of :class:`pyparsing_common.downcaseTokens`""" + +def _makeTags(tagStr, xml, + suppress_LT=Suppress("<"), + suppress_GT=Suppress(">")): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr, basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas, alphanums + "_-:") + if xml: + tagAttrValue = dblQuotedString.copy().setParseAction(removeQuotes) + openTag = (suppress_LT + + tagStr("tag") + + Dict(ZeroOrMore(Group(tagAttrName + Suppress("=") + tagAttrValue))) + + Optional("/", default=[False])("empty").setParseAction(lambda s, l, t: t[0] == '/') + + suppress_GT) + else: + tagAttrValue = quotedString.copy().setParseAction(removeQuotes) | Word(printables, excludeChars=">") + openTag = (suppress_LT + + tagStr("tag") + + Dict(ZeroOrMore(Group(tagAttrName.setParseAction(downcaseTokens) + + Optional(Suppress("=") + tagAttrValue)))) + + Optional("/", default=[False])("empty").setParseAction(lambda s, l, t: t[0] == '/') + + suppress_GT) + closeTag = Combine(_L("</") + tagStr + ">", adjacent=False) + + openTag.setName("<%s>" % resname) + # add start<tagname> results name in parse action now that ungrouped names are not reported at two levels + openTag.addParseAction(lambda t: t.__setitem__("start" + "".join(resname.replace(":", " ").title().split()), t.copy())) + closeTag = closeTag("end" + "".join(resname.replace(":", " ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + openTag.tag_body = SkipTo(closeTag()) + return openTag, closeTag + +def makeHTMLTags(tagStr): + """Helper to construct opening and closing tag expressions for HTML, + given a tag name. Matches tags in either upper or lower case, + attributes with namespaces and with quoted or unquoted values. + + Example:: + + text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and + # closing tags as a 2-tuple + a, a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are + # also accessible as named results + print(link.link_text, '->', link.href) + + prints:: + + pyparsing -> https://github.com/pyparsing/pyparsing/wiki + """ + return _makeTags(tagStr, False) + +def makeXMLTags(tagStr): + """Helper to construct opening and closing tag expressions for XML, + given a tag name. Matches tags only in the given upper/lower case. + + Example: similar to :class:`makeHTMLTags` + """ + return _makeTags(tagStr, True) + +def withAttribute(*args, **attrDict): + """Helper to create a validating parse action to be used with start + tags created with :class:`makeXMLTags` or + :class:`makeHTMLTags`. Use ``withAttribute`` to qualify + a starting tag with a required attribute value, to avoid false + matches on common tags such as ``<TD>`` or ``<DIV>``. + + Call ``withAttribute`` with a series of attribute names and + values. Specify the list of filter attributes names and values as: + + - keyword arguments, as in ``(align="right")``, or + - as an explicit dict with ``**`` operator, when an attribute + name is also a Python reserved word, as in ``**{"class":"Customer", "align":"right"}`` + - a list of name-value tuples, as in ``(("ns1:class", "Customer"), ("ns2:align", "right"))`` + + For attribute names with a namespace prefix, you must use the second + form. Attribute names are matched insensitive to upper/lower case. + + If just testing for ``class`` (with or without a namespace), use + :class:`withClass`. + + To verify that the attribute exists, but without specifying a value, + pass ``withAttribute.ANY_VALUE`` as the value. + + Example:: + + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + + prints:: + + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k, v) for k, v in attrs] + def pa(s, l, tokens): + for attrName, attrValue in attrs: + if attrName not in tokens: + raise ParseException(s, l, "no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s, l, "attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """Simplified version of :class:`withAttribute` when + matching on a div class - made difficult because ``class`` is + a reserved word in Python. + + Example:: + + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + + prints:: + + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr: classname}) + +opAssoc = SimpleNamespace() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation(baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')')): + """Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary + or binary, left- or right-associative. Parse actions can also be + attached to operator expressions. The generated parser will also + recognize the use of parentheses to override operator precedences + (see example below). + + Note: if you define a deep operator list, you may see performance + issues when using infixNotation. See + :class:`ParserElement.enablePackrat` for a mechanism to potentially + improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the + nested + - opList - list of tuples, one for each operator precedence level + in the expression grammar; each tuple is of the form ``(opExpr, + numTerms, rightLeftAssoc, parseAction)``, where: + + - opExpr is the pyparsing expression for the operator; may also + be a string, which will be converted to a Literal; if numTerms + is 3, opExpr is a tuple of two expressions, for the two + operators separating the 3 terms + - numTerms is the number of terms for this operator (must be 1, + 2, or 3) + - rightLeftAssoc is the indicator whether the operator is right + or left associative, using the pyparsing-defined constants + ``opAssoc.RIGHT`` and ``opAssoc.LEFT``. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the parse action + tuple member may be omitted); if the parse action is passed + a tuple or list of functions, this is equivalent to calling + ``setParseAction(*fn)`` + (:class:`ParserElement.setParseAction`) + - lpar - expression for matching left-parentheses + (default= ``Suppress('(')``) + - rpar - expression for matching right-parentheses + (default= ``Suppress(')')``) + + Example:: + + # simple example of four-function arithmetic with ints and + # variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + + prints:: + + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + # captive version of FollowedBy that does not do parse actions or capture results names + class _FB(FollowedBy): + def parseImpl(self, instring, loc, doActions=True): + self.expr.tryParse(instring, loc) + return loc, [] + + ret = Forward() + lastExpr = baseExpr | (lpar + ret + rpar) + for i, operDef in enumerate(opList): + opExpr, arity, rightLeftAssoc, pa = (operDef + (None, ))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError( + "if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = _FB(lastExpr + opExpr) + Group(lastExpr + OneOrMore(opExpr)) + elif arity == 2: + if opExpr is not None: + matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group(lastExpr + OneOrMore(opExpr + lastExpr)) + else: + matchExpr = _FB(lastExpr + lastExpr) + Group(lastExpr + OneOrMore(lastExpr)) + elif arity == 3: + matchExpr = (_FB(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + + Group(lastExpr + OneOrMore(opExpr1 + lastExpr + opExpr2 + lastExpr))) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = _FB(opExpr.expr + thisExpr) + Group(opExpr + thisExpr) + elif arity == 2: + if opExpr is not None: + matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group(lastExpr + OneOrMore(opExpr + thisExpr)) + else: + matchExpr = _FB(lastExpr + thisExpr) + Group(lastExpr + OneOrMore(thisExpr)) + elif arity == 3: + matchExpr = (_FB(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + + Group(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr)) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + if isinstance(pa, (tuple, list)): + matchExpr.setParseAction(*pa) + else: + matchExpr.setParseAction(pa) + thisExpr <<= (matchExpr.setName(termName) | lastExpr) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of :class:`infixNotation`, will be +dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*') + '"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*") + "'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*') + '"' + | Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*") + "'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """Helper method for defining nested lists enclosed in opening and + closing delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list + (default= ``"("``); can also be a pyparsing expression + - closer - closing character for a nested list + (default= ``")"``); can also be a pyparsing expression + - content - expression for items within the nested lists + (default= ``None``) + - ignoreExpr - expression for ignoring opening and closing + delimiters (default= :class:`quotedString`) + + If an expression is not provided for the content argument, the + nested expression will capture all whitespace-delimited content + between delimiters as a list of separate values. + + Use the ``ignoreExpr`` argument to define expressions that may + contain opening or closing characters that should not be treated as + opening or closing characters for nesting, such as quotedString or + a comment expression. Specify multiple expressions using an + :class:`Or` or :class:`MatchFirst`. The default is + :class:`quotedString`, but if no expressions are to be ignored, then + pass ``None`` for this argument. + + Example:: + + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR, RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + + prints:: + + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener, basestring) and isinstance(closer, basestring): + if len(opener) == 1 and len(closer) == 1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener + + closer + + ParserElement.DEFAULT_WHITE_CHARS, exact=1) + ) + ).setParseAction(lambda t: t[0].strip())) + else: + content = (empty.copy() + CharsNotIn(opener + + closer + + ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t: t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS, exact=1)) + ).setParseAction(lambda t: t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS, exact=1)) + ).setParseAction(lambda t: t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group(Suppress(opener) + ZeroOrMore(ignoreExpr | ret | content) + Suppress(closer)) + else: + ret <<= Group(Suppress(opener) + ZeroOrMore(ret | content) + Suppress(closer)) + ret.setName('nested %s%s expression' % (opener, closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """Helper method for defining space-delimited indentation blocks, + such as those used to define block statements in Python source code. + + Parameters: + + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single + grammar should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond + the current level; set to False for block of left-most + statements (default= ``True``) + + A valid block must contain at least one ``blockStatement``. + + Example:: + + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group("(" + Optional(delimitedList(identifier)) + ")") + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group(funcDecl + func_body) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << (funcDef | assignment | identifier) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + + prints:: + + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + backup_stack = indentStack[:] + + def reset_stack(): + indentStack[:] = backup_stack + + def checkPeerIndent(s, l, t): + if l >= len(s): return + curCol = col(l, s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseException(s, l, "illegal nesting") + raise ParseException(s, l, "not a peer entry") + + def checkSubIndent(s, l, t): + curCol = col(l, s) + if curCol > indentStack[-1]: + indentStack.append(curCol) + else: + raise ParseException(s, l, "not a subentry") + + def checkUnindent(s, l, t): + if l >= len(s): return + curCol = col(l, s) + if not(indentStack and curCol in indentStack): + raise ParseException(s, l, "not an unindent") + if curCol < indentStack[-1]: + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress(), stopOn=StringEnd()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group(Optional(NL) + + INDENT + + OneOrMore(PEER + Group(blockStatementExpr) + Optional(NL), stopOn=StringEnd()) + + UNDENT) + else: + smExpr = Group(Optional(NL) + + OneOrMore(PEER + Group(blockStatementExpr) + Optional(NL), stopOn=StringEnd()) + + UNDENT) + smExpr.setFailAction(lambda a, b, c, d: reset_stack()) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag, anyCloseTag = makeHTMLTags(Word(alphas, alphanums + "_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(), '><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form ``/* ... */``" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form ``<!-- ... -->``" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form ``// ... (to end of line)``" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/' | dblSlashComment).setName("C++ style comment") +"Comment of either form :class:`cStyleComment` or :class:`dblSlashComment`" + +javaStyleComment = cppStyleComment +"Same as :class:`cppStyleComment`" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form ``# ... (to end of line)``" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional(Word(" \t") + + ~Literal(",") + ~LineEnd()))).streamline().setName("commaItem") +commaSeparatedList = delimitedList(Optional(quotedString.copy() | _commasepitem, default="")).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or +quoted strings, separated by commas. + +This expression is deprecated in favor of :class:`pyparsing_common.comma_separated_list`. +""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """Here are some common low-level expressions that may be useful in + jump-starting parser development: + + - numeric forms (:class:`integers<integer>`, :class:`reals<real>`, + :class:`scientific notation<sci_real>`) + - common :class:`programming identifiers<identifier>` + - network addresses (:class:`MAC<mac_address>`, + :class:`IPv4<ipv4_address>`, :class:`IPv6<ipv6_address>`) + - ISO8601 :class:`dates<iso8601_date>` and + :class:`datetime<iso8601_datetime>` + - :class:`UUID<uuid>` + - :class:`comma-separated list<comma_separated_list>` + + Parse actions: + + - :class:`convertToInteger` + - :class:`convertToFloat` + - :class:`convertToDate` + - :class:`convertToDatetime` + - :class:`stripHTMLTags` + - :class:`upcaseTokens` + - :class:`downcaseTokens` + + Example:: + + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + + prints:: + + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int, 16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?(?:\d+\.\d*|\.\d+)').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?(?:\d+(?:[eE][+-]?\d+)|(?:\d+\.\d*|\.\d+)(?:[eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional + scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas + '_', alphanums + '_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (``0.0.0.0 - 255.255.255.255``)" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part) * 7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part) * (0, 6)) + + "::" + + Optional(_ipv6_part + (':' + _ipv6_part) * (0, 6)) + ).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%d"``) + + Example:: + + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + + prints:: + + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s, l, t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """Helper to create a parse action for converting parsed + datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%dT%H:%M:%S.%f"``) + + Example:: + + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + + prints:: + + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s, l, t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (``yyyy-mm-dd``)" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (``yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)``) - trailing seconds, milliseconds, and timezone optional; accepts separating ``'T'`` or ``' '``" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (``xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx``)" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """Parse action to remove HTML tags from web page HTML source + + Example:: + + # strip HTML links from normal text + text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>' + td, td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + print(table_text.parseString(text).body) + + Prints:: + + More info at the pyparsing wiki page + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + + ~LineEnd() + + Word(printables, excludeChars=',') + + Optional(White(" \t")))).streamline().setName("commaItem") + comma_separated_list = delimitedList(Optional(quotedString.copy() + | _commasepitem, default='') + ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +class _lazyclassproperty(object): + def __init__(self, fn): + self.fn = fn + self.__doc__ = fn.__doc__ + self.__name__ = fn.__name__ + + def __get__(self, obj, cls): + if cls is None: + cls = type(obj) + if not hasattr(cls, '_intern') or any(cls._intern is getattr(superclass, '_intern', []) + for superclass in cls.__mro__[1:]): + cls._intern = {} + attrname = self.fn.__name__ + if attrname not in cls._intern: + cls._intern[attrname] = self.fn(cls) + return cls._intern[attrname] + + +class unicode_set(object): + """ + A set of Unicode characters, for language-specific strings for + ``alphas``, ``nums``, ``alphanums``, and ``printables``. + A unicode_set is defined by a list of ranges in the Unicode character + set, in a class attribute ``_ranges``, such as:: + + _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] + + A unicode set can also be defined using multiple inheritance of other unicode sets:: + + class CJK(Chinese, Japanese, Korean): + pass + """ + _ranges = [] + + @classmethod + def _get_chars_for_ranges(cls): + ret = [] + for cc in cls.__mro__: + if cc is unicode_set: + break + for rr in cc._ranges: + ret.extend(range(rr[0], rr[-1] + 1)) + return [unichr(c) for c in sorted(set(ret))] + + @_lazyclassproperty + def printables(cls): + "all non-whitespace characters in this range" + return u''.join(filterfalse(unicode.isspace, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def alphas(cls): + "all alphabetic characters in this range" + return u''.join(filter(unicode.isalpha, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def nums(cls): + "all numeric digit characters in this range" + return u''.join(filter(unicode.isdigit, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def alphanums(cls): + "all alphanumeric characters in this range" + return cls.alphas + cls.nums + + +class pyparsing_unicode(unicode_set): + """ + A namespace class for defining common language unicode_sets. + """ + _ranges = [(32, sys.maxunicode)] + + class Latin1(unicode_set): + "Unicode set for Latin-1 Unicode Character Range" + _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] + + class LatinA(unicode_set): + "Unicode set for Latin-A Unicode Character Range" + _ranges = [(0x0100, 0x017f),] + + class LatinB(unicode_set): + "Unicode set for Latin-B Unicode Character Range" + _ranges = [(0x0180, 0x024f),] + + class Greek(unicode_set): + "Unicode set for Greek Unicode Character Ranges" + _ranges = [ + (0x0370, 0x03ff), (0x1f00, 0x1f15), (0x1f18, 0x1f1d), (0x1f20, 0x1f45), (0x1f48, 0x1f4d), + (0x1f50, 0x1f57), (0x1f59,), (0x1f5b,), (0x1f5d,), (0x1f5f, 0x1f7d), (0x1f80, 0x1fb4), (0x1fb6, 0x1fc4), + (0x1fc6, 0x1fd3), (0x1fd6, 0x1fdb), (0x1fdd, 0x1fef), (0x1ff2, 0x1ff4), (0x1ff6, 0x1ffe), + ] + + class Cyrillic(unicode_set): + "Unicode set for Cyrillic Unicode Character Range" + _ranges = [(0x0400, 0x04ff)] + + class Chinese(unicode_set): + "Unicode set for Chinese Unicode Character Range" + _ranges = [(0x4e00, 0x9fff), (0x3000, 0x303f),] + + class Japanese(unicode_set): + "Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges" + _ranges = [] + + class Kanji(unicode_set): + "Unicode set for Kanji Unicode Character Range" + _ranges = [(0x4E00, 0x9Fbf), (0x3000, 0x303f),] + + class Hiragana(unicode_set): + "Unicode set for Hiragana Unicode Character Range" + _ranges = [(0x3040, 0x309f),] + + class Katakana(unicode_set): + "Unicode set for Katakana Unicode Character Range" + _ranges = [(0x30a0, 0x30ff),] + + class Korean(unicode_set): + "Unicode set for Korean Unicode Character Range" + _ranges = [(0xac00, 0xd7af), (0x1100, 0x11ff), (0x3130, 0x318f), (0xa960, 0xa97f), (0xd7b0, 0xd7ff), (0x3000, 0x303f),] + + class CJK(Chinese, Japanese, Korean): + "Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range" + pass + + class Thai(unicode_set): + "Unicode set for Thai Unicode Character Range" + _ranges = [(0x0e01, 0x0e3a), (0x0e3f, 0x0e5b),] + + class Arabic(unicode_set): + "Unicode set for Arabic Unicode Character Range" + _ranges = [(0x0600, 0x061b), (0x061e, 0x06ff), (0x0700, 0x077f),] + + class Hebrew(unicode_set): + "Unicode set for Hebrew Unicode Character Range" + _ranges = [(0x0590, 0x05ff),] + + class Devanagari(unicode_set): + "Unicode set for Devanagari Unicode Character Range" + _ranges = [(0x0900, 0x097f), (0xa8e0, 0xa8ff)] + +pyparsing_unicode.Japanese._ranges = (pyparsing_unicode.Japanese.Kanji._ranges + + pyparsing_unicode.Japanese.Hiragana._ranges + + pyparsing_unicode.Japanese.Katakana._ranges) + +# define ranges in language character sets +if PY_3: + setattr(pyparsing_unicode, u"العربية", pyparsing_unicode.Arabic) + setattr(pyparsing_unicode, u"中文", pyparsing_unicode.Chinese) + setattr(pyparsing_unicode, u"кириллица", pyparsing_unicode.Cyrillic) + setattr(pyparsing_unicode, u"Ελληνικά", pyparsing_unicode.Greek) + setattr(pyparsing_unicode, u"עִברִית", pyparsing_unicode.Hebrew) + setattr(pyparsing_unicode, u"日本語", pyparsing_unicode.Japanese) + setattr(pyparsing_unicode.Japanese, u"漢字", pyparsing_unicode.Japanese.Kanji) + setattr(pyparsing_unicode.Japanese, u"カタカナ", pyparsing_unicode.Japanese.Katakana) + setattr(pyparsing_unicode.Japanese, u"ひらがな", pyparsing_unicode.Japanese.Hiragana) + setattr(pyparsing_unicode, u"한국어", pyparsing_unicode.Korean) + setattr(pyparsing_unicode, u"ไทย", pyparsing_unicode.Thai) + setattr(pyparsing_unicode, u"देवनागरी", pyparsing_unicode.Devanagari) + + +class pyparsing_test: + """ + namespace class for classes useful in writing unit tests + """ + + class reset_pyparsing_context: + """ + Context manager to be used when writing unit tests that modify pyparsing config values: + - packrat parsing + - default whitespace characters. + - default keyword characters + - literal string auto-conversion class + - __diag__ settings + + Example: + with reset_pyparsing_context(): + # test that literals used to construct a grammar are automatically suppressed + ParserElement.inlineLiteralsUsing(Suppress) + + term = Word(alphas) | Word(nums) + group = Group('(' + term[...] + ')') + + # assert that the '()' characters are not included in the parsed tokens + self.assertParseAndCheckLisst(group, "(abc 123 def)", ['abc', '123', 'def']) + + # after exiting context manager, literals are converted to Literal expressions again + """ + + def __init__(self): + self._save_context = {} + + def save(self): + self._save_context["default_whitespace"] = ParserElement.DEFAULT_WHITE_CHARS + self._save_context["default_keyword_chars"] = Keyword.DEFAULT_KEYWORD_CHARS + self._save_context[ + "literal_string_class" + ] = ParserElement._literalStringClass + self._save_context["packrat_enabled"] = ParserElement._packratEnabled + self._save_context["packrat_parse"] = ParserElement._parse + self._save_context["__diag__"] = { + name: getattr(__diag__, name) for name in __diag__._all_names + } + self._save_context["__compat__"] = { + "collect_all_And_tokens": __compat__.collect_all_And_tokens + } + return self + + def restore(self): + # reset pyparsing global state + if ( + ParserElement.DEFAULT_WHITE_CHARS + != self._save_context["default_whitespace"] + ): + ParserElement.setDefaultWhitespaceChars( + self._save_context["default_whitespace"] + ) + Keyword.DEFAULT_KEYWORD_CHARS = self._save_context["default_keyword_chars"] + ParserElement.inlineLiteralsUsing( + self._save_context["literal_string_class"] + ) + for name, value in self._save_context["__diag__"].items(): + setattr(__diag__, name, value) + ParserElement._packratEnabled = self._save_context["packrat_enabled"] + ParserElement._parse = self._save_context["packrat_parse"] + __compat__.collect_all_And_tokens = self._save_context["__compat__"] + + def __enter__(self): + return self.save() + + def __exit__(self, *args): + return self.restore() + + class TestParseResultsAsserts: + """ + A mixin class to add parse results assertion methods to normal unittest.TestCase classes. + """ + def assertParseResultsEquals( + self, result, expected_list=None, expected_dict=None, msg=None + ): + """ + Unit test assertion to compare a ParseResults object with an optional expected_list, + and compare any defined results names with an optional expected_dict. + """ + if expected_list is not None: + self.assertEqual(expected_list, result.asList(), msg=msg) + if expected_dict is not None: + self.assertEqual(expected_dict, result.asDict(), msg=msg) + + def assertParseAndCheckList( + self, expr, test_string, expected_list, msg=None, verbose=True + ): + """ + Convenience wrapper assert to test a parser element and input string, and assert that + the resulting ParseResults.asList() is equal to the expected_list. + """ + result = expr.parseString(test_string, parseAll=True) + if verbose: + print(result.dump()) + self.assertParseResultsEquals(result, expected_list=expected_list, msg=msg) + + def assertParseAndCheckDict( + self, expr, test_string, expected_dict, msg=None, verbose=True + ): + """ + Convenience wrapper assert to test a parser element and input string, and assert that + the resulting ParseResults.asDict() is equal to the expected_dict. + """ + result = expr.parseString(test_string, parseAll=True) + if verbose: + print(result.dump()) + self.assertParseResultsEquals(result, expected_dict=expected_dict, msg=msg) + + def assertRunTestResults( + self, run_tests_report, expected_parse_results=None, msg=None + ): + """ + Unit test assertion to evaluate output of ParserElement.runTests(). If a list of + list-dict tuples is given as the expected_parse_results argument, then these are zipped + with the report tuples returned by runTests and evaluated using assertParseResultsEquals. + Finally, asserts that the overall runTests() success value is True. + + :param run_tests_report: tuple(bool, [tuple(str, ParseResults or Exception)]) returned from runTests + :param expected_parse_results (optional): [tuple(str, list, dict, Exception)] + """ + run_test_success, run_test_results = run_tests_report + + if expected_parse_results is not None: + merged = [ + (rpt[0], rpt[1], expected) + for rpt, expected in zip(run_test_results, expected_parse_results) + ] + for test_string, result, expected in merged: + # expected should be a tuple containing a list and/or a dict or an exception, + # and optional failure message string + # an empty tuple will skip any result validation + fail_msg = next( + (exp for exp in expected if isinstance(exp, str)), None + ) + expected_exception = next( + ( + exp + for exp in expected + if isinstance(exp, type) and issubclass(exp, Exception) + ), + None, + ) + if expected_exception is not None: + with self.assertRaises( + expected_exception=expected_exception, msg=fail_msg or msg + ): + if isinstance(result, Exception): + raise result + else: + expected_list = next( + (exp for exp in expected if isinstance(exp, list)), None + ) + expected_dict = next( + (exp for exp in expected if isinstance(exp, dict)), None + ) + if (expected_list, expected_dict) != (None, None): + self.assertParseResultsEquals( + result, + expected_list=expected_list, + expected_dict=expected_dict, + msg=fail_msg or msg, + ) + else: + # warning here maybe? + print("no validation for {!r}".format(test_string)) + + # do this last, in case some specific test results can be reported instead + self.assertTrue( + run_test_success, msg=msg if msg is not None else "failed runTests" + ) + + @contextmanager + def assertRaisesParseException(self, exc_type=ParseException, msg=None): + with self.assertRaises(exc_type, msg=msg): + yield + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/lib/python_libtorrent/__init__.py b/lib/python_libtorrent/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_armv7/0.16.19/__init__.py b/lib/python_libtorrent/android_armv7/0.16.19/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_armv7/0.16.19/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_armv7/0.16.19/libtorrent.so.size.txt b/lib/python_libtorrent/android_armv7/0.16.19/libtorrent.so.size.txt deleted file mode 100644 index 84e6fea8..00000000 --- a/lib/python_libtorrent/android_armv7/0.16.19/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -6804840 \ No newline at end of file diff --git a/lib/python_libtorrent/android_armv7/1.0.6/__init__.py b/lib/python_libtorrent/android_armv7/1.0.6/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_armv7/1.0.6/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_armv7/1.0.6/libtorrent.so.size.txt b/lib/python_libtorrent/android_armv7/1.0.6/libtorrent.so.size.txt deleted file mode 100644 index 6de27f94..00000000 --- a/lib/python_libtorrent/android_armv7/1.0.6/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -6545732 \ No newline at end of file diff --git a/lib/python_libtorrent/android_armv7/1.0.7/__init__.py b/lib/python_libtorrent/android_armv7/1.0.7/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_armv7/1.0.7/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_armv7/1.0.7/libtorrent.so.size.txt b/lib/python_libtorrent/android_armv7/1.0.7/libtorrent.so.size.txt deleted file mode 100644 index 2f7afd24..00000000 --- a/lib/python_libtorrent/android_armv7/1.0.7/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -6519704 \ No newline at end of file diff --git a/lib/python_libtorrent/android_armv7/1.0.8/__init__.py b/lib/python_libtorrent/android_armv7/1.0.8/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_armv7/1.0.8/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_armv7/1.0.8/libtorrent.so.size.txt b/lib/python_libtorrent/android_armv7/1.0.8/libtorrent.so.size.txt deleted file mode 100644 index fce8b958..00000000 --- a/lib/python_libtorrent/android_armv7/1.0.8/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -6513752 \ No newline at end of file diff --git a/lib/python_libtorrent/android_armv7/1.0.9/__init__.py b/lib/python_libtorrent/android_armv7/1.0.9/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_armv7/1.0.9/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_armv7/1.0.9/libtorrent.so.size.txt b/lib/python_libtorrent/android_armv7/1.0.9/libtorrent.so.size.txt deleted file mode 100644 index 36119234..00000000 --- a/lib/python_libtorrent/android_armv7/1.0.9/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -6518156 \ No newline at end of file diff --git a/lib/python_libtorrent/android_armv7/1.1.0/__init__.py b/lib/python_libtorrent/android_armv7/1.1.0/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_armv7/1.1.0/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_armv7/1.1.0/libtorrent.so.size.txt b/lib/python_libtorrent/android_armv7/1.1.0/libtorrent.so.size.txt deleted file mode 100644 index 5610ac18..00000000 --- a/lib/python_libtorrent/android_armv7/1.1.0/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -4608320 \ No newline at end of file diff --git a/lib/python_libtorrent/android_armv7/1.1.1/__init__.py b/lib/python_libtorrent/android_armv7/1.1.1/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_armv7/1.1.1/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_armv7/1.1.1/libtorrent.so.size.txt b/lib/python_libtorrent/android_armv7/1.1.1/libtorrent.so.size.txt deleted file mode 100644 index cc84d962..00000000 --- a/lib/python_libtorrent/android_armv7/1.1.1/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -4628960 \ No newline at end of file diff --git a/lib/python_libtorrent/android_armv7/__init__.py b/lib/python_libtorrent/android_armv7/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_armv7/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_x86/0.16.19/__init__.py b/lib/python_libtorrent/android_x86/0.16.19/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_x86/0.16.19/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_x86/0.16.19/libtorrent.so.size.txt b/lib/python_libtorrent/android_x86/0.16.19/libtorrent.so.size.txt deleted file mode 100644 index 559db63b..00000000 --- a/lib/python_libtorrent/android_x86/0.16.19/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -7145572 \ No newline at end of file diff --git a/lib/python_libtorrent/android_x86/1.0.6/__init__.py b/lib/python_libtorrent/android_x86/1.0.6/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_x86/1.0.6/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_x86/1.0.6/libtorrent.so.size.txt b/lib/python_libtorrent/android_x86/1.0.6/libtorrent.so.size.txt deleted file mode 100644 index 4f5d95fc..00000000 --- a/lib/python_libtorrent/android_x86/1.0.6/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -6921524 \ No newline at end of file diff --git a/lib/python_libtorrent/android_x86/1.0.7/__init__.py b/lib/python_libtorrent/android_x86/1.0.7/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_x86/1.0.7/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_x86/1.0.7/libtorrent.so.size.txt b/lib/python_libtorrent/android_x86/1.0.7/libtorrent.so.size.txt deleted file mode 100644 index 623c5ec5..00000000 --- a/lib/python_libtorrent/android_x86/1.0.7/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -6890380 \ No newline at end of file diff --git a/lib/python_libtorrent/android_x86/1.0.8/__init__.py b/lib/python_libtorrent/android_x86/1.0.8/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_x86/1.0.8/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_x86/1.0.8/libtorrent.so.size.txt b/lib/python_libtorrent/android_x86/1.0.8/libtorrent.so.size.txt deleted file mode 100644 index 4ae02ffd..00000000 --- a/lib/python_libtorrent/android_x86/1.0.8/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -6889512 \ No newline at end of file diff --git a/lib/python_libtorrent/android_x86/1.0.9/__init__.py b/lib/python_libtorrent/android_x86/1.0.9/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_x86/1.0.9/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_x86/1.0.9/libtorrent.so.size.txt b/lib/python_libtorrent/android_x86/1.0.9/libtorrent.so.size.txt deleted file mode 100644 index ebea3968..00000000 --- a/lib/python_libtorrent/android_x86/1.0.9/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -6889548 \ No newline at end of file diff --git a/lib/python_libtorrent/android_x86/1.1.0/__init__.py b/lib/python_libtorrent/android_x86/1.1.0/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_x86/1.1.0/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_x86/1.1.0/libtorrent.so.size.txt b/lib/python_libtorrent/android_x86/1.1.0/libtorrent.so.size.txt deleted file mode 100644 index e29817fc..00000000 --- a/lib/python_libtorrent/android_x86/1.1.0/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -5369280 \ No newline at end of file diff --git a/lib/python_libtorrent/android_x86/1.1.1/__init__.py b/lib/python_libtorrent/android_x86/1.1.1/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_x86/1.1.1/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/android_x86/1.1.1/libtorrent.so.size.txt b/lib/python_libtorrent/android_x86/1.1.1/libtorrent.so.size.txt deleted file mode 100644 index 87c887ad..00000000 --- a/lib/python_libtorrent/android_x86/1.1.1/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -5393984 \ No newline at end of file diff --git a/lib/python_libtorrent/android_x86/__init__.py b/lib/python_libtorrent/android_x86/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/android_x86/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/darwin/0.16.19/__init__.py b/lib/python_libtorrent/darwin/0.16.19/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/darwin/0.16.19/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/darwin/0.16.19/libtorrent.so.size.txt b/lib/python_libtorrent/darwin/0.16.19/libtorrent.so.size.txt deleted file mode 100644 index f36331b7..00000000 --- a/lib/python_libtorrent/darwin/0.16.19/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -10425648 \ No newline at end of file diff --git a/lib/python_libtorrent/darwin/1.0.9/__init__.py b/lib/python_libtorrent/darwin/1.0.9/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/darwin/1.0.9/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/darwin/1.0.9/libtorrent.so.size.txt b/lib/python_libtorrent/darwin/1.0.9/libtorrent.so.size.txt deleted file mode 100644 index 39bbc11f..00000000 --- a/lib/python_libtorrent/darwin/1.0.9/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -3578388 \ No newline at end of file diff --git a/lib/python_libtorrent/darwin/1.1.0/__init__.py b/lib/python_libtorrent/darwin/1.1.0/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/darwin/1.1.0/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/darwin/1.1.0/libtorrent.so.size.txt b/lib/python_libtorrent/darwin/1.1.0/libtorrent.so.size.txt deleted file mode 100644 index ffcb02f5..00000000 --- a/lib/python_libtorrent/darwin/1.1.0/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -5292640 \ No newline at end of file diff --git a/lib/python_libtorrent/darwin/1.1.1/__init__.py b/lib/python_libtorrent/darwin/1.1.1/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/darwin/1.1.1/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/darwin/1.1.1/libtorrent.so.size.txt b/lib/python_libtorrent/darwin/1.1.1/libtorrent.so.size.txt deleted file mode 100644 index 8b51a1f3..00000000 --- a/lib/python_libtorrent/darwin/1.1.1/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -5331516 \ No newline at end of file diff --git a/lib/python_libtorrent/darwin/__init__.py b/lib/python_libtorrent/darwin/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/darwin/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/ios_arm/1.0.7/__init__.py b/lib/python_libtorrent/ios_arm/1.0.7/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/ios_arm/1.0.7/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/ios_arm/1.0.7/libtorrent.so.size.txt b/lib/python_libtorrent/ios_arm/1.0.7/libtorrent.so.size.txt deleted file mode 100644 index 7ab22f29..00000000 --- a/lib/python_libtorrent/ios_arm/1.0.7/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -8834480 \ No newline at end of file diff --git a/lib/python_libtorrent/ios_arm/1.0.8/__init__.py b/lib/python_libtorrent/ios_arm/1.0.8/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/ios_arm/1.0.8/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/ios_arm/1.0.8/libtorrent.so.size.txt b/lib/python_libtorrent/ios_arm/1.0.8/libtorrent.so.size.txt deleted file mode 100644 index 7fc5097b..00000000 --- a/lib/python_libtorrent/ios_arm/1.0.8/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -8779608 \ No newline at end of file diff --git a/lib/python_libtorrent/ios_arm/1.0.9/__init__.py b/lib/python_libtorrent/ios_arm/1.0.9/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/ios_arm/1.0.9/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/ios_arm/1.0.9/libtorrent.so.size.txt b/lib/python_libtorrent/ios_arm/1.0.9/libtorrent.so.size.txt deleted file mode 100644 index 3fdc1bf1..00000000 --- a/lib/python_libtorrent/ios_arm/1.0.9/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -8831856 \ No newline at end of file diff --git a/lib/python_libtorrent/ios_arm/1.1.1/__init__.py b/lib/python_libtorrent/ios_arm/1.1.1/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/ios_arm/1.1.1/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/ios_arm/1.1.1/libtorrent.so.size.txt b/lib/python_libtorrent/ios_arm/1.1.1/libtorrent.so.size.txt deleted file mode 100644 index bee1908e..00000000 --- a/lib/python_libtorrent/ios_arm/1.1.1/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -3439420 \ No newline at end of file diff --git a/lib/python_libtorrent/ios_arm/__init__.py b/lib/python_libtorrent/ios_arm/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/ios_arm/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_aarch64_ucs2/1.1.0/__init__.py b/lib/python_libtorrent/linux_aarch64_ucs2/1.1.0/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_aarch64_ucs2/1.1.0/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_aarch64_ucs2/1.1.0/libtorrent.so.size.txt b/lib/python_libtorrent/linux_aarch64_ucs2/1.1.0/libtorrent.so.size.txt deleted file mode 100644 index 8bf018bb..00000000 --- a/lib/python_libtorrent/linux_aarch64_ucs2/1.1.0/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -5191944 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_aarch64_ucs2/__init__.py b/lib/python_libtorrent/linux_aarch64_ucs2/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_aarch64_ucs2/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_aarch64_ucs4/1.1.0/__init__.py b/lib/python_libtorrent/linux_aarch64_ucs4/1.1.0/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_aarch64_ucs4/1.1.0/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_aarch64_ucs4/1.1.0/libtorrent.so.size.txt b/lib/python_libtorrent/linux_aarch64_ucs4/1.1.0/libtorrent.so.size.txt deleted file mode 100644 index 8bf018bb..00000000 --- a/lib/python_libtorrent/linux_aarch64_ucs4/1.1.0/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -5191944 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_aarch64_ucs4/1.1.1/__init__.py b/lib/python_libtorrent/linux_aarch64_ucs4/1.1.1/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_aarch64_ucs4/1.1.1/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_aarch64_ucs4/1.1.1/libtorrent.so.size.txt b/lib/python_libtorrent/linux_aarch64_ucs4/1.1.1/libtorrent.so.size.txt deleted file mode 100644 index ef8c5644..00000000 --- a/lib/python_libtorrent/linux_aarch64_ucs4/1.1.1/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -2884768 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_aarch64_ucs4/__init__.py b/lib/python_libtorrent/linux_aarch64_ucs4/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_aarch64_ucs4/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv6/0.16.19/__init__.py b/lib/python_libtorrent/linux_armv6/0.16.19/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv6/0.16.19/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv6/0.16.19/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv6/0.16.19/libtorrent.so.size.txt deleted file mode 100644 index 9d285b23..00000000 --- a/lib/python_libtorrent/linux_armv6/0.16.19/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -2133072 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv6/1.0.11/__init__.py b/lib/python_libtorrent/linux_armv6/1.0.11/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv6/1.0.11/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv6/1.0.11/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv6/1.0.11/libtorrent.so.size.txt deleted file mode 100644 index 9a1d6002..00000000 --- a/lib/python_libtorrent/linux_armv6/1.0.11/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -2286476 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv6/1.0.6/__init__.py b/lib/python_libtorrent/linux_armv6/1.0.6/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv6/1.0.6/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv6/1.0.6/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv6/1.0.6/libtorrent.so.size.txt deleted file mode 100644 index 62a4af3f..00000000 --- a/lib/python_libtorrent/linux_armv6/1.0.6/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -1979232 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv6/1.0.7/__init__.py b/lib/python_libtorrent/linux_armv6/1.0.7/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv6/1.0.7/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv6/1.0.7/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv6/1.0.7/libtorrent.so.size.txt deleted file mode 100644 index 5ff46c86..00000000 --- a/lib/python_libtorrent/linux_armv6/1.0.7/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -2286424 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv6/1.0.9/__init__.py b/lib/python_libtorrent/linux_armv6/1.0.9/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv6/1.0.9/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv6/1.0.9/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv6/1.0.9/libtorrent.so.size.txt deleted file mode 100644 index 5ff46c86..00000000 --- a/lib/python_libtorrent/linux_armv6/1.0.9/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -2286424 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv6/1.1.0/__init__.py b/lib/python_libtorrent/linux_armv6/1.1.0/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv6/1.1.0/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv6/1.1.0/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv6/1.1.0/libtorrent.so.size.txt deleted file mode 100644 index 56d0afee..00000000 --- a/lib/python_libtorrent/linux_armv6/1.1.0/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -2388664 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv6/1.1.1/__init__.py b/lib/python_libtorrent/linux_armv6/1.1.1/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv6/1.1.1/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv6/1.1.1/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv6/1.1.1/libtorrent.so.size.txt deleted file mode 100644 index e97c6282..00000000 --- a/lib/python_libtorrent/linux_armv6/1.1.1/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -2577640 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv6/1.1.6/__init__.py b/lib/python_libtorrent/linux_armv6/1.1.6/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv6/1.1.6/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv6/1.1.6/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv6/1.1.6/libtorrent.so.size.txt deleted file mode 100644 index 8df81141..00000000 --- a/lib/python_libtorrent/linux_armv6/1.1.6/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -3630144 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv6/1.1.7/__init__.py b/lib/python_libtorrent/linux_armv6/1.1.7/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv6/1.1.7/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv6/1.1.7/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv6/1.1.7/libtorrent.so.size.txt deleted file mode 100644 index 0e905c96..00000000 --- a/lib/python_libtorrent/linux_armv6/1.1.7/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -3634324 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv6/__init__.py b/lib/python_libtorrent/linux_armv6/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv6/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv7/0.16.19/__init__.py b/lib/python_libtorrent/linux_armv7/0.16.19/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv7/0.16.19/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv7/0.16.19/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv7/0.16.19/libtorrent.so.size.txt deleted file mode 100644 index 375fc94c..00000000 --- a/lib/python_libtorrent/linux_armv7/0.16.19/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -1892840 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv7/1.0.6/__init__.py b/lib/python_libtorrent/linux_armv7/1.0.6/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv7/1.0.6/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv7/1.0.6/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv7/1.0.6/libtorrent.so.size.txt deleted file mode 100644 index 98acdd6d..00000000 --- a/lib/python_libtorrent/linux_armv7/1.0.6/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -2048268 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv7/1.0.7/__init__.py b/lib/python_libtorrent/linux_armv7/1.0.7/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv7/1.0.7/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv7/1.0.7/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv7/1.0.7/libtorrent.so.size.txt deleted file mode 100644 index 7cdb4776..00000000 --- a/lib/python_libtorrent/linux_armv7/1.0.7/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -2093128 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv7/1.0.9/__init__.py b/lib/python_libtorrent/linux_armv7/1.0.9/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv7/1.0.9/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv7/1.0.9/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv7/1.0.9/libtorrent.so.size.txt deleted file mode 100644 index bb85f14f..00000000 --- a/lib/python_libtorrent/linux_armv7/1.0.9/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -2043172 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv7/1.1.0/__init__.py b/lib/python_libtorrent/linux_armv7/1.1.0/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv7/1.1.0/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv7/1.1.0/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv7/1.1.0/libtorrent.so.size.txt deleted file mode 100644 index 0866378e..00000000 --- a/lib/python_libtorrent/linux_armv7/1.1.0/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -2662156 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv7/1.1.1/__init__.py b/lib/python_libtorrent/linux_armv7/1.1.1/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv7/1.1.1/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_armv7/1.1.1/libtorrent.so.size.txt b/lib/python_libtorrent/linux_armv7/1.1.1/libtorrent.so.size.txt deleted file mode 100644 index 4a58671f..00000000 --- a/lib/python_libtorrent/linux_armv7/1.1.1/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -2674612 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_armv7/__init__.py b/lib/python_libtorrent/linux_armv7/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_armv7/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_mips/1.0.9/__init__.py b/lib/python_libtorrent/linux_mips/1.0.9/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_mips/1.0.9/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_mips/1.0.9/libtorrent.so.size.txt b/lib/python_libtorrent/linux_mips/1.0.9/libtorrent.so.size.txt deleted file mode 100644 index 476b9bff..00000000 --- a/lib/python_libtorrent/linux_mips/1.0.9/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -4598636 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_mips/__init__.py b/lib/python_libtorrent/linux_mips/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_mips/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_mipsel_ucs2/1.0.9/__init__.py b/lib/python_libtorrent/linux_mipsel_ucs2/1.0.9/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_mipsel_ucs2/1.0.9/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_mipsel_ucs2/1.0.9/libtorrent.so.size.txt b/lib/python_libtorrent/linux_mipsel_ucs2/1.0.9/libtorrent.so.size.txt deleted file mode 100644 index 314f7bd9..00000000 --- a/lib/python_libtorrent/linux_mipsel_ucs2/1.0.9/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -4596396 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_mipsel_ucs2/1.1.0/__init__.py b/lib/python_libtorrent/linux_mipsel_ucs2/1.1.0/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_mipsel_ucs2/1.1.0/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_mipsel_ucs2/1.1.0/libtorrent.so.size.txt b/lib/python_libtorrent/linux_mipsel_ucs2/1.1.0/libtorrent.so.size.txt deleted file mode 100644 index faeab6c5..00000000 --- a/lib/python_libtorrent/linux_mipsel_ucs2/1.1.0/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -6325240 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_mipsel_ucs2/__init__.py b/lib/python_libtorrent/linux_mipsel_ucs2/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_mipsel_ucs2/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_mipsel_ucs4/1.0.9/__init__.py b/lib/python_libtorrent/linux_mipsel_ucs4/1.0.9/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_mipsel_ucs4/1.0.9/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_mipsel_ucs4/1.0.9/libtorrent.so.size.txt b/lib/python_libtorrent/linux_mipsel_ucs4/1.0.9/libtorrent.so.size.txt deleted file mode 100644 index 476b9bff..00000000 --- a/lib/python_libtorrent/linux_mipsel_ucs4/1.0.9/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -4598636 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_mipsel_ucs4/1.1.0/__init__.py b/lib/python_libtorrent/linux_mipsel_ucs4/1.1.0/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_mipsel_ucs4/1.1.0/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_mipsel_ucs4/1.1.0/libtorrent.so.size.txt b/lib/python_libtorrent/linux_mipsel_ucs4/1.1.0/libtorrent.so.size.txt deleted file mode 100644 index faeab6c5..00000000 --- a/lib/python_libtorrent/linux_mipsel_ucs4/1.1.0/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -6325240 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_mipsel_ucs4/__init__.py b/lib/python_libtorrent/linux_mipsel_ucs4/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_mipsel_ucs4/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_x86/0.16.19/__init__.py b/lib/python_libtorrent/linux_x86/0.16.19/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_x86/0.16.19/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_x86/0.16.19/libtorrent.so.size.txt b/lib/python_libtorrent/linux_x86/0.16.19/libtorrent.so.size.txt deleted file mode 100644 index a346659a..00000000 --- a/lib/python_libtorrent/linux_x86/0.16.19/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -6257605 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_x86/1.0.6/__init__.py b/lib/python_libtorrent/linux_x86/1.0.6/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_x86/1.0.6/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_x86/1.0.6/libtorrent.so.size.txt b/lib/python_libtorrent/linux_x86/1.0.6/libtorrent.so.size.txt deleted file mode 100644 index 3e74d111..00000000 --- a/lib/python_libtorrent/linux_x86/1.0.6/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -3517944 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_x86/1.0.7/__init__.py b/lib/python_libtorrent/linux_x86/1.0.7/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_x86/1.0.7/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_x86/1.0.7/libtorrent.so.size.txt b/lib/python_libtorrent/linux_x86/1.0.7/libtorrent.so.size.txt deleted file mode 100644 index c7e345be..00000000 --- a/lib/python_libtorrent/linux_x86/1.0.7/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -3544068 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_x86/1.0.9/__init__.py b/lib/python_libtorrent/linux_x86/1.0.9/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_x86/1.0.9/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_x86/1.0.9/libtorrent.so.size.txt b/lib/python_libtorrent/linux_x86/1.0.9/libtorrent.so.size.txt deleted file mode 100644 index 5b7c9ab3..00000000 --- a/lib/python_libtorrent/linux_x86/1.0.9/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -3239792 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_x86/1.1.0/__init__.py b/lib/python_libtorrent/linux_x86/1.1.0/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_x86/1.1.0/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_x86/1.1.0/libtorrent.so.size.txt b/lib/python_libtorrent/linux_x86/1.1.0/libtorrent.so.size.txt deleted file mode 100644 index 18303722..00000000 --- a/lib/python_libtorrent/linux_x86/1.1.0/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -4601280 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_x86/1.1.1/__init__.py b/lib/python_libtorrent/linux_x86/1.1.1/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_x86/1.1.1/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_x86/1.1.1/libtorrent.so.size.txt b/lib/python_libtorrent/linux_x86/1.1.1/libtorrent.so.size.txt deleted file mode 100644 index 9f9b66e9..00000000 --- a/lib/python_libtorrent/linux_x86/1.1.1/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -6652780 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_x86/__init__.py b/lib/python_libtorrent/linux_x86/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_x86/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_x86_64/0.16.19/__init__.py b/lib/python_libtorrent/linux_x86_64/0.16.19/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_x86_64/0.16.19/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_x86_64/0.16.19/libtorrent.so.size.txt b/lib/python_libtorrent/linux_x86_64/0.16.19/libtorrent.so.size.txt deleted file mode 100644 index 4b476b5b..00000000 --- a/lib/python_libtorrent/linux_x86_64/0.16.19/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -6620181 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_x86_64/1.0.6/__init__.py b/lib/python_libtorrent/linux_x86_64/1.0.6/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_x86_64/1.0.6/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_x86_64/1.0.6/libtorrent.so.size.txt b/lib/python_libtorrent/linux_x86_64/1.0.6/libtorrent.so.size.txt deleted file mode 100644 index bd538ff2..00000000 --- a/lib/python_libtorrent/linux_x86_64/1.0.6/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -3514688 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_x86_64/1.0.7/__init__.py b/lib/python_libtorrent/linux_x86_64/1.0.7/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_x86_64/1.0.7/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_x86_64/1.0.7/libtorrent.so.size.txt b/lib/python_libtorrent/linux_x86_64/1.0.7/libtorrent.so.size.txt deleted file mode 100644 index bea17883..00000000 --- a/lib/python_libtorrent/linux_x86_64/1.0.7/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -3576128 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_x86_64/1.0.9/__init__.py b/lib/python_libtorrent/linux_x86_64/1.0.9/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_x86_64/1.0.9/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_x86_64/1.0.9/libtorrent.so.size.txt b/lib/python_libtorrent/linux_x86_64/1.0.9/libtorrent.so.size.txt deleted file mode 100644 index 24691028..00000000 --- a/lib/python_libtorrent/linux_x86_64/1.0.9/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -3290600 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_x86_64/1.1.0/__init__.py b/lib/python_libtorrent/linux_x86_64/1.1.0/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_x86_64/1.1.0/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_x86_64/1.1.0/libtorrent.so.size.txt b/lib/python_libtorrent/linux_x86_64/1.1.0/libtorrent.so.size.txt deleted file mode 100644 index c66f5c33..00000000 --- a/lib/python_libtorrent/linux_x86_64/1.1.0/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -4246184 \ No newline at end of file diff --git a/lib/python_libtorrent/linux_x86_64/1.1.1/__init__.py b/lib/python_libtorrent/linux_x86_64/1.1.1/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/linux_x86_64/1.1.1/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/linux_x86_64/1.1.1/libtorrent.so.size.txt b/lib/python_libtorrent/linux_x86_64/1.1.1/libtorrent.so.size.txt deleted file mode 100644 index 53ec69f8..00000000 --- a/lib/python_libtorrent/linux_x86_64/1.1.1/libtorrent.so.size.txt +++ /dev/null @@ -1 +0,0 @@ -4263000 \ No newline at end of file diff --git a/lib/python_libtorrent/platform_pulsar.py b/lib/python_libtorrent/platform_pulsar.py deleted file mode 100644 index db827cac..00000000 --- a/lib/python_libtorrent/platform_pulsar.py +++ /dev/null @@ -1,198 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' - -import sys -import os -try: - import xbmc, xbmcaddon - #__settings__ = xbmcaddon.Addon(id='script.module.libtorrent') ### Alfa - #__version__ = __settings__.getAddonInfo('version') ### Alfa - #__plugin__ = __settings__.getAddonInfo('name') + " v." + __version__ ### Alfa - __settings__ = xbmcaddon.Addon(id='plugin.video.kod') ### Alfa - __version__ = '1.1.17' ### Alfa - __plugin__ = "python-libtorrent v.1.1.7" ### Alfa -except: - __plugin__ = "python-libtorrent v.1.1.7" ### Alfa - pass - -def log(msg): - try: - xbmc.log("### [%s]: %s" % (__plugin__,msg,), level=xbmc.LOGNOTICE ) - except UnicodeEncodeError: - xbmc.log("### [%s]: %s" % (__plugin__,msg.encode("utf-8", "ignore"),), level=xbmc.LOGNOTICE ) - except: - try: - xbmc.log("### [%s]: %s" % (__plugin__,'ERROR LOG',), level=xbmc.LOGNOTICE ) - except: - print msg - -def get_libname(platform): - libname=[] - if platform['system'] in ['darwin', 'linux_x86', 'linux_arm', 'linux_armv6', - 'linux_armv7', 'linux_x86_64', 'ios_arm', - 'linux_mipsel_ucs2', 'linux_mipsel_ucs4', 'linux_aarch64_ucs2', 'linux_aarch64_ucs4']: - libname=['libtorrent.so'] - elif platform['system'] == 'windows': - libname=['libtorrent.pyd'] - elif platform['system'] in ['android_armv7', 'android_x86']: - libname=['libtorrent.so', 'liblibtorrent.so'] - return libname - -def get_platform(): - #__settings__ = xbmcaddon.Addon(id='script.module.libtorrent') - #__version__ = __settings__.getAddonInfo('version') - #__plugin__ = __settings__.getAddonInfo('name') + " v." + __version__ - __language__ = __settings__.getLocalizedString - - if __settings__.getSetting('custom_system').lower() == "true": - system = int(__settings__.getSetting('set_system')) - log('USE CUSTOM SYSTEM: '+__language__(1100+system)) - - ret={} - - if system==0: - ret["os"] = "windows" - ret["arch"] = "x86" - elif system==1: - ret["os"] = "linux" - ret["arch"] = "x86" - elif system==2: - ret["os"] = "linux" - ret["arch"] = "x64" - elif system==3: - ret["os"] = "linux" - ret["arch"] = "armv7" - elif system==4: - ret["os"] = "linux" - ret["arch"] = "armv6" - elif system==5: - ret["os"] = "android" - ret["arch"] = "arm" - elif system==6: - ret["os"] = "android" - ret["arch"] = "x86" - elif system==7: - ret["os"] = "darwin" - ret["arch"] = "x64" - elif system==8: - ret["os"] = "ios" - ret["arch"] = "arm" - elif system==9: - ret["os"] = "ios" - ret["arch"] = "arm" - elif system==10: - ret["os"] = "linux" - ret["arch"] = "mipsel_ucs2" - elif system==11: - ret["os"] = "linux" - ret["arch"] = "mipsel_ucs4" - elif system == 12: - ret["os"] = "linux" - ret["arch"] = "linux_aarch64_ucs2" - elif system == 13: - ret["os"] = "linux" - ret["arch"] = "linux_aarch64_ucs4" - else: - - ret = { - "arch": sys.maxsize > 2 ** 32 and "x64" or "x86", - } - if xbmc.getCondVisibility("system.platform.android"): - ret["os"] = "android" - if "arm" in os.uname()[4] or "aarch64" in os.uname()[4]: - ret["arch"] = "arm" - elif xbmc.getCondVisibility("system.platform.linux"): - ret["os"] = "linux" - uname=os.uname()[4] - if "arm" in uname: - if "armv7" in uname: - ret["arch"] = "armv7" - else: - ret["arch"] = "armv6" - elif "mips" in uname: - if sys.maxunicode > 65536: - ret["arch"] = 'mipsel_ucs4' - else: - ret["arch"] = 'mipsel_ucs2' - elif "aarch64" in uname: - if sys.maxint > 2147483647: #is_64bit_system - if sys.maxunicode > 65536: - ret["arch"] = 'aarch64_ucs4' - else: - ret["arch"] = 'aarch64_ucs2' - else: - ret["arch"] = "armv7" #32-bit userspace - elif xbmc.getCondVisibility("system.platform.windows"): - ret["os"] = "windows" - elif xbmc.getCondVisibility("system.platform.osx"): - ret["os"] = "darwin" - elif xbmc.getCondVisibility("system.platform.ios"): - ret["os"] = "ios" - ret["arch"] = "arm" - - ret=get_system(ret) - return ret - -def get_system(ret): - ret["system"] = '' - ret["message"] = ['', ''] - - if ret["os"] == 'windows': - ret["system"] = 'windows' - ret["message"] = ['Windows has static compiled python-libtorrent included.', - 'You should install "script.module.libtorrent" from "MyShows.me Kodi Repo"'] - elif ret["os"] == "linux" and ret["arch"] == "x64": - ret["system"] = 'linux_x86_64' - ret["message"] = ['Linux x64 has not static compiled python-libtorrent included.', - 'You should install it by "sudo apt-get install python-libtorrent"'] - elif ret["os"] == "linux" and ret["arch"] == "x86": - ret["system"] = 'linux_x86' - ret["message"] = ['Linux has static compiled python-libtorrent included but it didn\'t work.', - 'You should install it by "sudo apt-get install python-libtorrent"'] - elif ret["os"] == "linux" and "aarch64" in ret["arch"]: - ret["system"] = 'linux_' + ret["arch"] - ret["message"] = ['Linux has static compiled python-libtorrent included but it didn\'t work.', - 'You should install it by "sudo apt-get install python-libtorrent"'] - elif ret["os"] == "linux" and ("arm" or "mips" in ret["arch"]): - ret["system"] = 'linux_'+ret["arch"] - ret["message"] = ['As far as I know you can compile python-libtorrent for ARMv6-7.', - 'You should search for "OneEvil\'s OpenELEC libtorrent" or use Ace Stream.'] - elif ret["os"] == "android": - if ret["arch"]=='arm': - ret["system"] = 'android_armv7' - else: - ret["system"] = 'android_x86' - ret["message"] = ['Please contact DiMartino on kodi.tv forum. We compiled python-libtorrent for Android,', - 'but we need your help with some tests on different processors.'] - elif ret["os"] == "darwin": - ret["system"] = 'darwin' - ret["message"] = ['It is possible to compile python-libtorrent for OS X.', - 'But you would have to do it by yourself, there is some info on github.com.'] - elif ret["os"] == "ios" and ret["arch"] == "arm": - ret["system"] = 'ios_arm' - ret["message"] = ['It is probably NOT possible to compile python-libtorrent for iOS.', - 'But you can use torrent-client control functions.'] - - return ret \ No newline at end of file diff --git a/lib/python_libtorrent/public.py b/lib/python_libtorrent/public.py deleted file mode 100644 index 46afdf0c..00000000 --- a/lib/python_libtorrent/public.py +++ /dev/null @@ -1,83 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' - -import os - -from platform_pulsar import get_libname - -class Public: - def __init__( self ): - self.platforms=[] - self.root=os.path.dirname(__file__) - for dir in os.listdir(self.root): - if os.path.isdir(os.path.join(self.root,dir)): - for subdir in os.listdir(os.path.join(self.root,dir)): - if os.path.isdir(os.path.join(self.root,dir,subdir)): - self.platforms.append({'system':dir, 'version':subdir}) - self._generate_size_file() - - def _generate_size_file( self ): - for platform in self.platforms: - for libname in get_libname(platform): - self.libname=libname - self.platform=platform - self.libdir = os.path.join(self.root, self.platform['system'], self.platform['version']) - self.libpath = os.path.join(self.libdir, self.libname) - self.sizepath=self.libpath+'.size.txt' - self.zipname=self.libname+'.zip' - zippath=os.path.join(self.libdir, self.zipname) - system=platform['system']+'/'+platform['version']+'/' - if os.path.exists(self.libpath): - if not os.path.exists(self.sizepath): - print system+self.libname+' NO SIZE' - self._makezip() - elif not os.path.exists(zippath): - print system+self.libname+' NO ZIP' - self._makezip() - else: - size=str(os.path.getsize(self.libpath)) - size_old=open( self.sizepath, "r" ).read() - if size_old!=size: - print system+self.libname+' NOT EQUAL' - self._makezip() - else: - print system+self.libname+' NO ACTION' - else: - print system+self.libname+' NO LIB' - - def _makezip(self): - open( self.sizepath, "w" ).write( str(os.path.getsize(self.libpath)) ) - os.chdir(self.libdir) - os.system('del %s' % (self.zipname)) - os.system('"C:\\Program Files\\7-Zip\\7z.exe" a %s.zip %s' % - (self.libname, self.libname)) - os.chdir(self.root) - #os.system('"C:\\Program Files\\7-Zip\\7z.exe" a %s.zip %s' % - # (self.platform['system']+os.sep+self.libname, self.platform['system']+os.sep+self.libname)) - -if ( __name__ == "__main__" ): - # start - #TODO: publicate - Public() \ No newline at end of file diff --git a/lib/python_libtorrent/python_libtorrent/__init__.py b/lib/python_libtorrent/python_libtorrent/__init__.py deleted file mode 100644 index a0a8485e..00000000 --- a/lib/python_libtorrent/python_libtorrent/__init__.py +++ /dev/null @@ -1,243 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' -from __future__ import absolute_import -#from builtins import str -import sys -PY3 = False -if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int - -from .functions import * -import xbmc, xbmcaddon -import sys -import os -import traceback - -__version__ = '1.1.17' -__plugin__ = "python-libtorrent v.1.1.7" -__root__ = os.path.dirname(os.path.dirname(__file__)) - -libtorrent=None -platform = get_platform() -set_dirname=__root__ -if getSettingAsBool('custom_dirname') and set_dirname: - log('set_dirname:' +str(set_dirname)) - dirname=set_dirname -else: - dirname=set_dirname - -log('dirname: ' +str(dirname)) - -#versions = ['0.16.19', '1.0.6', '1.0.7', '1.0.8', '1.0.9', '1.0.11', '1.1.0', '1.1.1', '1.1.6', '1.1.7', '1.2.2', '1.2.3'] -versions = ['0.16.19', '1.0.6', '1.0.7', '1.0.8', '1.0.9', '1.0.11', '1.1.0', '1.1.1', '1.1.6', '1.1.7', '1.2.2'] -default_path = versions[-1] -set_version = 0 -if getSettingAsBool('custom_version'): - log('set_version:' +str(set_version)+' '+versions[set_version]) - platform['version'] = versions[set_version] -else: - platform['version'] = default_path - -sizefile_path = os.path.join(__root__, platform['system'], platform['version']) -if not os.path.exists(sizefile_path): - log('set_version: no sizefile at %s back to default %s' % (sizefile_path, default_path)) - platform['version'] = default_path - sizefile_path = os.path.join(__root__, platform['system'], platform['version']) - if not os.path.exists(sizefile_path): - log('set_version: no default at %s searching for any version' % sizefile_path) - try: - versions = sorted(os.listdir(os.path.join(__root__, platform['system']))) - except: - versions = [] - for ver in versions: - if not os.path.isdir(os.path.join(__root__, platform['system'], ver)): - versions.remove(ver) - - if len(versions)>0: - platform['version'] = versions[-1] - log('set_version: chose %s out of %s' % (platform['version'], str(versions))) - else: - e = 'die because the folder is empty' - log(e) - raise Exception(e) -dest_path = os.path.join(dirname, platform['system'], platform['version']) -sys.path.insert(0, dest_path) - -lm=LibraryManager(dest_path, platform) -if not lm.check_exist(): - ok=lm.download() - xbmc.sleep(2000) - - -log('platform: ' + str(platform)) -if platform['system'] not in ['windows', 'windows_x64']: - log('os: '+str(os.uname())) - log_text = 'ucs4' if sys.maxunicode > 65536 else 'ucs2' - log_text += ' x64' if sys.maxsize > 2147483647 else ' x86' - log(log_text) - -try: - fp = '' - pathname = '' - description = '' - libtorrent = '' - from platformcode import config - - if platform['system'] in ['linux_x86', 'windows', 'windows_x64', 'linux_armv6', 'linux_armv7', - 'linux_x86_64', 'linux_mipsel_ucs2', 'linux_mipsel_ucs4', - 'linux_aarch64_ucs2', 'linux_aarch64_ucs4']: - import libtorrent - - elif PY3 and platform['system'] not in ['android_armv7', 'android_x86']: - import libtorrent - - elif platform['system'] in ['darwin', 'ios_arm']: - import imp - - path_list = [dest_path] - log('path_list = ' + str(path_list)) - fp, pathname, description = imp.find_module('libtorrent', path_list) - log('fp = ' + str(fp)) - log('pathname = ' + str(pathname)) - log('description = ' + str(description)) - try: - libtorrent = imp.load_module('libtorrent', fp, pathname, description) - finally: - if fp: fp.close() - - elif platform['system'] in ['android_armv7', 'android_x86']: - try: - import imp - from ctypes import CDLL - - dest_path=lm.android_workaround(os.path.join(xbmc.translatePath('special://xbmc/'), 'files').replace('/cache/apk/assets', '')) - dll_path=os.path.join(dest_path, 'liblibtorrent.so') - log('CDLL path = ' + dll_path) - liblibtorrent=CDLL(dll_path) - log('CDLL = ' + str(liblibtorrent)) - path_list = [dest_path] - log('path_list = ' + str(path_list)) - fp, pathname, description = imp.find_module('libtorrent', path_list) - log('fp = ' + str(fp)) - log('pathname = ' + str(pathname)) - log('description = ' + str(description)) - try: - libtorrent = imp.load_module('libtorrent', fp, pathname, description) - finally: - if fp: fp.close() - except Exception as e: - if not PY3: - e = unicode(str(e), "utf8", errors="replace").encode("utf8") - config.set_setting("libtorrent_path", "", server="torrent") - config.set_setting("libtorrent_error", str(e), server="torrent") - log(traceback.format_exc(1)) - log('fp = ' + str(fp)) - log('pathname = ' + str(pathname)) - log('description = ' + str(description)) - log('Error importing libtorrent from "' + dest_path + '". Exception: ' + str(e)) - if fp: fp.close() - - # If no permission in dest_path we need to go deeper on root! - try: - sys_path = '/data/app/' - fp = '' - pathname = sys_path - dest_path = sys_path - description = '' - libtorrent = '' - LIBTORRENT_MSG = config.get_setting("libtorrent_msg", server="torrent", default='') - if not LIBTORRENT_MSG: - dialog = xbmcgui.Dialog() - dialog.notification('KoD: '+ config.get_localizad_string(70766), config.get_localizad_string(70767), time=15000) - config.set_setting("libtorrent_msg", 'OK', server="torrent") - - from core import scrapertools - kodi_app = xbmc.translatePath('special://xbmc') - kodi_app = scrapertools.find_single_match(kodi_app, '\/\w+\/\w+\/.*?\/(.*?)\/') - kodi_dir = '%s-1' % kodi_app - dir_list = '' - try: - dir_list = os.listdir(sys_path).split() - except: - import subprocess - command = ['su', '-c', 'ls', sys_path] - p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - output_cmd, error_cmd = p.communicate() - log('Comando ROOT: %s' % str(command)) - dir_list = output_cmd.split() - - if not dir_list: - raise - - for file in dir_list: - if kodi_app in file: - kodi_dir = file - break - - bits = sys.maxsize > 2 ** 32 and "64" or "" - dest_path = os.path.join(sys_path, kodi_dir, 'lib', platform['arch'] + bits) - dest_path=lm.android_workaround(new_dest_path=dest_path) - sys.path.insert(0, dest_path) - dll_path=os.path.join(dest_path, 'liblibtorrent.so') - log('NEW CDLL path = ' + dll_path) - if not PY3: - liblibtorrent=CDLL(dll_path) - log('CDLL = ' + str(liblibtorrent)) - path_list = [dest_path] - log('path_list = ' + str(path_list)) - fp, pathname, description = imp.find_module('libtorrent', path_list) - try: - libtorrent = imp.load_module('libtorrent', fp, pathname, description) - finally: - if fp: fp.close() - else: - import libtorrent - - except Exception as e: - log('ERROR Comando ROOT: %s, %s' % (str(command), str(dest_path))) - if not PY3: - e = unicode(str(e), "utf8", errors="replace").encode("utf8") - log(traceback.format_exc(1)) - log('fp = ' + str(fp)) - log('pathname = ' + str(pathname)) - log('description = ' + str(description)) - log('Error importing libtorrent from "' + dest_path + '". Exception: ' + str(e)) - if fp: fp.close() - - if libtorrent: - config.set_setting("libtorrent_path", dest_path, server="torrent") - config.set_setting("libtorrent_error", "", server="torrent") - log('Imported libtorrent v' + libtorrent.version + ' from "' + dest_path + '"') - -except Exception as e: - if not PY3: - e = unicode(str(e), "utf8", errors="replace").encode("utf8") - config.set_setting("libtorrent_path", "", server="torrent") - config.set_setting("libtorrent_error", str(e), server="torrent") - log('Error importing libtorrent from "' + dest_path + '". Exception: ' + str(e)) - if fp: fp.close() - - -def get_libtorrent(): - return libtorrent diff --git a/lib/python_libtorrent/python_libtorrent/functions.py b/lib/python_libtorrent/python_libtorrent/functions.py deleted file mode 100644 index da479591..00000000 --- a/lib/python_libtorrent/python_libtorrent/functions.py +++ /dev/null @@ -1,187 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' -from __future__ import absolute_import -#from builtins import str -import sys -PY3 = False -if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int -from builtins import object - -import os -import xbmc, xbmcgui, xbmcaddon - -from .net import HTTP -from core import filetools ### Alfa - -__libbaseurl__ = "https://github.com/DiMartinoXBMC/script.module.libtorrent/raw/master/python_libtorrent" -#__settings__ = xbmcaddon.Addon(id='script.module.libtorrent') -#__version__ = __settings__.getAddonInfo('version') -#__plugin__ = __settings__.getAddonInfo('name') + " v." + __version__ -#__icon__=os.path.join(xbmc.translatePath('special://home'), 'addons', -# 'script.module.libtorrent', 'icon.png') -#__settings__ = xbmcaddon.Addon(id='plugin.video.kod') ### Alfa -__version__ = '1.1.17' ### Alfa -__plugin__ = "python-libtorrent v.1.1.7" ### Alfa -__icon__=os.path.join(xbmc.translatePath('special://home'), 'addons', - 'plugin.video.kod', 'icon.png') ### Alfa -#__language__ = __settings__.getLocalizedString ### Alfa - -#from python_libtorrent.platform_pulsar import get_platform, get_libname ### Alfa -from lib.python_libtorrent.python_libtorrent.platform_pulsar import get_platform, get_libname ### Alfa - -def log(msg): - try: - xbmc.log("### [%s]: %s" % (__plugin__,msg,), level=xbmc.LOGNOTICE ) - except UnicodeEncodeError: - xbmc.log("### [%s]: %s" % (__plugin__,msg.encode("utf-8", "ignore"),), level=xbmc.LOGNOTICE ) - except: - xbmc.log("### [%s]: %s" % (__plugin__,'ERROR LOG',), level=xbmc.LOGNOTICE ) - -def getSettingAsBool(setting): - __settings__ = xbmcaddon.Addon(id='plugin.video.kod') ### Alfa - return __settings__.getSetting(setting).lower() == "true" - -class LibraryManager(object): - def __init__(self, dest_path, platform): - self.dest_path = dest_path - self.platform = platform - self.root=os.path.dirname(os.path.dirname(__file__)) - ver1, ver2, ver3 = platform['version'].split('.') ### Alfa: resto método - try: - ver1 = int(ver1) - ver2 = int(ver2) - except: - pass - if ver1 >= 1 and ver2 >= 2: - global __libbaseurl__ - #__libbaseurl__ = 'https://github.com/alfa-addon/alfa-repo/raw/master/downloads/libtorrent' - __libbaseurl__ = 'https://bitbucket.org/alfa_addon/alfa-repo/raw/master/downloads/libtorrent' - - def check_exist(self): - for libname in get_libname(self.platform): - if not filetools.exists(os.path.join(self.dest_path,libname)): - return False - return True - - def check_update(self): - need_update=False - for libname in get_libname(self.platform): - if libname!='liblibtorrent.so': - self.libpath = os.path.join(self.dest_path, libname) - self.sizepath=os.path.join(self.root, self.platform['system'], self.platform['version'], libname+'.size.txt') - size=str(os.path.getsize(self.libpath)) - size_old=open( self.sizepath, "r" ).read() - if size_old!=size: - need_update=True - return need_update - - def update(self): - if self.check_update(): - for libname in get_libname(self.platform): - self.libpath = os.path.join(self.dest_path, libname) - filetools.remove(self.libpath) - self.download() - - def download(self): - __settings__ = xbmcaddon.Addon(id='plugin.video.kod') ### Alfa - filetools.mkdir(self.dest_path) - for libname in get_libname(self.platform): - dest = os.path.join(self.dest_path, libname) - log("try to fetch %s" % libname) - url = "%s/%s/%s/%s.zip" % (__libbaseurl__, self.platform['system'], self.platform['version'], libname) - if libname!='liblibtorrent.so': - try: - self.http = HTTP() - self.http.fetch(url, download=dest + ".zip", progress=False) ### Alfa - log("%s -> %s" % (url, dest)) - xbmc.executebuiltin('XBMC.Extract("%s.zip","%s")' % (dest, self.dest_path), True) - filetools.remove(dest + ".zip") - except: - text = 'Failed download %s!' % libname - xbmc.executebuiltin("XBMC.Notification(%s,%s,%s,%s)" % (__plugin__,text,750,__icon__)) - else: - filetools.copy(os.path.join(self.dest_path, 'libtorrent.so'), dest, silent=True) ### Alfa - dest_alfa = os.path.join(xbmc.translatePath(__settings__.getAddonInfo('Path')), \ - 'lib', libname) ### Alfa - filetools.copy(dest, dest_alfa, silent=True) ### Alfa - dest_alfa = os.path.join(xbmc.translatePath(__settings__.getAddonInfo('Profile')), \ - 'custom_code', 'lib', libname) ### Alfa - filetools.copy(dest, dest_alfa, silent=True) ### Alfa - return True - - def android_workaround(self, new_dest_path): ### Alfa (entera) - import subprocess - - for libname in get_libname(self.platform): - libpath=os.path.join(self.dest_path, libname) - size=str(os.path.getsize(libpath)) - new_libpath=os.path.join(new_dest_path, libname) - - if filetools.exists(new_libpath): - new_size=str(os.path.getsize(new_libpath)) - if size != new_size: - filetools.remove(new_libpath) - if filetools.exists(new_libpath): - try: - command = ['su', '-c', 'rm', '%s' % new_libpath] - p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - output_cmd, error_cmd = p.communicate() - log('Comando ROOT: %s' % str(command)) - except: - log('Sin PERMISOS ROOT: %s' % str(command)) - - if not filetools.exists(new_libpath): - log('Deleted: (%s) %s -> (%s) %s' %(size, libpath, new_size, new_libpath)) - - if not filetools.exists(new_libpath): - filetools.copy(libpath, new_libpath, silent=True) ### ALFA - log('Copying... %s -> %s' %(libpath, new_libpath)) - - if not filetools.exists(new_libpath): - try: - command = ['su', '-c', 'cp', '%s' % libpath, '%s' % new_libpath] - p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - output_cmd, error_cmd = p.communicate() - log('Comando ROOT: %s' % str(command)) - - command = ['su', '-c', 'chmod', '777', '%s' % new_libpath] - p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - output_cmd, error_cmd = p.communicate() - log('Comando ROOT: %s' % str(command)) - except: - log('Sin PERMISOS ROOT: %s' % str(command)) - - if not filetools.exists(new_libpath): - log('ROOT Copy Failed!') - - else: - command = ['chmod', '777', '%s' % new_libpath] - p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - output_cmd, error_cmd = p.communicate() - log('Comando: %s' % str(command)) - else: - log('Module exists. Not copied... %s' % new_libpath) ### ALFA - - return new_dest_path diff --git a/lib/python_libtorrent/python_libtorrent/net.py b/lib/python_libtorrent/python_libtorrent/net.py deleted file mode 100644 index 68519899..00000000 --- a/lib/python_libtorrent/python_libtorrent/net.py +++ /dev/null @@ -1,332 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' -from __future__ import division -from future import standard_library -standard_library.install_aliases() -#from builtins import str -import sys -PY3 = False -if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int -from builtins import object -from past.utils import old_div - -import os -import time -import re -import urllib.request, urllib.parse, urllib.error -# import http.cookiejar -import future.backports.http.cookiejar as http_cookiejar -import base64 - -import xbmc -import xbmcgui -#import xbmcvfs ### Alfa - -RE = { - 'content-disposition': re.compile('attachment;\sfilename="*([^"\s]+)"|\s') -} - -# ################################ -# -# HTTP -# -# ################################ - -class HTTP(object): - def __init__(self): - #self._dirname = xbmc.translatePath('special://temp') ### Alfa - #for subdir in ('xbmcup', 'script.module.libtorrent'): ### Alfa - self._dirname = os.path.dirname(os.path.dirname(__file__)) ### Alfa - #for subdir in ('lib', 'python_libtorrent'): ### Alfa - # self._dirname = os.path.join(self._dirname, subdir) ### Alfa - # if not xbmcvfs.exists(self._dirname): ### Alfa - # xbmcvfs.mkdir(self._dirname) ### Alfa - - def fetch(self, request, **kwargs): - self.con, self.fd, self.progress, self.cookies, self.request = None, None, None, None, request - - if not isinstance(self.request, HTTPRequest): - self.request = HTTPRequest(url=self.request, **kwargs) - - self.response = HTTPResponse(self.request) - - xbmc.log('XBMCup: HTTP: request: ' + str(self.request), xbmc.LOGDEBUG) - - try: - self._opener() - self._fetch() - except Exception as e: - xbmc.log('XBMCup: HTTP: ' + str(e), xbmc.LOGERROR) - if isinstance(e, urllib.error.HTTPError): - self.response.code = e.code - self.response.error = e - else: - self.response.code = 200 - - if self.fd: - self.fd.close() - self.fd = None - - if self.con: - self.con.close() - self.con = None - - if self.progress: - self.progress.close() - self.progress = None - - self.response.time = time.time() - self.response.time - - xbmc.log('XBMCup: HTTP: response: ' + str(self.response), xbmc.LOGDEBUG) - - return self.response - - def _opener(self): - - build = [urllib.request.HTTPHandler()] - - if self.request.redirect: - build.append(urllib.request.HTTPRedirectHandler()) - - if self.request.proxy_host and self.request.proxy_port: - build.append(urllib.request.ProxyHandler( - {self.request.proxy_protocol: self.request.proxy_host + ':' + str(self.request.proxy_port)})) - - if self.request.proxy_username: - proxy_auth_handler = urllib.request.ProxyBasicAuthHandler() - proxy_auth_handler.add_password('realm', 'uri', self.request.proxy_username, - self.request.proxy_password) - build.append(proxy_auth_handler) - - if self.request.cookies: - self.request.cookies = os.path.join(self._dirname, self.request.cookies) - self.cookies = http_cookiejar.MozillaCookieJar() - if os.path.isfile(self.request.cookies): - self.cookies.load(self.request.cookies) - build.append(urllib.request.HTTPCookieProcessor(self.cookies)) - - urllib.request.install_opener(urllib.request.build_opener(*build)) - - def _fetch(self): - params = {} if self.request.params is None else self.request.params - - if self.request.upload: - boundary, upload = self._upload(self.request.upload, params) - req = urllib.request.Request(self.request.url) - req.add_data(upload) - else: - - if self.request.method == 'POST': - if isinstance(params, dict) or isinstance(params, list): - params = urllib.parse.urlencode(params) - req = urllib.request.Request(self.request.url, params) - else: - req = urllib.request.Request(self.request.url) - - for key, value in self.request.headers.items(): - req.add_header(key, value) - - if self.request.upload: - req.add_header('Content-type', 'multipart/form-data; boundary=%s' % boundary) - req.add_header('Content-length', len(upload)) - - if self.request.auth_username and self.request.auth_password: - req.add_header('Authorization', 'Basic %s' % base64.encodestring( - ':'.join([self.request.auth_username, self.request.auth_password])).strip()) - - self.con = urllib.request.urlopen(req, timeout=self.request.timeout) - # self.con = urllib2.urlopen(req) - self.response.headers = self._headers(self.con.info()) - - if self.request.download: - self._download() - else: - self.response.body = self.con.read() - - if self.request.cookies: - self.cookies.save(self.request.cookies) - - def _download(self): - fd = open(self.request.download, 'wb') - if self.request.progress: - self.progress = xbmcgui.DialogProgress() - self.progress.create(u'Download') - - bs = 1024 * 8 - size = -1 - read = 0 - name = None - - if self.request.progress: - if 'content-length' in self.response.headers: - size = int(self.response.headers['content-length']) - if 'content-disposition' in self.response.headers: - r = RE['content-disposition'].search(self.response.headers['content-disposition']) - if r: - name = urllib.parse.unquote(r.group(1)) - - while 1: - buf = self.con.read(bs) - if not buf: - break - read += len(buf) - fd.write(buf) - - if self.request.progress: - self.progress.update(*self._progress(read, size, name)) - - self.response.filename = self.request.download - - def _upload(self, upload, params): - import mimetools - import itertools - - res = [] - boundary = mimetools.choose_boundary() - part_boundary = '--' + boundary - - if params: - for name, value in params.items(): - res.append([part_boundary, 'Content-Disposition: form-data; name="%s"' % name, '', value]) - - if isinstance(upload, dict): - upload = [upload] - - for obj in upload: - name = obj.get('name') - filename = obj.get('filename', 'default') - content_type = obj.get('content-type') - try: - body = obj['body'].read() - except AttributeError: - body = obj['body'] - - if content_type: - res.append([part_boundary, - 'Content-Disposition: file; name="%s"; filename="%s"' % (name, urllib.parse.quote(filename)), - 'Content-Type: %s' % content_type, '', body]) - else: - res.append([part_boundary, - 'Content-Disposition: file; name="%s"; filename="%s"' % (name, urllib.parse.quote(filename)), '', - body]) - - result = list(itertools.chain(*res)) - result.append('--' + boundary + '--') - result.append('') - return boundary, '\r\n'.join(result) - - def _headers(self, raw): - headers = {} - for line in str(raw).split('\n'): - pair = line.split(':', 1) - if len(pair) == 2: - tag = pair[0].lower().strip() - value = pair[1].strip() - if tag and value: - headers[tag] = value - return headers - - def _progress(self, read, size, name): - res = [] - if size < 0: - res.append(1) - else: - res.append(int(float(read) / (float(size) / 100.0))) - if name: - res.append(u'File: ' + name) - if size != -1: - res.append(u'Size: ' + self._human(size)) - res.append(u'Load: ' + self._human(read)) - return res - - def _human(self, size): - human = None - for h, f in (('KB', 1024), ('MB', 1024 * 1024), ('GB', 1024 * 1024 * 1024), ('TB', 1024 * 1024 * 1024 * 1024)): - if old_div(size, f) > 0: - human = h - factor = f - else: - break - if human is None: - return (u'%10.1f %s' % (size, u'byte')).replace(u'.0', u'') - else: - return u'%10.2f %s' % (float(size) / float(factor), human) - - -class HTTPRequest(object): - def __init__(self, url, method='GET', headers=None, cookies=None, params=None, upload=None, download=None, - progress=False, auth_username=None, auth_password=None, proxy_protocol='http', proxy_host=None, - proxy_port=None, proxy_username=None, proxy_password='', timeout=20.0, redirect=True, gzip=False): - if headers is None: - headers = {} - - self.url = url - self.method = method - self.headers = headers - - self.cookies = cookies - - self.params = params - - self.upload = upload - self.download = download - self.progress = progress - - self.auth_username = auth_username - self.auth_password = auth_password - - self.proxy_protocol = proxy_protocol - self.proxy_host = proxy_host - self.proxy_port = proxy_port - self.proxy_username = proxy_username - self.proxy_password = proxy_password - - self.timeout = timeout - - self.redirect = redirect - - self.gzip = gzip - - def __repr__(self): - return '%s(%s)' % (self.__class__.__name__, ','.join('%s=%r' % i for i in self.__dict__.items())) - - -class HTTPResponse(object): - def __init__(self, request): - self.request = request - self.code = None - self.headers = {} - self.error = None - self.body = None - self.filename = None - self.time = time.time() - - def __repr__(self): - args = ','.join('%s=%r' % i for i in self.__dict__.items() if i[0] != 'body') - if self.body: - args += ',body=<data>' - else: - args += ',body=None' - return '%s(%s)' % (self.__class__.__name__, args) diff --git a/lib/python_libtorrent/python_libtorrent/platform_pulsar.py b/lib/python_libtorrent/python_libtorrent/platform_pulsar.py deleted file mode 100644 index 1153b44b..00000000 --- a/lib/python_libtorrent/python_libtorrent/platform_pulsar.py +++ /dev/null @@ -1,208 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' -from __future__ import print_function -import sys -PY3 = False -if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int - -import os -try: - import xbmc, xbmcaddon - #__settings__ = xbmcaddon.Addon(id='script.module.libtorrent') ### Alfa - #__version__ = __settings__.getAddonInfo('version') ### Alfa - #__plugin__ = __settings__.getAddonInfo('name') + " v." + __version__ ### Alfa - __settings__ = xbmcaddon.Addon(id='plugin.video.kod') ### Alfa - __version__ = '1.1.17' ### Alfa - __plugin__ = "python-libtorrent v.1.1.7" ### Alfa -except: - __plugin__ = "python-libtorrent v.1.1.7" ### Alfa - pass - -def log(msg): - try: - xbmc.log("### [%s]: %s" % (__plugin__,msg,), level=xbmc.LOGNOTICE ) - except UnicodeEncodeError: - xbmc.log("### [%s]: %s" % (__plugin__,msg.encode("utf-8", "ignore"),), level=xbmc.LOGNOTICE ) - except: - try: - xbmc.log("### [%s]: %s" % (__plugin__,'ERROR LOG',), level=xbmc.LOGNOTICE ) - except: - print(msg) - -def get_libname(platform): - libname=[] - if platform['system'] in ['darwin', 'linux_x86', 'linux_arm', 'linux_armv6', - 'linux_armv7', 'linux_x86_64', 'ios_arm', - 'linux_mipsel_ucs2', 'linux_mipsel_ucs4', 'linux_aarch64_ucs2', 'linux_aarch64_ucs4']: - libname=['libtorrent.so'] - elif platform['system'] in ['windows', 'windows_x64']: ### Alfa - libname=['libtorrent.pyd'] - elif platform['system'] in ['android_armv7', 'android_x86']: - libname=['libtorrent.so', 'liblibtorrent.so'] - return libname - -def get_platform(): - #__settings__ = xbmcaddon.Addon(id='script.module.libtorrent') ### Alfa - #__version__ = __settings__.getAddonInfo('version') ### Alfa - #__plugin__ = __settings__.getAddonInfo('name') + " v." + __version__ ### Alfa - __settings__ = xbmcaddon.Addon(id='plugin.video.kod') ### Alfa - __version__ = '1.1.17' ### Alfa - __plugin__ = "python-libtorrent v.1.1.7" ### Alfa - __language__ = __settings__.getLocalizedString - - if __settings__.getSetting('custom_system').lower() == "true": - system = int(__settings__.getSetting('set_system')) - log('USE CUSTOM SYSTEM: '+__language__(1100+system)) - - ret={} - - if system==0: - ret["os"] = "windows" - ret["arch"] = "x86" - elif system==1: - ret["os"] = "linux" - ret["arch"] = "x86" - elif system==2: - ret["os"] = "linux" - ret["arch"] = "x64" - elif system==3: - ret["os"] = "linux" - ret["arch"] = "armv7" - elif system==4: - ret["os"] = "linux" - ret["arch"] = "armv6" - elif system==5: - ret["os"] = "android" - ret["arch"] = "arm" - elif system==6: - ret["os"] = "android" - ret["arch"] = "x86" - elif system==7: - ret["os"] = "darwin" - ret["arch"] = "x64" - elif system==8: - ret["os"] = "ios" - ret["arch"] = "arm" - elif system==9: - ret["os"] = "ios" - ret["arch"] = "arm" - elif system==10: - ret["os"] = "linux" - ret["arch"] = "mipsel_ucs2" - elif system==11: - ret["os"] = "linux" - ret["arch"] = "mipsel_ucs4" - elif system == 12: - ret["os"] = "linux" - ret["arch"] = "linux_aarch64_ucs2" - elif system == 13: - ret["os"] = "linux" - ret["arch"] = "linux_aarch64_ucs4" - else: - - ret = { - "arch": sys.maxsize > 2 ** 32 and "x64" or "x86", - } - if xbmc.getCondVisibility("system.platform.android"): - ret["os"] = "android" - if "arm" in os.uname()[4] or "aarch64" in os.uname()[4]: - ret["arch"] = "arm" - elif xbmc.getCondVisibility("system.platform.linux"): - ret["os"] = "linux" - uname=os.uname()[4] - if "arm" in uname: - if "armv7" in uname: - ret["arch"] = "armv7" - else: - ret["arch"] = "armv6" - elif "mips" in uname: - if sys.maxunicode > 65536: - ret["arch"] = 'mipsel_ucs4' - else: - ret["arch"] = 'mipsel_ucs2' - elif "aarch64" in uname: - if sys.maxsize > 2147483647: #is_64bit_system - if sys.maxunicode > 65536: - ret["arch"] = 'aarch64_ucs4' - else: - ret["arch"] = 'aarch64_ucs2' - else: - ret["arch"] = "armv7" #32-bit userspace - elif xbmc.getCondVisibility("system.platform.windows"): - ret["os"] = "windows" - elif xbmc.getCondVisibility("system.platform.osx"): - ret["os"] = "darwin" - elif xbmc.getCondVisibility("system.platform.ios"): - ret["os"] = "ios" - ret["arch"] = "arm" - - ret=get_system(ret) - return ret - -def get_system(ret): - ret["system"] = '' - ret["message"] = ['', ''] - - if ret["os"] == 'windows' and ret["arch"] != "x64": ### Alfa - ret["system"] = 'windows' - ret["message"] = ['Windows has static compiled python-libtorrent included.', - 'You should install "script.module.libtorrent" from "MyShows.me Kodi Repo"'] - elif ret["os"] == 'windows' and ret["arch"] == "x64": ### Alfa - ret["system"] = 'windows_x64' ### Alfa - ret["message"] = ['Windows x64 has static compiled python-libtorrent included.', ### Alfa - 'You should install "script.module.libtorrent" from "MyShows.me Kodi Repo"'] ### Alfa - elif ret["os"] == "linux" and ret["arch"] == "x64": - ret["system"] = 'linux_x86_64' - ret["message"] = ['Linux x64 has not static compiled python-libtorrent included.', - 'You should install it by "sudo apt-get install python-libtorrent"'] - elif ret["os"] == "linux" and ret["arch"] == "x86": - ret["system"] = 'linux_x86' - ret["message"] = ['Linux has static compiled python-libtorrent included but it didn\'t work.', - 'You should install it by "sudo apt-get install python-libtorrent"'] - elif ret["os"] == "linux" and "aarch64" in ret["arch"]: - ret["system"] = 'linux_' + ret["arch"] - ret["message"] = ['Linux has static compiled python-libtorrent included but it didn\'t work.', - 'You should install it by "sudo apt-get install python-libtorrent"'] - elif ret["os"] == "linux" and ("arm" or "mips" in ret["arch"]): - ret["system"] = 'linux_'+ret["arch"] - ret["message"] = ['As far as I know you can compile python-libtorrent for ARMv6-7.', - 'You should search for "OneEvil\'s OpenELEC libtorrent" or use Ace Stream.'] - elif ret["os"] == "android": - if ret["arch"]=='arm': - ret["system"] = 'android_armv7' - else: - ret["system"] = 'android_x86' - ret["message"] = ['Please contact DiMartino on kodi.tv forum. We compiled python-libtorrent for Android,', - 'but we need your help with some tests on different processors.'] - elif ret["os"] == "darwin": - ret["system"] = 'darwin' - ret["message"] = ['It is possible to compile python-libtorrent for OS X.', - 'But you would have to do it by yourself, there is some info on github.com.'] - elif ret["os"] == "ios" and ret["arch"] == "arm": - ret["system"] = 'ios_arm' - ret["message"] = ['It is probably NOT possible to compile python-libtorrent for iOS.', - 'But you can use torrent-client control functions.'] - - return ret \ No newline at end of file diff --git a/lib/python_libtorrent/windows/0.16.19/__init__.py b/lib/python_libtorrent/windows/0.16.19/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/windows/0.16.19/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/windows/0.16.19/libtorrent.pyd.size.txt b/lib/python_libtorrent/windows/0.16.19/libtorrent.pyd.size.txt deleted file mode 100644 index f7b7ca56..00000000 --- a/lib/python_libtorrent/windows/0.16.19/libtorrent.pyd.size.txt +++ /dev/null @@ -1 +0,0 @@ -2363904 \ No newline at end of file diff --git a/lib/python_libtorrent/windows/1.0.6/__init__.py b/lib/python_libtorrent/windows/1.0.6/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/windows/1.0.6/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/windows/1.0.6/libtorrent.pyd.size.txt b/lib/python_libtorrent/windows/1.0.6/libtorrent.pyd.size.txt deleted file mode 100644 index 3c2fa282..00000000 --- a/lib/python_libtorrent/windows/1.0.6/libtorrent.pyd.size.txt +++ /dev/null @@ -1 +0,0 @@ -2281472 \ No newline at end of file diff --git a/lib/python_libtorrent/windows/1.0.8/__init__.py b/lib/python_libtorrent/windows/1.0.8/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/windows/1.0.8/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/windows/1.0.8/libtorrent.pyd.size.txt b/lib/python_libtorrent/windows/1.0.8/libtorrent.pyd.size.txt deleted file mode 100644 index d073a9fc..00000000 --- a/lib/python_libtorrent/windows/1.0.8/libtorrent.pyd.size.txt +++ /dev/null @@ -1 +0,0 @@ -2426368 \ No newline at end of file diff --git a/lib/python_libtorrent/windows/1.0.9/__init__.py b/lib/python_libtorrent/windows/1.0.9/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/windows/1.0.9/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/windows/1.0.9/libtorrent.pyd.size.txt b/lib/python_libtorrent/windows/1.0.9/libtorrent.pyd.size.txt deleted file mode 100644 index 117a8649..00000000 --- a/lib/python_libtorrent/windows/1.0.9/libtorrent.pyd.size.txt +++ /dev/null @@ -1 +0,0 @@ -2427392 \ No newline at end of file diff --git a/lib/python_libtorrent/windows/1.1.1/__init__.py b/lib/python_libtorrent/windows/1.1.1/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/windows/1.1.1/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/windows/1.1.1/libtorrent.pyd.size.txt b/lib/python_libtorrent/windows/1.1.1/libtorrent.pyd.size.txt deleted file mode 100644 index 9f5f81bd..00000000 --- a/lib/python_libtorrent/windows/1.1.1/libtorrent.pyd.size.txt +++ /dev/null @@ -1 +0,0 @@ -2671616 \ No newline at end of file diff --git a/lib/python_libtorrent/windows/1.2.2/__init__.py b/lib/python_libtorrent/windows/1.2.2/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/windows/1.2.2/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/windows/1.2.2/libtorrent.pyd.size.txt b/lib/python_libtorrent/windows/1.2.2/libtorrent.pyd.size.txt deleted file mode 100644 index 1b2e3d2c..00000000 --- a/lib/python_libtorrent/windows/1.2.2/libtorrent.pyd.size.txt +++ /dev/null @@ -1 +0,0 @@ -2996736 \ No newline at end of file diff --git a/lib/python_libtorrent/windows/1.2.3/__init__.py b/lib/python_libtorrent/windows/1.2.3/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/windows/1.2.3/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/windows/1.2.3/libtorrent.pyd.size.txt b/lib/python_libtorrent/windows/1.2.3/libtorrent.pyd.size.txt deleted file mode 100644 index 8d654ae7..00000000 --- a/lib/python_libtorrent/windows/1.2.3/libtorrent.pyd.size.txt +++ /dev/null @@ -1 +0,0 @@ -3049472 \ No newline at end of file diff --git a/lib/python_libtorrent/windows/__init__.py b/lib/python_libtorrent/windows/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/windows/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/windows_x64/1.2.2/__init__.py b/lib/python_libtorrent/windows_x64/1.2.2/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/windows_x64/1.2.2/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/windows_x64/1.2.2/libtorrent.pyd b/lib/python_libtorrent/windows_x64/1.2.2/libtorrent.pyd deleted file mode 100644 index eb0bf80f43d68a295063bbe65b8bbb2ead73252f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4290048 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%0DllPz>#$51AmZ@kRhMj?jxZ4nZ;6Lq*Q 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:%)gfC6ky1Y=)rwD@44;mE|3CFf&HnaQw;z{$vOPw< zRTqDUMa{i~i7Qw9$t!YIy>&jItGGY3J3BqN`WDpGtFOLgSMw9nyYXLnaa_WNPV#NK z0^okf6@M>|I$Rl?rHPxeD`Mui=&jTFLJ*@l!-9h9N2{-FQ->5x{O}`ufA$T!n{bDR zsM(v_zIE=%2j3heDj^5J=8<9*?@Y)3R%*+_sK**s3v#KEg}Khu7?)aUQtq%aK|#*c zI;xvyhctYeD<ND(Pf6ezrX_8s;lWpTI?svyycArT@bRuX=rHSJa6NFRUezib;l}B6 zmCka|am;cmj$_h^PFx(Eed0=-=e*bqqv{bN>Fk3GQ%EUGxl~8%pa31Q-%Bsj+=;rB zKbhmWG#Hh6l`p4Mo6T1}MYUNP2bo%8xJJx8$JGhGxUMb*cNO)S{m^%xkBBe#-RJ79 zi>kZL!)h)vV6%aH?QQMpQBuie9$3i<Fq=>qwXwdplIs+!<T%TfTt~i;7S-i3u4GMH zfiGp@^3g}*O2$z}RC0S%G96_^HDV*v@6aq)@|TT@SF(j%CY3z+rM{?T)Ug~b8&kZ7 z-RaTVZcI<|=YwMK7uHEnjqw><DXy*d+}joHt{ke<l#m?zM&~s7XU9*sG&?4T+`CG# z9{cLnHkc=Hj}xb6*Zpp3yH>B%`wO~uiaWf5J@-zPR9CJYrcy)l*uZ%^cli<q@=|cp zOwHa=_gqMWZ`OU}9UG4oE6JID%GD>D|N2q1_6^or5nm@)b0$kljJ8rz9(N|kFs6?7 ziKNtV(tQ;V75bhX#s|h&aser5Y22GZK|jMK-*4!=U0rY0Ro+&0nNPK2sDt~@wb+%y z1TIrLT<95O%<I@t<as>|^LiwPX&ICy^STUE3-dZ(2XQVmSj`4e`iC>AIdt-WIabnz zS-sV4v^S@xw9d)wr1Bmget8E`d^Pmo#YQTfWHk_3Wi}H2V)RCI4O||8q<@5Vcf22w zbbyWzzK<KFi}k64YzXT2UG++YoU7i#<9wQcT>G`!)W>*_5(f=~a9!dD4zxFdEycuA zDXs$>%j1Xazkl&Xy~O(a6aV?xl#5+%T^N+;&_WK}b#2Yn9t+tY@pbT^`dc^TRK$j9 zNG>wwMSQ(=P)N?8ko|*l&y*UJNRX{V^5&AIy|}hIa!cJhjm_AOp^2_-*!xUGELSUq zNbUtCsXoVt<PL{#Ng=t3x#vseUMQ0kvNb6rC(%9W5I#SY7?OkODSwdTZmG=25te<k z+=evjKc62M6^{5rnWeMw$F+mDW!IpPwn!6i=7wZ7N!&;T61hk!>(#9Tl3V9xRWee_ z4B0x1ibY!K?CNZx8io3LijEz}B)Q*fFrJ3vv9|6?b8zbrl)bt1tF3OG*+LDH<k}67 zBNB(?u6d?Z5LhME-=F=)>fx2!yF(eAc<U5V&eh5!4#`=E#?vw1O{{;ktvh@U^^U}l z-M3D2RVBHOC+1!RbPv@YR~)D3UMMvvss6#lTR#p;3OSm4Aw;U&9Uh5#%}shWZ$LJ; zNA79D9Ycd{3juQXpyZG|B;*k)#1lUj<&Wx=O<Tl+K>E$DNZ%UbaojF7su%LyeeBKt zNZBSS1CjDe_?yGAWsZB7Z4fWQxU(Dn`j!5N*7|PSKpW6_`iNWyv}WLv&nZbR52rj% zDg4K_5Iv~vL5(3QzaG>!NmQ~Q()j+&`1O#sm421I^AuOP;=?F61vei&j3TD+p++7W zsIQ4Bt#@aRRsTsBE*c#6jYy<_6Yc+$BpNV#FuZnMteV<-cUBqRhQC;T0}ZOw)_dHE z7)p8Av3|;NJ~*=$1&>lt!Eq-z>rs{W<;n2HR(5CP#ivu9(HEPfLThM;h6e+={sRwp zZBq`8eF&qlDc?-qDzH1zmGC?Oqm=rz$r?o~^(rlP3$*J)Au)!3QHSIO?f$qm?*3SC zQV4FozWU&3ZSA2(73AitYSEPJ#H|aTrtxmjn3eS*m4ULRJ)kTnmO#ZVVsxlQPbe|1 z)X^4V(S%EEo;CwBCFs%LQ1i!(#{!2jv&=EQ&gqyB3{0_gopDCh-DPzm&!RM?#c1b` zVpZXe`uIcxp5tP)0TcNMs<98rYcrF)&H~PR<$EJ<9qW1P9_PFry?HNTYmm9ixg~yP zg~yh~4!`1K(l|+ur%6}?;jN`>+OflOQ0@k{B<xPyHyyIOJ4b52VhXprd*B+hPpdZ( z&zSTV095%3v}>Gvx*Ct8{MKEx>4!g<_;LkIT)1#1q_`2NE_`qrmx-${>Ti;vXULmm z3B?xDMbDsdz2vi<#+pcf+y=MtzEuvN;Jt>`4_zhksAoT}kYU=0hd_khSds$2BhOVP zhd0*(m&dO(Fr%KbmH0=MyZ;bX>i_?8d;ZVM<$La8^_*C&o_UqY)vRgfi&b-s>f&lX zeNd+xV>D|_@n$Vi&2&Fxw6E22&jl!V$p43O*U&+Gy;~W4uO0Zm=esgMxnqBCxyAP= z^#ky@gT&1@M(OnA$Z2$k>q^ElQ5J`hn8ZdlryDiwn5{^m=i<qcc(dRtK)h|oTb6RO zOpD1ltaDBw&)7~_s9<<6PvnQuz{&@qeYO(m)>YpsGrRWSozQ3JHwn`0Rj_-Cjf;n| zak;W4EdXI&`5fBCgpG8*mo{u>#j%1nRB|$(BnB$hXK^VmY!K|%exU~_t~|_UTEP+E zceaa+!-dv&=ZvorExp$fmu=FYng$J2U7@vTpKjy4hbcpNo-4FmE2aD+O@rPE#}4=9 z%CwQXy(J#Q+wMTu7USCGh^OSjtbd_08o&sCTiFU9*YEKbEj^t|Hf3@v)gPjdXe(bL z=25;vh^KhAwUAojkg7o!7t%GWxIfnhnfi0GqVCUTD26|~plg-bA4(Q~=D`Sxne#gQ z@nGwb{Fz3X+{*AVXkw@GE@B?Vfsp)}45_^y(4YS1{_Km={aFdc@Mi;bZ8A(b;wf4D z2^W8CS8=ehh3?N7%H&pZyWAsxMj_@=-attHWI}5H8XTy84h%G{pI<BJ{`>&N@aH^q z?K(_3;wf4D83!XM=6*NS&r)nvQvEEWOm1Z^jRmK&2r-ZHIYRPhF{Ji<Kz|a={h5he z+<%5cG5i@zrUtM-lq~*S8o>ViK>k$L{b@;=+)7RHrwL*nr71%4rx~R7&7T6*&l;FA z>CZKgi~YGDS>#VyGIbcH9PyMa{$z+hE6Ja!Z%X~-Q6{&tycyTeR>VBYHiYEQc1Z21 zfd14p_ooqZu|GB_M*UPFQ%UR(C5u1#uTa^xKI!o1=4kP!AcFnL<qwJ~2NClqhY*rK zhat7k1_i30*)U~NKhHj_`%@i?;ZI%Y+FF=$#8a~P(?<M>8U=p_>HcUkzHC`MzRvLY z`cWTWXK8#z1oS7^+@G69{TwM)Kc}gFV%Z-`7JpW}%=NRQ1^hXhCH1p_GP#v0ne5NU zh<TJx5K=|XgVf#`7^r?m!jwt<EJZGEuPIQB`k76pK7c7lJSB@i)x@9i-@>2vx<6@@ z$*mj<<N2^7VjiUvLh>gCQv1(<K>nQWZ|YAA<YIrKpcwwtBvYa64<(B~GhhV8xc9-I z^_fyXr=<T}Ys~%mIQO6L5fbnO^`Dml`qRbSpFzmQ{v<;&{OLlbGGWRQPs!rXy?*S^ z5t^TC>;6PiCj8CvQQThT5c4PxAtZmoA+>K`;riiq6&^t1^37YOIPTRCSIX0k8ybfy zRry4L9Z&n{LWw6LhwLsVT|*1^tFDJ>{Zgm!5!|aHW@}sl7vJb8I>e60lC-LNq8~h< zr|mdvM#s|rh03HwWIs^CpQ@%^<!JpatYSVS$UAl$B5@hjTJ}X2;L@o4@*wcU*YrRd z4`9aNKc&leCiZA8+Vkolg`m4Ku|*op%j?2O|I2p1m2z|X_?6pfy-B%SlK;qZRsV87 zUuRNo`#-eY{TY6IU1sI(OZwmP<x?ioyuFGSYeVx+Udwcy_}l2kTK8M6r+KNxm-eP@ zTdd4;FBYRpW%d)QCCWV8&XnozEpw!QnQgub%yYyaSLXfRemp<=GH{vq+WuiYo&IHB zUlX{@X@6XqQT}B{n((aj$CbITmtWmpGAVNbUI4=U7-&}dy?v;mf0?RDnGGzK>9_ZS z_p~c3xN;cpX`k*)Q@O?Wv`gCB_yK)SM}Oyg&i~HV=+I(**?+e!tTt^g*29-0+)Dlu z`g>AQ!~5XM<hJ3RUc4U_9*kdX&j{cZ0fhBs06zMFzugLe>aO1ZNBZkZdyxB3ZKUqL zM;FwT*aR(xmXf#(CD1{t1WHp$Q?*yO^ColCgH3ngiWl?Z`HsV{V|S6SKe#|g!e9!$ zWWcAba&ev9o-PkECtaFI>rLZmkh5nDuFLj%`gJ+^DsRBygxobc5rlnceCC4w^3mtm z<K@E%sTw&zi)>BbX_T#&<2l%R&_D2ytvUwg;o<V?rn|JGxc=))<9%A6eR$@ax_Vmb zYAoP$Xd1>cKQ)_Qu7JhWNz;?@OZpnxB0KgU-tWX7P3l#;!r!OMmusGUbY{|aV)0U6 zenv~D6u^Ss)l=*8t;p%BB%;cl!BXyWS?X*0yLx;cjXn<(NjC?`L`=2U;5#bKwXz0% z)x+HvTMO84+>@BCqWZNqwC}vLU33IW#Lv!dkxg@^Jq)T)Vc}b6x3p>9x<^!KH`v*3 zOhg3-8ZSt7I?%E~PDdqbz@3~%k2UafG^IGP4?#ckR>4kAqn`&k-)}}gV|SqQt8|0I zr_)gdnRo_>W|nUSp<RtP%!}RIq{%n5R7d|v+}HJw4$}VHopwFk&&N>xViTfUjCOA& zS#4Jbhc{94?cyNgAhFTXp(SJjWCA2QSqF$T9PymquKTnO-CgZ^Iy>}qwaajJ$Z)mm z=j_nW)oy^Z!+?m$c7r1-bQtVvH^$jvjH}%^XNPev$3#$Z{+U9TV>0U$y8a(=R{|eZ zk@OSbNkE1S%0RdzYETr=D64`Yng9cDWJZIE;(^BX0M`R{O#~Gb91w=*D4vTh?&5t5 zUMrwTxROAG03Lv@5>%vPJmLjG#rgjK>i6bIW-zks@8d__>(^6VT~&QoS62tQGZC7} zrxm<Y!hBjmIzkD}6n7}W`z6e$6`U(!KCR$93G-<M=S!GREBJ(j`Lu%1NSIG6_=1G_ zw1NvI%%>H6O~QOyLGC7oX7XtT-;yw&R<KOMd|JU(66VtiR!W#pEBKCt`Lu!?B+RE3 zd{4rBTEQ(6=F<xPN5Xts!5RtkX$3!*FrQXXNtjP7_?3kDw1V{#=F<xPC}BRWV1tDD z%ydf?%j_`oSA2b+>9$z?zR&D%H{X_2!_Z7tMnJL#0+KI6vL+IeZ%b-qXeR6B>>%sn zteJey4xS`oKCR#YJVP`2w1R^q%%^DuacmQHd#1efz6cG?VG67Fe$DU&ZgXIl(oUu| zLQX*#>f5u~s;ksFsH@VE!PgAzp=uqQW`=ii%ZxfPgg?@D$u>UhB~h#I8QFrJxS6GX zJuIDV6cc*4dHIM8NFn0s-kwUp4crD|PwCL&r1dyy%c5yLO#4HoyH$GTg=G;>A6Fs* z(9$UXjp=s&lcP8~nU`~G!F5#{ermZvU6{dcC`LsS9AO8?fF?M)+BiD>9uA*_<HsJ3 z92`2<M=)lBj!mt9hYrKRv9Jk_SJr48cQwHwWphf>vU#1vvuui^_)egF3uVLJv^u6Q zLY19rwp`)MD}&=C_$vELJ9=8eZcW5feQ*=mV=Ox#dsbzvYgl0R)(gzh*l#hW9chna z({mO|jof2e7iMAhu}Fw`mjmbk^)CoG)2&Z&6`7%VInMz0Dl_xeGE^Mwgnm@l*V}&$ z#y*a`xlEI-M&z*L+~CJY5pE=$&A86raZJR56t1$&fmkq>b~mj%bEbkFt`iM)ND(SG zQWUF_kxY(Z7~aoF7{;@H=j-vThTqdxk)2CroHoPH4B%)RV=*_%B6i5Y=EFzWY|dE7 zykJeOx!lAurZEY*Tnur8%ghcKBjmsuSbgLfz$b7zgquOV*<ji_%U!O&>0l99vLo0r z&7$+Nmf}$dsFH1@!~}ps2u#(?d(Lv0pIBrw9~N@K`w8dq5ZSyOG7W!I*glgpWMjyG zeA(K{11Z}l4^L6H|M@MB>y_Q3T=#akPEx?ac5V~4QMi%Liy<Ra$4c8<+FI?*>w`AB zPQsa29)kNU_pWC;tWQ3xNx7diDp|Q>PL;uVi6|{l#^Q3q@=OvJlV@hBBfFwOi&^ef z=H;27j$=CPf>_e;mg8E?;H_@h)i>PG1%1x#86Yt1xh6z9;b@QFb$#d?@hH<e4`qaV zJpJefP}||X5T<q5#db{VXxzI^s;bOAO1ML*Cmv1aPFqQ(4^m`ZKPo_;N4Qn!OtM_1 z`n>^j<6Y%)K!jBsQ7s4~a~U=T+hRhWlMp+*@U=P1QSI3uV1n9OYJJ$d(+qiWm#}vm z-ktH@jCW7GtMNV>?+Uzk<Gl>;r!k8hi_M?$OE{8a=DJgD<UG=jp14GChXdQxZ)m(u z^leKxt^s<pvg%{eZ!D3?SU6CvO5&myEjd@?u237}q8BeI($UM*al|eCho|D7Sfqvn z->RE`l(;n@ZW+p^|74a;r3#MSLr_NJnp4mG%X>)lwXx`GMBhU!fF2c#-i+wkcJyh8 z792*Up7>6=K*Q&M8sQJ#aN%fxUt@#+D;j$-Vz0DgL($k`#9nI0-Vlww0<o9bv16jK zFhuiM5zWg2SUTw3&}n*R*s%{qW5*$O=V(pY!8#UG_U+v$de2cAn)5?o2n{5Ki#WYN z{Pn+S<X<}RGSvusuCn7dIq?M={)0z!21n=&3KwyT20ZKS_{X%NwOt{W;1_Ij03a|? z9shN-h$bTb1xZn*=Do&E)nGMhwRfVKj(KumVr&=Lsc=XT=^}`3Q(w?1Ukb!~8{%)U z5uGE5EW`<t+ma&rB1@2rRgcDyj0KX@Y$WY%Bx5y_u`wiC^pgR5tPT6`8e5iAwG57s z_)7IpCw{t)?`p^2;l$5MjKAKAzcVrZJSTomV*F`N{M^L&qn!A8I{pwl-}X+tj1OUt z6TfSlO+R>M89MQwARf&@OL!Z8XahuQz!lM^v=ebI8~NdgmI_s-kvQ=WImlNf#!u7n zsF_Dfd3rKzL}{Pc)KuyOzs}P&t;j*NLC61S#}9Dgw<N}AJMml$fY7gO_zWk$M#q0{ z$Jaaga*+V|AL$AXoxv6-o(l%Vzh%RhIq_UP#Kk}3#MkTiC*IU8E}HL;I)0uVKgoe_ z(D8TL_=|Ns1axL+$>6?owIHfLX0c?wjfR+JruT>a@NNu7-j<mEg#!2mkyvmVe`18? z{Z?1tZ(|i$r+FGH@j_-5@-BcL<+z7Xv|gMV$2WWSv8FW&@qwq+AoLJ(fT(FpK;+XJ z`_sv=fBTOp_V?xj`%bj`CfGkYWk0b$62pEov4@gjpSr);&yQixCiXtbuphC%*xSUg zm;W8u*YPM)W4W(7c|Rqy^5Ll5uO;^J$*^Cwzu2e5updI~9g<<s*kA0&$FMJY5ZGVk z0j$Q7c@EQv{i=~4qmly~>-#0dJ}Mb@|NdgPV%S>|`|dB3(EbhPI{QWYz!>)D9su@- zl3|~-zu0%8lG~CgBKEvw*iYPF?2pE<@46q@Kdwz8nfLndr({ONu+Jm*+md0waeuMz zMJ2Z-Gnm*9Pli2ff3Yu!VORG7`%0BWGD}X}Psv;s!+saBUzrU1#ruo>&=~eV5qs-o z*nd0W578dHa;!b3aeP{XW~5~w7^~8zV8Ijej_0x?Iyn8yMn7JUL*wJdp=5(os1&0Z zM@(W5#$$hMauV!?e++vJ^?)d9SC4xkn)y88*ti?}4BEf_>IyzZ3$?3c**(BMI2raC z`-^>64EyE8{y7Yyo6vsr{$f8ahW#L7zats;HOKF#WU}fpXVV@0vvYvGcQWkP>@W74 z(f)1heqz6s=Vcq0s%w9-=ftpoe>bpaC&Rwrxc!vO2WX)-?GF(93as0j&^~g1vCoQO z?@#PkB*Xqgzx|~B)F^h(2X}!D&Pwmth_&DEOh6BbrTdqY?#$Hb!hzkYDi__rv{j2R zwU$G3`WylFad?agTA*B2h+_dz)%0Fz=D9lT?v_@HLn++&^GyHSiD|W;L1nAc#M^Nm zlb_OVX_q=t+X+310Pu=k>2`#bzkqf^?<1(~gx(v3`Fz;5&I>!C-=OrHV}^_gOcXX; z>CjAtjKAQk+_(l$*u8n4(D0?@*qmE$!;jYRSHiX!@MjDBIfRE2R)6Egh*`!c0d<{+ zm%8lqu4%QSBV;_mK6NCrNMRrL&pMm000ItQA%s;4kOlLnAZXh^<q2PVSA))@Y&vnc zg?zpI!Y}0O5PX#zhvG@T-qG-n5PlalfRsa;h7Y$BzJC6a@W0@x`QkT#7%|J(%a5?@ zH@sBnwB&r<ge+3<_0$(OU!xFk___ySH4n&O_lBV6D@W7$<S{6(Gi^GvnJ8>L0$X+v z)D>UlMmIdk*N>-)99FLaUx(T785;g|4c|iGTM}N%i{C)Qh*^fgkFe_?ywuD2$@zK| zS)}0W)*Uuq{Sa{Yx*B1%3dn-_V-VDQ`8A#S<m*Og8Y%yV&xNmho|p3a9$)3g4|tNV z?i&8<mEdcb4PT?-KgOLyNd2L}e?)lUi{FT5#4O`ueuQ10;H9<>O3v4sfhqYq59!1X z&mbPVeH9YfS3nlbKM6t2R|$|Hqt(5^*FXK5uMM9GUmY}^Yw=ZXRN+a!hH7{Z`MTbQ zU!>s;4gZS3ze;%Fi{Idj5wncf`4M*g8!wffg0Jreq~z;*hp!%Sd|g1kItpKbC|~n{ z1R3>%?SU#Eq4`phx$)v&IMNFlpW>_B_zX|-b*+ZaUje=zwBc<z^lKyK6(<Mbi{C&) z!OSw&@gwY7kC!?oFL`-&NzGTMopyPxW_`BHD;<$)5Re7)e?qh_uT`fAU*5Lh>zgw) zUvs1p7#n?@%o(%sRc=^#lCS$U{FTeW*V{JyBn>|*L-_iez~4Z4;fvou!-!c%DL-Iu zf|nY3YI42`kwuF3^^McM9*JvTTiL#@0J32Ix@i0Q>SSFH+0S>f=^V#IVdLswrM&)( zuX5vZJjvHv8a`YGzP|8jITUI5DLfz_GR_eA5rh}M_>E{r%rXM}2)oY2OWiauIbT;J zixhmF?9{^@EO)!S4re{Q6Uc)3o@hPnsOjv-@;c3?bD>lgBWy}}J%_Jy<9R$mk>~T1 zL=Lah0djjAey)ap@*v^sUV*<);Dfyq-sQ&q8jb4#yw&^xU<|hziciGEF)WO1Qt-Cq zQ@bu+jex`3lL)JYz!%Ja2ti#J2WVO!dJMe%+0<q5CngFTV?J$QT|5q7<;L-NlD7;E zzx8eKcA^d6UBj=zfl$DA68O#nAMBOzE;q6?8dn#*)v8lc^7itdQu21!cAK|+1RUOO zLRh^Ae8K$d5Y)U~3?!%^V;%)>cMR9OWiSzZrfwJBTHvePXo)9z>#O1SE(LGr+3@u> z0{?X@;q6O&l^b<<BIjNS?{ecSi4MEI##^bAQ}XtH|CGF)4N9cXPbZmnog|;C0r-OX zCm^VKn+hc0?SjGJ?YUu^w|9^+c-z|`ZLJ(%<wk`j%2TA_4<~Oo+wiYx_zs%4mjr%+ zzz2IJyvvP+8jb5^yj8n+-e_yo#P{}+Tueg?7mbFZS3L$@J`K4{ZahOP{V<Py>frAA zvT?F1_adB0GN!x*8@Esgc>ID{#B!b|k2|P)wFx&3v6H$hcn;X!3!aL+a8h*sZ=B|Z zWGnb#UeTg`^G>1xh@J#5`4y0vZ=BU4;@SE|x3oD|fvRk7YGcQyTCIHsO&K4f;hJ|q zIy~@T(p;cgrTrACgPT}?&LFkwH<(NDkftOW%?-;ve-R5RxZPE+oPhM&;CvFd@2^K~ zq&XUR<o5kkys(p*z*9jIp5l2PkmPs0|4nR-cz&uyQl7I=2Aby`JDTwP!PCijc1M1U z^1NYh6P}G2&u??l5y$h*s2NRpwryd=?hJ(?re~9m(<!la3{MIuOQ}aNL3B?3I(8d0 zp8l@?*SxDu9oj2)^P}Gy0;_;BAKl07-ePu(m`Cn;6H=Kv)cPR+YlWi=t&DJC&xeAa z_H4Ogd4mz$-m@U{fz{?*v(IW@cpQArTstGJ@ZE3ByuGDHVcsVt7vj=C&(_borOjxa z`9K*C7-BclpEFL~Iv$jwrc7Yvm_WnBvK(0sG746DG_aiz)7}Js!F6v!h#9PCRX2ZQ zUEMqrSCGNVi5HKJ0k>F-z_!kH-G9)QvUZ>#xhQkiYnCg(__U_+{TQ#X#}kFOjK8XG zX;{L!mS2G-+|X_O4Y<Ru?LE*hO!^GpRwYJG*?{jQKXd)3VZw(2=G;V>^hPkXi_l-> zCc=FDiA{nDyHMn7S_N4vlb@6S&<x+?mW$ph)LnxiM;H|JrI%}v_#jc&7IsZTVR`(h zL}AY@h+<Q$gB2)D6%tR*+xAeouwqo58ram)5LHQ)4nd$RGu?=RO$WRIu}g7$VF7+c z6#l(t!C$|}!T+asnuEV94{ZuP_csgvL6`+-_*Lc2!G9X;1vGq4MRVZ4h{8{A7W`e` zJNQ3u7W~OSIPgO&n?uhhQTQjC1%C%@AvC`oS2qX$aX&fm@9hIW#*1WkqPTH~3mjGJ z`%q!kj4K;2%Sc<?8=Z+d=~#4Vp<x)14mCqXu--y2gyDiO90JmBcmFjEl@HCx!hzrA zW^hl7$=|Teivc^#S!^4}KbAj-Q1$vTI{!>}%ghc1-K`PsklFXYqe8|_f2cqVi3%`? zY_SJUu!FvKj~P51y$B=#S=HcAX-V`EN)QQ0jiCbfRTTwU>2M0!n!f*vWjwD|A7QM4 zYD*3mkmmxiSNlVG3D?Vdlk0uw)e<(Jjq~Cd5<h}OkCu&&d5w7dUZx8h=g$(a5x(%P zDF4Yh<2bHI`G7<Ka~6JqZ65k7xBRM(#|#5`isyjpd<=}XYYFkeAlFKAPJ)W!mQk!2 z!W9=qn3X_ij{k~!zZh>tJnwzl4c*)pR`f|6T+oNDk95YRnEf~TLY;h}^D^+~hEcsQ z)E)+sc%6wdGT{{NOi+gZ@c)Or00iet=Vjv$7zz*`hU#2^?_n4r3wq;?zaqpJA+89+ z11B~&)a=G|hbQHBbQDQq^veT5<caRvi(z)>Zsfk5HfXk4{D<Dzm8Jz3dwb}w$vQhj z9fZQi8FpAw_*h3Q7zV<3UubxS-x{2Olloms^L$pu&;h<Kv?fcZKN_oYDB?@L^M_gp z{9s|Pt~DLySw1&mOMWmzgWYv)%@Fc}Yq|o+Bi=4dY|c{B1g-G@2Ti)4X>_-!QxmcZ zXKxKyHGVl+;I~egdUKbw((BOB%FJMKrQPo=?Zt^y1MU~@4iR?uhfeW_Cc3W*j?KcU zjj<VpvxjHR8lF`+_0}$F{!H&~-hMo3=xp41T;ZeO*Q-e~8Aj{Wapyy9>(%8FIUL1` zzG+_0RP-=xrE<}*+~O&H14v;jioX}N3GJ}!`_69-6xvH;v`gzv*R&UAx`%aVr&VYT z>l+&0*B?6FAG$4`hhdtB+k}S*FK>?W00Z##YC<9p+NH}yQ6A9Eq~w7$Vgj1qGts^+ zG!6}BLRRK66O<2k%<8T#TvVx^;sn{93q$t;H>})wtdm_fMO)g_44>D%a1j<rD2;Wh z2NVM{$|kijL;cH#WTe$yVlKK$|2xPWI6R}|TEDeU+&IAYjxEdLG{TyYfr3SMig}`# zLLR(ChL%n_ShZoc0s~4v$^-4cfODVS_i?(}68O=q;;$yX295fL?9ARJY?_~4x>Bvd zWodd1)NEea9)5>cx6SJbP!u%cb(H>RB;~bd3SOm39D8I^UJq_IuOI)NygD|p&e@!F z++`g6Ge!F|dkNEGH`}!i`yC_DY<fBc_kp?sYq1$+H=%pE2xoKZ+L@tC-HRX#r0j+s zYU(Xr(n{9ahiOo);ttdN@jSHvKT!2p3+-Q?@G(PoHgHv%C7zn?6IsD4ac)PuHCY&d zhmf$hUd|YK7s1ORzj*ctho-Q^!Uuu`L61LVKHdxQo{QS%tx+y8E{nE#IbwdN*QVOn z-~TdSBUQeRKhh|l17Q0d$i~=0mr3v*%GMeREX4jfiZ-CR#-T9r7Y#-O1mYVEBN@i* zYz8#9t)Z3TJ=4@URI4!tbR(Fc*z0j|;mI}xhp54?Mmv)spS97)<p%_5R-$)X<i{Hh zO4s0fgUUyDFvqm+m&?)pR*QgzAr2W}T2Q4hDdLYqc^pfx4F|;5hUjcZUkY8vAIq=J zzVdq}?f3KB4_`X@hoX+qmrk*P?x=abbo#ZT*<qC$^Yag~!Rgi#Nc4i;JYPDGZNO4@ zFMI}Z!AM^^mwkw-lK9d&A0hbCVYh<$!@hm#)NxsWmV(oAcisi~=K0b&DLbWpZqr6v zKld^MC{5Y(T#B$7jUFzT&uFcms}TpPuENQ<tgdZ;t)H9BL}4TU5ReiwZp2r)F%eHh zx+dYRUOgh2?}#UXDutf+Imk)$g&_nSdLE$gDuF7P&uC3gk*3GTJ))aW)byOoMDWc* z#Z|~S6JO=VS$LA3BD~d+QF?ku39wuqph|QxGz7px#t{gB45%1jmq`qTLI$IS4CAI2 z-H}OKd{YEJRFeQ#E2at?4^WvDGQL2hdiHQg;w7!)v(Kf<Am?4^4CwYv_F*p$hq7Cs z|5MB|tudy|JE2s-`5?6U5xF?762xg!JT{=pz;Q%ik=oOZdOK@OK~i8v;CdT)i+aZf zE@}jv#e*;{hobqD3OdBMG9#F|7_V-2YU{HMVVW|B)it<kf*eTIx-N7$1z0;3p%3>{ zg@o=#yjo!$k}GRp^j`?7+oh)Scq)Bg|FN_y{)@CN?Cx6U+Z?|Y8Qr*S;{*!Qr@xH6 zTWGq0F&Rr`#{1DP7IUTpNmi+2T1wZI?0C8y{wM&;a!E#W^1iccqrC6Fd0%<I2=3-^ zMh05<>98Yp-drndM-uMFdEemV&G|?pzN^&<sq>bVbChqbH^uSrBjI2c*3|PR=AxZ= z`t@X&?D_&*nrb98WdLZQ0s3ozN)51@0J#9b`SGo@pd7Y%e*Ae@P^j5&GnUIhKbFyY z?up4&0pm<gc}&&kjz;Il+a4c(etZ@X{(<x3ZNBQO74rLke*9rHgp}vU^>DCW^*}>w z?)mW@Pzs_BU@4@}k1y@XHCL+h<5<i`Rno?(bv8S!?9Tpzqc_p|l3zNrLgIg-zNBUU zO}PIH+Gm~*Y}v1C8tPy+W-RpQ>_<_GGdS6is8WA|)(ixqF|eLuOQ9Pn46Z76bemY= zpofqi(K4R;GD_1pn<mUbY+cS`3P_FJ7fo(W)A+t!u|&{{RB#8fiiNBqdxcV^LUClt zjc?Nr6S5|NtmwH{p0%Gx<BzbbS8KjJ=iPy!XWCkX!I7x__n{BVwh!L_G*xSBp1qN+ z`5+#>M}L{w0opKlnMOs0_^Z@KT3>^+WjiFK=X(A6N*^Cn!-<-Pdoc0)s8BS>z03Bh zY-%TtjU3sr7N(v&cvD6ioe$w^17C*n7VspUqeD;p?GfiU=j<=GI+katw$)Iypy`q2 z+M8P9q;l;Id=fv-E8}oeG<-0+Tqk}e8m2w|aZe;X?ok|kTgd*r!n@NR1he$*)5i14 zX<esl->5L^dZQA9s)d7rZ9k>RxAdp-J#+drVz6$^#*x=2*PMXh2N(}`s~4f-m$RVW zH#lvEqNVf{=NM?osph~b%Xs{A6f`sIBcqn#h5($go3ahYtgVr}LOs`!UD7CYUsZ*X zPMDT?DmQT8YrweN*&OI?UD^h4oz-2P07v~`;B?mK5#9AEPqGDdQ!W;`1F*J*CXH?z zI4|eeA0D>_th+fJp}H4EdB-@r)8QK{yPxTj!tyMuAm3+YsYA9S0eWAPqtWrEbt!p% zxsp7~0oc)M5hUXr^PL3K+GiY&OAp7Mi518ojZbq>L$4sG$EK|!863ocuQ%{r7Q;7A zjf>)glZw!onkc$X5W_4U0G?F(6yz{V-QmFw+dqIK7dQ+l2b-px7!Cy-v9q`y;3$JA z7nZ&P6lH1%QNS433oy<Yu*72k+C6F$5z6LKWYbnH48?im0=0nG1@k<zjR{2xOnXpx za}Z}!$da0+K4*zqD{Fs(xTQWz|ECqI&cXO|%PDFc+<uz7Mv(HUTnA}IW|jILhWO~c zHeh$^aR92D*RbXxb5inCm7{$eD;1JG0=u=QYy9s}u)*co@aCch<)iV@voGEJzBvdV zP!jE&%u}SeY0G7=3D&E(4q=fs^^75Wz^O1~Bb5jpx7CK@|3&cf>o)srG#5Q?9k)b1 zW*ukl{t|nyEn}Xc&1*LGHK+ZY=7uxyEHk*`Xunn1;Om1GXJLaGZ0I?$hYx$(gOM|O zk0a4bUk<fI@N%r!F^RcoWyCXn4Rot=XNu^i;2&6&YFKb*Va8bdd9?E`ma4oJ7pIh& z&fT?#pc~Fk!+o$h=t+$yI@4AdWo_?8Q=sO%KSr=|ot;+tr)Wn#ps;ls1de5Ir$c{? z=y9Z&b^6^bU8m<z_MDYszRvOJoOK-H^_>>f|6z|bXCvC4s0k{(6<TV>Act6QPp|cz ztdzM)YlcQu`$OK%KKR=WPU5AzKFb}v@{P1|@0%DxdVSrgJEja*F2ij34b-u1>i$ij zdCD7Ur4!jCgSY5=dJl~ziNQwHI0v@SYpn-{ZRl>K{7*4kb0$}%PCP`q`)YLz0%*NG z$!RS|ylJb*K;b2Y&~akLkG$Vd<KCe{iJ?mvN*ojP$=n@B&|;Uu?TKrSvGH$w1_59s z`)WLXKxx0jLuVEg1IAJMhi&*lofeIq=WES@?|sH*X=gP<d0M)u|LC~!26F*4X4>n1 z%uPZWYw}!|RmI!uF2`nXe;f{!vEr+ky)LS&@0tyX^%M=X!R&)gsWM$pF^*C3uKu3s z40I9CyX8_h6UIf$)ek;3qszX;1>bWk>;>Ni2!KXe2S0$YD(WcfP6YM3a|@jshFt@% z!#cPHHJ(`E<uFm$xB#Odz7E4zxzQ6(3hNmSf5NSpENr6I5D@J&y!TD9**QqyTjQAy z8yvntfqs`88S)u+wZU6macD{#oRP>T1#c%qy0VyER~F;#a73yS;DcQlf||Eq#n++h zr!3HVluhegCJGxTy(cy}_u{MExDQYA_Kt=hH3jgyurMZXQ#Jh6ON6(Z1^yO1X&*OF z!|(mHFYF&}_;DJ3;1Q_fA>+>ie>t9%LBhM-xI&`Ct}F3YqtP?f9u3_&+c$flxPFi` zfA}v(ZYf0a>N1Gr5U|x10rsq@#9W%8VCN!6T?FL8{5uhhltO2g|5<w!I`m;-*YX<B z-qxo5KW~d{Rv#|3e}J!YV>6yMZ2n}(<r6IYDVItOJ94qeWre`5#1l$!;;r2dysy}> zuL*3AUV^vBO9Hz9PaE%2!ro!S&L?cB$D;!DSPUq)Gcv!-2D*<xVPnE3Da5eA-X*ZX zUJ37V<8Fx#yXN4nesDv`@1rl^IEKB*<aSZG+CqgVf;x2JP*#Xh)OXzQ*1=D2;gnZK z4YqIiUcLouw*<Q=Z9fvA=(nt3(cAVTmh0-J=o$tsWgO<NVb|iT(e5TJrzoO!AU)(~ z&S5QMAmE#6zp*|W#TIA3ao5d|*fH5uay#}LHz10`O`jK;VMA*Bjq7<cD(5K5Eyq(i zZ`qgq#u>bOR^TTz3;x7k9QbTG<e415tUrp}b}89c4bV#%HW|a1*7Sz4rg&-KB&JF& z{WA*&DvTnh3olAg?b76gb5`!jro@?+i1X?LfpZH~+;Mbz4g}7Hi8z;Eb^v&vm5B4Y zX5oxqt68px+NSKJu0jixe%p(HGbW8>vwX|N?upU5-yRAiXd6@LxAyuTy1#KV5$@w& zDE&=ae8F!mo&;=%x9SWeP5qp=Nli~Dq!N05VjHu^$aJFWEA%j0)AL#zp~v$v`l(N_ zBx3(p#ze4F?IwNY5`2{#Z{kUM-ojhWY?q9ln}8}sCw>)DY55@F&@+;#<^dJtgP^7- zN7FL{mx8D>ZF<~H6gE7Xp0@aceDD<c;H`EaoQ$5@jFj{|_?AsiDFO~X(-2negdRp~ zdhQ1juzg)A%Ij?`$0(lyCJGzA1yWw8;;Y=q!;^r6@K$4!(sMy-dhS3fk<XO~IQ0CL zs3rqdFrU$yo>rQklSt2THa)pa6gK|)lF)N3zRHb0c#@vJc&p8AMLzcZ5yf%yf7o^0 zfGv4!cGcs4M3`v|$u_O&dT$Q5Jw|Zh)(ET-Y$Y;{D$wJ`E4Q!6F+uPZIYsDnq28v) zpDx(8!HiY=n&L8H01YhgQ}0M8^kL}FTxWiHLYmqEOGPfqpkb1|=|h8SBlVffN45+8 zoL+hmv>uVOv9!iWaWNItFfxE(is_Iih5zQmw?x-5jr=#0U?1+br_Nl6)XtlW+@@YD znDG8U#ldZ5R2;}MvA4S9AXI<7a1kfYT~RYgOEJhO(td$Bmnn*^=`fcm#<=#-=2Ub* zl|w($1udHRk#0iDkIUjnd6yeuairXhN)bm2`hD6t`9o&5^!?Z|RM5g<EU8s*MVGiT zL~x8q2@3~qK+EOu@57$^2Vm#_0obn^!KT)ML+7$p>%iN!gg7ulM|J<(u1?gyb5&Zz zVYF?X3?;v>dQa(3Suc=vzW29il<($oDe}Gd%LAEj_s03&ohsk12Q=R&(i`zRJXOAr z)gDNG`!>$^_*D5G+w6QB>0{J{qjpDN!+^!<d9^>Fv7uYS{t30S$uGMV{V80_M|GyC zS<&#fsKl~9hK}`3G<GLEQR`l%AD;FVH6ZAU=TNg@t70yB*X}x|=S;<~*yXXE=XtfB z4p%nKS5vU9;;0T~!(@^u`?LeLrp^J6dyo8Vur+epIpEK$slY-<Hxw6AK{sgPYE5*| zqt(^vc2A>wZ>lklXwA-MUJezdP-l>8>an38ZK50AMpon)L})@bdcwOm+3a{viRy+Q z$8`as8~&yW_@J_}mBSATzn4%^I_p(iQ3}swbJjV`dVzV&@s3`z<QyRB4ZDkK=v_B2 z?v@tu)Z$4+AglmIi85*@bSxF>xOatrC>i0Cjg#>(F^P^cusL9r&jt)m8$lio_$d== z&PXZskeTY@Gzx<n<5MVzE(h&HV{Dh{RB(YZ71J-fOlNP54hI;<_CU8b-!4@1GvO13 zx==myj>9JxW*AAvIh;23`3MH6FFSuz(_;Nh*oZII9voeZsb@SiSjo|~uwAf0M%VNR zZ*a!w%I#lpmuKi=p3icyO;q%nf<6xyq84+Yi}z>w@`h+-ozI`6m33~FU4EPmRHK-k z+FC?^mU95R&k8$bW0W)O+Ug2>PmD9$o269PV T1#$)(cjgEY;N-8ZG$$KK)U;J3 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,sMy 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%0AS5d2;oiN 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�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�?>AGCG!7Bw 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�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%0A3tdQO8DX(HM!){N#}<O>$T~aS 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 ^u;=^^vo3nhK9S1@lHAJ6_aU;M6Vs+R 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 h4?zv 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 diff --git a/lib/python_libtorrent/windows_x64/1.2.2/libtorrent.pyd.size.txt b/lib/python_libtorrent/windows_x64/1.2.2/libtorrent.pyd.size.txt deleted file mode 100644 index 449c75d2..00000000 --- a/lib/python_libtorrent/windows_x64/1.2.2/libtorrent.pyd.size.txt +++ /dev/null @@ -1 +0,0 @@ -4290048 \ No newline at end of file diff --git a/lib/python_libtorrent/windows_x64/1.2.3/__init__.py b/lib/python_libtorrent/windows_x64/1.2.3/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/windows_x64/1.2.3/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/python_libtorrent/windows_x64/1.2.3/libtorrent.pyd.size.txt b/lib/python_libtorrent/windows_x64/1.2.3/libtorrent.pyd.size.txt deleted file mode 100644 index 2a4790d3..00000000 --- a/lib/python_libtorrent/windows_x64/1.2.3/libtorrent.pyd.size.txt +++ /dev/null @@ -1 +0,0 @@ -3797504 \ No newline at end of file diff --git a/lib/python_libtorrent/windows_x64/__init__.py b/lib/python_libtorrent/windows_x64/__init__.py deleted file mode 100644 index e0aed70e..00000000 --- a/lib/python_libtorrent/windows_x64/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -#-*- coding: utf-8 -*- -''' - python-libtorrent for Kodi (script.module.libtorrent) - Copyright (C) 2015-2016 DiMartino, srg70, RussakHH, aisman - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -''' diff --git a/lib/quasar/daemon.py b/lib/quasar/daemon.py deleted file mode 100644 index 6f1dbe7e..00000000 --- a/lib/quasar/daemon.py +++ /dev/null @@ -1,295 +0,0 @@ -import os -import stat -import time -import xbmc -import shutil -import socket -import urllib2 -import xbmcgui -import threading -import subprocess -from quasar.logger import log -from quasar.osarch import PLATFORM -from quasar.config import QUASARD_HOST -from quasar.addon import ADDON, ADDON_ID, ADDON_PATH -from quasar.util import notify, system_information, getLocalizedString, getWindowsShortPath - -def ensure_exec_perms(file_): - st = os.stat(file_) - os.chmod(file_, st.st_mode | stat.S_IEXEC) - return file_ - -def android_get_current_appid(): - with open("/proc/%d/cmdline" % os.getpid()) as fp: - return fp.read().rstrip("\0") - -def get_quasard_checksum(path): - try: - with open(path) as fp: - fp.seek(-40, os.SEEK_END) # we put a sha1 there - return fp.read() - except Exception: - return "" - -def get_quasar_binary(): - binary = "quasar" + (PLATFORM["os"] == "windows" and ".exe" or "") - - log.info("PLATFORM: %s" % str(PLATFORM)) - binary_dir = os.path.join(ADDON_PATH, "resources", "bin", "%(os)s_%(arch)s" % PLATFORM) - if PLATFORM["os"] == "android": - log.info("Detected binary folder: %s" % binary_dir) - binary_dir_legacy = binary_dir.replace("/storage/emulated/0", "/storage/emulated/legacy") - if os.path.exists(binary_dir_legacy): - binary_dir = binary_dir_legacy - log.info("Using binary folder: %s" % binary_dir) - app_id = android_get_current_appid() - xbmc_data_path = os.path.join("/data", "data", app_id) - - try: #Test if there is any permisions problem - f = open(os.path.join(xbmc_data_path, "test.txt"), "wb") - f.write("test") - f.close() - os.remove(os.path.join(xbmc_data_path, "test.txt")) - except: - xbmc_data_path = '' - - if not os.path.exists(xbmc_data_path): - log.info("%s path does not exist, so using %s as xbmc_data_path" % (xbmc_data_path, xbmc.translatePath("special://xbmcbin/"))) - xbmc_data_path = xbmc.translatePath("special://xbmcbin/") - - try: #Test if there is any permisions problem - f = open(os.path.join(xbmc_data_path, "test.txt"), "wb") - f.write("test") - f.close() - os.remove(os.path.join(xbmc_data_path, "test.txt")) - except: - xbmc_data_path = '' - - if not os.path.exists(xbmc_data_path): - log.info("%s path does not exist, so using %s as xbmc_data_path" % (xbmc_data_path, xbmc.translatePath("special://masterprofile/"))) - xbmc_data_path = xbmc.translatePath("special://masterprofile/") - dest_binary_dir = os.path.join(xbmc_data_path, "files", ADDON_ID, "bin", "%(os)s_%(arch)s" % PLATFORM) - else: - dest_binary_dir = os.path.join(xbmc.translatePath(ADDON.getAddonInfo("profile")).decode('utf-8'), "bin", "%(os)s_%(arch)s" % PLATFORM) - - log.info("Using destination binary folder: %s" % dest_binary_dir) - binary_path = os.path.join(binary_dir, binary) - dest_binary_path = os.path.join(dest_binary_dir, binary) - - if not os.path.exists(binary_path): - notify((getLocalizedString(30103) + " %(os)s_%(arch)s" % PLATFORM), time=7000) - system_information() - try: - log.info("Source directory (%s):\n%s" % (binary_dir, os.listdir(os.path.join(binary_dir, "..")))) - log.info("Destination directory (%s):\n%s" % (dest_binary_dir, os.listdir(os.path.join(dest_binary_dir, "..")))) - except Exception: - pass - return False, False - - if os.path.isdir(dest_binary_path): - log.warning("Destination path is a directory, expected previous binary file, removing...") - try: - shutil.rmtree(dest_binary_path) - except Exception as e: - log.error("Unable to remove destination path for update: %s" % e) - system_information() - return False, False - - if not os.path.exists(dest_binary_path) or get_quasard_checksum(dest_binary_path) != get_quasard_checksum(binary_path): - log.info("Updating quasar daemon...") - try: - os.makedirs(dest_binary_dir) - except OSError: - pass - try: - shutil.rmtree(dest_binary_dir) - except Exception as e: - log.error("Unable to remove destination path for update: %s" % e) - system_information() - pass - try: - shutil.copytree(binary_dir, dest_binary_dir) - except Exception as e: - log.error("Unable to copy to destination path for update: %s" % e) - system_information() - return False, False - - # Clean stale files in the directory, as this can cause headaches on - # Android when they are unreachable - dest_files = set(os.listdir(dest_binary_dir)) - orig_files = set(os.listdir(binary_dir)) - log.info("Deleting stale files %s" % (dest_files - orig_files)) - for file_ in (dest_files - orig_files): - path = os.path.join(dest_binary_dir, file_) - if os.path.isdir(path): - shutil.rmtree(path) - else: - os.remove(path) - - return dest_binary_dir, ensure_exec_perms(dest_binary_path) - -def clear_fd_inherit_flags(): - # Ensure the spawned quasar binary doesn't inherit open files from Kodi - # which can break things like addon updates. [WINDOWS ONLY] - from ctypes import windll - - HANDLE_RANGE = xrange(0, 65536) - HANDLE_FLAG_INHERIT = 1 - FILE_TYPE_DISK = 1 - - for hd in HANDLE_RANGE: - if windll.kernel32.GetFileType(hd) == FILE_TYPE_DISK: - if not windll.kernel32.SetHandleInformation(hd, HANDLE_FLAG_INHERIT, 0): - log.error("Error clearing inherit flag, disk file handle %x" % hd) - - -def jsonrpc_enabled(notify=False): - try: - s = socket.socket() - s.connect(('127.0.0.1', 9090)) - s.close() - log.info("Kodi's JSON-RPC service is available, starting up...") - del s - return True - except Exception as e: - log.error(repr(e)) - if notify: - xbmc.executebuiltin("ActivateWindow(ServiceSettings)") - dialog = xbmcgui.Dialog() - dialog.ok("Quasar", getLocalizedString(30199)) - return False - -def start_quasard(**kwargs): - jsonrpc_failures = 0 - while jsonrpc_enabled() is False: - jsonrpc_failures += 1 - log.warning("Unable to connect to Kodi's JSON-RPC service, retrying...") - if jsonrpc_failures > 1: - time.sleep(5) - if not jsonrpc_enabled(notify=True): - log.error("Unable to reach Kodi's JSON-RPC service, aborting...") - return False - else: - break - time.sleep(3) - - quasar_dir, quasar_binary = get_quasar_binary() - - if quasar_dir is False or quasar_binary is False: - return False - - lockfile = os.path.join(ADDON_PATH, ".lockfile") - if os.path.exists(lockfile): - log.warning("Existing process found from lockfile, killing...") - try: - with open(lockfile) as lf: - pid = int(lf.read().rstrip(" \t\r\n\0")) - os.kill(pid, 9) - except Exception as e: - log.error(repr(e)) - - if PLATFORM["os"] == "windows": - log.warning("Removing library.db.lock file...") - try: - library_lockfile = os.path.join(xbmc.translatePath(ADDON.getAddonInfo("profile")).decode('utf-8'), "library.db.lock") - os.remove(library_lockfile) - except Exception as e: - log.error(repr(e)) - - SW_HIDE = 0 - STARTF_USESHOWWINDOW = 1 - - args = [quasar_binary] - kwargs["cwd"] = quasar_dir - - if PLATFORM["os"] == "windows": - args[0] = getWindowsShortPath(quasar_binary) - kwargs["cwd"] = getWindowsShortPath(quasar_dir) - si = subprocess.STARTUPINFO() - si.dwFlags = STARTF_USESHOWWINDOW - si.wShowWindow = SW_HIDE - clear_fd_inherit_flags() - kwargs["startupinfo"] = si - else: - env = os.environ.copy() - env["LD_LIBRARY_PATH"] = "%s:%s" % (quasar_dir, env.get("LD_LIBRARY_PATH", "")) - kwargs["env"] = env - kwargs["close_fds"] = True - - wait_counter = 1 - while xbmc.getCondVisibility('Window.IsVisible(10140)') or xbmc.getCondVisibility('Window.IsActive(10140)'): - if wait_counter == 1: - log.info('Add-on settings currently opened, waiting before starting...') - if wait_counter > 300: - break - time.sleep(1) - wait_counter += 1 - - return subprocess.Popen(args, **kwargs) - -def shutdown(): - try: - urllib2.urlopen(QUASARD_HOST + "/shutdown") - except: - pass - -def wait_for_abortRequested(proc, monitor): - monitor.closing.wait() - log.info("quasard: exiting quasard daemon") - try: - proc.terminate() - except OSError: - pass # Process already exited, nothing to terminate - log.info("quasard: quasard daemon exited") - -def quasard_thread(monitor): - crash_count = 0 - try: - while not xbmc.abortRequested: - log.info("quasard: starting quasard") - proc = start_quasard(stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - if not proc: - break - threading.Thread(target=wait_for_abortRequested, args=[proc, monitor]).start() - - if PLATFORM["os"] == "windows": - while proc.poll() is None: - log.info(proc.stdout.readline()) - else: - # Kodi hangs on some Android (sigh...) systems when doing a blocking - # read. We count on the fact that Quasar daemon flushes its log - # output on \n, creating a pretty clean output - import fcntl - import select - fd = proc.stdout.fileno() - fl = fcntl.fcntl(fd, fcntl.F_GETFL) - fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK) - while proc.poll() is None: - try: - to_read, _, _ = select.select([proc.stdout], [], []) - for ro in to_read: - line = ro.readline() - if line == "": # write end is closed - break - log.info(line) - except IOError: - time.sleep(1) # nothing to read, sleep - - log.info("quasard: proc.return code: %s" % str(proc.returncode)) - if proc.returncode == 0 or xbmc.abortRequested: - break - - crash_count += 1 - notify(getLocalizedString(30100), time=3000) - xbmc.executebuiltin("Dialog.Close(all, true)") - system_information() - time.sleep(5) - if crash_count >= 3: - notify(getLocalizedString(30110), time=3000) - break - - except Exception as e: - import traceback - map(log.error, traceback.format_exc().split("\n")) - notify("%s: %s" % (getLocalizedString(30226), repr(e).encode('utf-8'))) - raise diff --git a/lib/quasar/navigation.py b/lib/quasar/navigation.py deleted file mode 100644 index 70658b6c..00000000 --- a/lib/quasar/navigation.py +++ /dev/null @@ -1,260 +0,0 @@ -import os -import sys -import socket -import urllib2 -import urlparse -import xbmc -import xbmcgui -import xbmcplugin -from quasar.logger import log -from quasar.config import QUASARD_HOST -from quasar.addon import ADDON, ADDON_ID, ADDON_PATH -from quasar.util import notify, getLocalizedString, getLocalizedLabel, system_information - -try: - import simplejson as json -except ImportError: - import json - - -HANDLE = int(sys.argv[1]) - - -class InfoLabels(dict): - def __init__(self, *args, **kwargs): - self.update(*args, **kwargs) - - def __getitem__(self, key): - return dict.get(self, key.lower(), "") - - def __setitem__(self, key, val): - dict.__setitem__(self, key.lower(), val) - - def update(self, *args, **kwargs): - for k, v in dict(*args, **kwargs).iteritems(): - self[k] = v - - -class closing(object): - def __init__(self, thing): - self.thing = thing - - def __enter__(self): - return self.thing - - def __exit__(self, *exc_info): - self.thing.close() - - -class NoRedirectHandler(urllib2.HTTPRedirectHandler): - def http_error_302(self, req, fp, code, msg, headers): - import urllib - infourl = urllib.addinfourl(fp, headers, headers["Location"]) - infourl.status = code - infourl.code = code - return infourl - http_error_300 = http_error_302 - http_error_301 = http_error_302 - http_error_303 = http_error_302 - http_error_307 = http_error_302 - - -def getInfoLabels(): - id_list = [int(s) for s in sys.argv[0].split("/") if s.isdigit()] - tmdb_id = id_list[0] if id_list else None - - if not tmdb_id: - parsed_url = urlparse.urlparse(sys.argv[0] + sys.argv[2]) - query = urlparse.parse_qs(parsed_url.query) - log.debug("Parsed URL: %s, Query: %s", repr(parsed_url), repr(query)) - if 'tmdb' in query and 'show' not in query: - tmdb_id = query['tmdb'][0] - url = "%s/movie/%s/infolabels" % (QUASARD_HOST, tmdb_id) - elif 'show' in query: - tmdb_id = query['show'][0] - if 'season' in query and 'episode' in query: - url = "%s/show/%s/season/%s/episode/%s/infolabels" % (QUASARD_HOST, tmdb_id, query['season'][0], query['episode'][0]) - else: - url = "%s/show/%s/infolabels" % (QUASARD_HOST, tmdb_id) - else: - url = "%s/infolabels" % (QUASARD_HOST) - elif 'movie' in sys.argv[0]: - url = "%s/movie/%s/infolabels" % (QUASARD_HOST, tmdb_id) - elif ('episode' in sys.argv[0] or 'show' in sys.argv[0]) and len(id_list) > 2: - url = "%s/show/%s/season/%s/episode/%s/infolabels" % (QUASARD_HOST, tmdb_id, id_list[1], id_list[2]) - elif 'show' in sys.argv[0] and len(id_list) == 2: - url = "%s/show/%s/season/%s/episode/%s/infolabels" % (QUASARD_HOST, tmdb_id, id_list[1], 1) - else: - url = "%s/infolabels" % (QUASARD_HOST) - - log.debug("Resolving TMDB item by calling %s for %s" % (url, repr(sys.argv))) - - try: - with closing(urllib2.urlopen(url)) as response: - resolved = json.loads(response.read()) - if not resolved: - return {} - - if 'info' in resolved and resolved['info']: - resolved.update(resolved['info']) - - if 'art' in resolved and resolved['art']: - resolved['artbanner'] = '' - for k, v in resolved['art'].items(): - resolved['art' + k] = v - - if 'info' in resolved: - del resolved['info'] - if 'art' in resolved: - del resolved['art'] - if 'stream_info' in resolved: - del resolved['stream_info'] - - if 'dbtype' not in resolved: - resolved['dbtype'] = 'video' - if 'mediatype' not in resolved or resolved['mediatype'] == '': - resolved['Mediatype'] = resolved['dbtype'] - - return resolved - except: - log.debug("Could not resolve TMDB item: %s" % tmdb_id) - return {} - - -def _json(url): - with closing(urllib2.urlopen(url)) as response: - if response.code >= 300 and response.code <= 307: - # Pause currently playing Quasar file to avoid doubling requests - if xbmc.Player().isPlaying() and ADDON_ID in xbmc.Player().getPlayingFile(): - xbmc.Player().pause() - _infoLabels = InfoLabels(getInfoLabels()) - - item = xbmcgui.ListItem( - path=response.geturl(), - label=_infoLabels["label"], - label2=_infoLabels["label2"], - thumbnailImage=_infoLabels["thumbnail"]) - - item.setArt({ - "poster": _infoLabels["artposter"], - "banner": _infoLabels["artbanner"], - "fanart": _infoLabels["artfanart"] - }) - - item.setInfo(type='Video', infoLabels=_infoLabels) - xbmcplugin.setResolvedUrl(HANDLE, True, item) - return - - payload = response.read() - - try: - if payload: - return json.loads(payload) - except: - raise Exception(payload) - - -def run(url_suffix=""): - if not os.path.exists(os.path.join(ADDON_PATH, ".firstrun")): - notify(getLocalizedString(30101)) - system_information() - return - - donatePath = os.path.join(ADDON_PATH, ".donate") - if not os.path.exists(donatePath): - with open(donatePath, "w"): - os.utime(donatePath, None) - dialog = xbmcgui.Dialog() - dialog.ok("Quasar", getLocalizedString(30141)) - - socket.setdefaulttimeout(int(ADDON.getSetting("buffer_timeout"))) - urllib2.install_opener(urllib2.build_opener(NoRedirectHandler())) - - # Pause currently playing Quasar file to avoid doubling requests - if xbmc.Player().isPlaying() and ADDON_ID in xbmc.Player().getPlayingFile(): - xbmc.Player().pause() - - url = sys.argv[0].replace("plugin://%s" % ADDON_ID, QUASARD_HOST + url_suffix) + sys.argv[2] - log.debug("Requesting %s from %s" % (url, repr(sys.argv))) - - try: - data = _json(url) - except urllib2.URLError as e: - if 'Connection refused' in e.reason: - notify(getLocalizedString(30116), time=7000) - else: - import traceback - map(log.error, traceback.format_exc().split("\n")) - notify(e.reason, time=7000) - return - except Exception as e: - import traceback - map(log.error, traceback.format_exc().split("\n")) - try: - msg = unicode(e) - except: - try: - msg = str(e) - except: - msg = repr(e) - notify(getLocalizedLabel(msg), time=7000) - return - - if not data: - return - - if data["content_type"]: - content_type = data["content_type"] - if data["content_type"].startswith("menus"): - content_type = data["content_type"].split("_")[1] - - xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_UNSORTED) - if content_type != "tvshows": - xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE) - xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_DATE) - xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_GENRE) - xbmcplugin.setContent(HANDLE, content_type) - - listitems = range(len(data["items"])) - for i, item in enumerate(data["items"]): - # Translate labels - if item["label"][0:8] == "LOCALIZE": - item["label"] = unicode(getLocalizedLabel(item["label"]), 'utf-8') - if item["label2"][0:8] == "LOCALIZE": - item["label2"] = getLocalizedLabel(item["label2"]) - - listItem = xbmcgui.ListItem(label=item["label"], label2=item["label2"], iconImage=item["icon"], thumbnailImage=item["thumbnail"]) - if item.get("info"): - listItem.setInfo("video", item["info"]) - if item.get("stream_info"): - for type_, values in item["stream_info"].items(): - listItem.addStreamInfo(type_, values) - if item.get("art"): - listItem.setArt(item["art"]) - elif ADDON.getSetting('default_fanart') == 'true' and item["label"] != unicode(getLocalizedString(30218), 'utf-8'): - fanart = os.path.join(ADDON_PATH, "fanart.jpg") - listItem.setArt({'fanart': fanart}) - if item.get("context_menu"): - # Translate context menus - for m, menu in enumerate(item["context_menu"]): - if menu[0][0:8] == "LOCALIZE": - menu[0] = getLocalizedLabel(menu[0]) - listItem.addContextMenuItems(item["context_menu"]) - listItem.setProperty("isPlayable", item["is_playable"] and "true" or "false") - if item.get("properties"): - for k, v in item["properties"].items(): - listItem.setProperty(k, v) - listitems[i] = (item["path"], listItem, not item["is_playable"]) - - xbmcplugin.addDirectoryItems(HANDLE, listitems, totalItems=len(listitems)) - - # Set ViewMode - if data["content_type"]: - viewMode = ADDON.getSetting("viewmode_%s" % data["content_type"]) - if viewMode: - try: - xbmc.executebuiltin('Container.SetViewMode(%s)' % viewMode) - except Exception as e: - log.warning("Unable to SetViewMode(%s): %s" % (viewMode, repr(e))) - - xbmcplugin.endOfDirectory(HANDLE, succeeded=True, updateListing=False, cacheToDisc=True) diff --git a/lib/quasar/osarch.py b/lib/quasar/osarch.py deleted file mode 100644 index 5b580c28..00000000 --- a/lib/quasar/osarch.py +++ /dev/null @@ -1,56 +0,0 @@ -import xbmc -import sys -import platform - -def get_platform(): - build = xbmc.getInfoLabel("System.BuildVersion") - kodi_version = int(build.split()[0][:2]) - ret = { - "auto_arch": sys.maxsize > 2 ** 32 and "64-bit" or "32-bit", - "arch": sys.maxsize > 2 ** 32 and "x64" or "x86", - "os": "", - "version": platform.release(), - "kodi": kodi_version, - "build": build - } - if xbmc.getCondVisibility("system.platform.android"): - ret["os"] = "android" - if "arm" in platform.machine() or "aarch" in platform.machine(): - ret["arch"] = "arm" - if "64" in platform.machine() and ret["auto_arch"] == "64-bit": - ret["arch"] = "arm" - #ret["arch"] = "x64" #The binary is corrupted in install package - elif xbmc.getCondVisibility("system.platform.linux"): - ret["os"] = "linux" - if "aarch" in platform.machine() or "arm64" in platform.machine(): - if xbmc.getCondVisibility("system.platform.linux.raspberrypi"): - ret["arch"] = "armv7" - elif ret["auto_arch"] == "32-bit": - ret["arch"] = "armv7" - elif ret["auto_arch"] == "64-bit": - ret["arch"] = "arm64" - elif platform.architecture()[0].startswith("32"): - ret["arch"] = "arm" - else: - ret["arch"] = "arm64" - elif "armv7" in platform.machine(): - ret["arch"] = "armv7" - elif "arm" in platform.machine(): - ret["arch"] = "arm" - elif xbmc.getCondVisibility("system.platform.xbox"): - ret["os"] = "windows" - ret["arch"] = "x64" - elif xbmc.getCondVisibility("system.platform.windows"): - ret["os"] = "windows" - if platform.machine().endswith('64'): - ret["arch"] = "x64" - elif xbmc.getCondVisibility("system.platform.osx"): - ret["os"] = "darwin" - ret["arch"] = "x64" - elif xbmc.getCondVisibility("system.platform.ios"): - ret["os"] = "ios" - ret["arch"] = "arm" - return ret - - -PLATFORM = get_platform() diff --git a/lib/quasar/util.py b/lib/quasar/util.py deleted file mode 100644 index c3c3b63b..00000000 --- a/lib/quasar/util.py +++ /dev/null @@ -1,72 +0,0 @@ -import platform -import xbmc -import xbmcgui -from quasar.logger import log -from quasar.osarch import PLATFORM -from quasar.addon import ADDON, ADDON_NAME, ADDON_ICON - - -def notify(message, header=ADDON_NAME, time=5000, image=ADDON_ICON): - sound = ADDON.getSetting('do_not_disturb') == 'false' - dialog = xbmcgui.Dialog() - return dialog.notification(toUtf8(header), toUtf8(message), toUtf8(image), time, sound) - -def getLocalizedLabel(label): - try: - if "LOCALIZE" not in label: - return label - if ";;" not in label and label.endswith(']'): - return getLocalizedString(int(label[9:-1])) - else: - parts = label.split(";;") - translation = getLocalizedString(int(parts[0][9:14])) - for i, part in enumerate(parts[1:]): - if part[0:8] == "LOCALIZE": - parts[i + 1] = getLocalizedString(int(part[9:14])) - - return (translation.decode('utf-8', 'replace') % tuple(parts[1:])).encode('utf-8', 'ignore') - except: - return label - -def getLocalizedString(stringId): - try: - return ADDON.getLocalizedString(stringId).encode('utf-8', 'ignore') - except: - return stringId - -def toUtf8(string): - if isinstance(string, unicode): - return string.encode('utf-8', 'ignore') - return string - -def system_information(): - build = xbmc.getInfoLabel("System.BuildVersion") - log.info("System information: %(os)s_%(arch)s %(version)s" % PLATFORM) - log.info("Kodi build version: %s" % build) - log.info("OS type: %s" % platform.system()) - log.info("uname: %s" % repr(platform.uname())) - return PLATFORM - -def getShortPath(path): - if PLATFORM["os"] == "windows": - return getWindowsShortPath(path) - return path - -def getWindowsShortPath(path): - try: - import ctypes - import ctypes.wintypes - - ctypes.windll.kernel32.GetShortPathNameW.argtypes = [ - ctypes.wintypes.LPCWSTR, # lpszLongPath - ctypes.wintypes.LPWSTR, # lpszShortPath - ctypes.wintypes.DWORD # cchBuffer - ] - ctypes.windll.kernel32.GetShortPathNameW.restype = ctypes.wintypes.DWORD - - buf = ctypes.create_unicode_buffer(1024) # adjust buffer size, if necessary - ctypes.windll.kernel32.GetShortPathNameW(path, buf, len(buf)) - - return buf.value - except: - return path diff --git a/lib/rebulk/__init__.py b/lib/rebulk/__init__.py new file mode 100755 index 00000000..93d5e477 --- /dev/null +++ b/lib/rebulk/__init__.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Define simple search patterns in bulk to perform advanced matching on any string. +""" +# pylint:disable=import-self +from .rebulk import Rebulk +from .rules import Rule, CustomRule, AppendMatch, RemoveMatch, RenameMatch, AppendTags, RemoveTags +from .processors import ConflictSolver, PrivateRemover, POST_PROCESS, PRE_PROCESS +from .pattern import REGEX_AVAILABLE diff --git a/lib/rebulk/__version__.py b/lib/rebulk/__version__.py new file mode 100755 index 00000000..5aa37ed6 --- /dev/null +++ b/lib/rebulk/__version__.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Version module +""" +# pragma: no cover +__version__ = '2.0.1.dev0' diff --git a/lib/rebulk/builder.py b/lib/rebulk/builder.py new file mode 100755 index 00000000..c91420aa --- /dev/null +++ b/lib/rebulk/builder.py @@ -0,0 +1,217 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Base builder class for Rebulk +""" +from abc import ABCMeta, abstractmethod +from copy import deepcopy +from logging import getLogger + +from six import add_metaclass + +from .loose import set_defaults +from .pattern import RePattern, StringPattern, FunctionalPattern + +log = getLogger(__name__).log + + +@add_metaclass(ABCMeta) +class Builder(object): + """ + Base builder class for patterns + """ + + def __init__(self): + self._defaults = {} + self._regex_defaults = {} + self._string_defaults = {} + self._functional_defaults = {} + self._chain_defaults = {} + + def reset(self): + """ + Reset all defaults. + + :return: + """ + self.__init__() + + def defaults(self, **kwargs): + """ + Define default keyword arguments for all patterns + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + set_defaults(kwargs, self._defaults, override=True) + return self + + def regex_defaults(self, **kwargs): + """ + Define default keyword arguments for functional patterns. + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + set_defaults(kwargs, self._regex_defaults, override=True) + return self + + def string_defaults(self, **kwargs): + """ + Define default keyword arguments for string patterns. + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + set_defaults(kwargs, self._string_defaults, override=True) + return self + + def functional_defaults(self, **kwargs): + """ + Define default keyword arguments for functional patterns. + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + set_defaults(kwargs, self._functional_defaults, override=True) + return self + + def chain_defaults(self, **kwargs): + """ + Define default keyword arguments for patterns chain. + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + set_defaults(kwargs, self._chain_defaults, override=True) + return self + + def build_re(self, *pattern, **kwargs): + """ + Builds a new regular expression pattern + + :param pattern: + :type pattern: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + set_defaults(self._regex_defaults, kwargs) + set_defaults(self._defaults, kwargs) + return RePattern(*pattern, **kwargs) + + def build_string(self, *pattern, **kwargs): + """ + Builds a new string pattern + + :param pattern: + :type pattern: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + set_defaults(self._string_defaults, kwargs) + set_defaults(self._defaults, kwargs) + return StringPattern(*pattern, **kwargs) + + def build_functional(self, *pattern, **kwargs): + """ + Builds a new functional pattern + + :param pattern: + :type pattern: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + set_defaults(self._functional_defaults, kwargs) + set_defaults(self._defaults, kwargs) + return FunctionalPattern(*pattern, **kwargs) + + def build_chain(self, **kwargs): + """ + Builds a new patterns chain + + :param pattern: + :type pattern: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + from .chain import Chain + set_defaults(self._chain_defaults, kwargs) + set_defaults(self._defaults, kwargs) + chain = Chain(self, **kwargs) + chain._defaults = deepcopy(self._defaults) # pylint: disable=protected-access + chain._regex_defaults = deepcopy(self._regex_defaults) # pylint: disable=protected-access + chain._functional_defaults = deepcopy(self._functional_defaults) # pylint: disable=protected-access + chain._string_defaults = deepcopy(self._string_defaults) # pylint: disable=protected-access + chain._chain_defaults = deepcopy(self._chain_defaults) # pylint: disable=protected-access + return chain + + @abstractmethod + def pattern(self, *pattern): + """ + Register a list of Pattern instance + :param pattern: + :return: + """ + pass + + def regex(self, *pattern, **kwargs): + """ + Add re pattern + + :param pattern: + :type pattern: + :return: self + :rtype: Rebulk + """ + return self.pattern(self.build_re(*pattern, **kwargs)) + + def string(self, *pattern, **kwargs): + """ + Add string pattern + + :param pattern: + :type pattern: + :return: self + :rtype: Rebulk + """ + return self.pattern(self.build_string(*pattern, **kwargs)) + + def functional(self, *pattern, **kwargs): + """ + Add functional pattern + + :param pattern: + :type pattern: + :return: self + :rtype: Rebulk + """ + functional = self.build_functional(*pattern, **kwargs) + return self.pattern(functional) + + def chain(self, **kwargs): + """ + Add patterns chain, using configuration of this rebulk + + :param pattern: + :type pattern: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + chain = self.build_chain(**kwargs) + self.pattern(chain) + return chain diff --git a/lib/rebulk/chain.py b/lib/rebulk/chain.py new file mode 100755 index 00000000..ba31ec9a --- /dev/null +++ b/lib/rebulk/chain.py @@ -0,0 +1,380 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Chain patterns and handle repetiting capture group +""" +# pylint: disable=super-init-not-called +import itertools + +from .builder import Builder +from .loose import call +from .match import Match, Matches +from .pattern import Pattern, filter_match_kwargs, BasePattern +from .remodule import re + + +class _InvalidChainException(Exception): + """ + Internal exception raised when a chain is not valid + """ + pass + + +class Chain(Pattern, Builder): + """ + Definition of a pattern chain to search for. + """ + + def __init__(self, parent, chain_breaker=None, **kwargs): + Builder.__init__(self) + call(Pattern.__init__, self, **kwargs) + self._kwargs = kwargs + self._match_kwargs = filter_match_kwargs(kwargs) + if callable(chain_breaker): + self.chain_breaker = chain_breaker + else: + self.chain_breaker = None + self.parent = parent + self.parts = [] + + def pattern(self, *pattern): + """ + + :param pattern: + :return: + """ + if not pattern: + raise ValueError("One pattern should be given to the chain") + if len(pattern) > 1: + raise ValueError("Only one pattern can be given to the chain") + part = ChainPart(self, pattern[0]) + self.parts.append(part) + return part + + def close(self): + """ + Deeply close the chain + :return: Rebulk instance + """ + parent = self.parent + while isinstance(parent, Chain): + parent = parent.parent + return parent + + def _match(self, pattern, input_string, context=None): + # pylint: disable=too-many-locals,too-many-nested-blocks + chain_matches = [] + chain_input_string = input_string + offset = 0 + while offset < len(input_string): + chain_found = False + current_chain_matches = [] + valid_chain = True + for chain_part in self.parts: + try: + chain_part_matches, raw_chain_part_matches = chain_part.matches(chain_input_string, + context, + with_raw_matches=True) + + chain_found, chain_input_string, offset = \ + self._to_next_chain_part(chain_part, chain_part_matches, raw_chain_part_matches, chain_found, + input_string, chain_input_string, offset, current_chain_matches) + except _InvalidChainException: + valid_chain = False + if current_chain_matches: + offset = current_chain_matches[0].raw_end + break + if not chain_found: + break + if current_chain_matches and valid_chain: + match = self._build_chain_match(current_chain_matches, input_string) + chain_matches.append(match) + + return chain_matches + + def _to_next_chain_part(self, chain_part, chain_part_matches, raw_chain_part_matches, chain_found, + input_string, chain_input_string, offset, current_chain_matches): + Chain._fix_matches_offset(chain_part_matches, input_string, offset) + Chain._fix_matches_offset(raw_chain_part_matches, input_string, offset) + + if raw_chain_part_matches: + grouped_matches_dict = self._group_by_match_index(chain_part_matches) + grouped_raw_matches_dict = self._group_by_match_index(raw_chain_part_matches) + + for match_index, grouped_raw_matches in grouped_raw_matches_dict.items(): + chain_found = True + offset = grouped_raw_matches[-1].raw_end + chain_input_string = input_string[offset:] + + if not chain_part.is_hidden: + grouped_matches = grouped_matches_dict.get(match_index, []) + if self._chain_breaker_eval(current_chain_matches + grouped_matches): + current_chain_matches.extend(grouped_matches) + return chain_found, chain_input_string, offset + + def _process_match(self, match, match_index, child=False): + """ + Handle a match + :param match: + :type match: + :param match_index: + :type match_index: + :param child: + :type child: + :return: + :rtype: + """ + # pylint: disable=too-many-locals + ret = super(Chain, self)._process_match(match, match_index, child=child) + if ret: + return True + + if match.children: + last_pattern = match.children[-1].pattern + last_pattern_groups = self._group_by_match_index( + [child_ for child_ in match.children if child_.pattern == last_pattern] + ) + + if last_pattern_groups: + original_children = Matches(match.children) + original_end = match.end + + for index in reversed(list(last_pattern_groups)): + last_matches = last_pattern_groups[index] + for last_match in last_matches: + match.children.remove(last_match) + match.end = match.children[-1].end if match.children else match.start + ret = super(Chain, self)._process_match(match, match_index, child=child) + if ret: + return True + + match.children = original_children + match.end = original_end + + return False + + def _build_chain_match(self, current_chain_matches, input_string): + start = None + end = None + for match in current_chain_matches: + if start is None or start > match.start: + start = match.start + if end is None or end < match.end: + end = match.end + match = call(Match, start, end, pattern=self, input_string=input_string, **self._match_kwargs) + for chain_match in current_chain_matches: + if chain_match.children: + for child in chain_match.children: + match.children.append(child) + if chain_match not in match.children: + match.children.append(chain_match) + chain_match.parent = match + return match + + def _chain_breaker_eval(self, matches): + return not self.chain_breaker or not self.chain_breaker(Matches(matches)) + + @staticmethod + def _fix_matches_offset(chain_part_matches, input_string, offset): + for chain_part_match in chain_part_matches: + if chain_part_match.input_string != input_string: + chain_part_match.input_string = input_string + chain_part_match.end += offset + chain_part_match.start += offset + if chain_part_match.children: + Chain._fix_matches_offset(chain_part_match.children, input_string, offset) + + @staticmethod + def _group_by_match_index(matches): + grouped_matches_dict = dict() + for match_index, match in itertools.groupby(matches, lambda m: m.match_index): + grouped_matches_dict[match_index] = list(match) + return grouped_matches_dict + + @property + def match_options(self): + return {} + + @property + def patterns(self): + return [self] + + def __repr__(self): + defined = "" + if self.defined_at: + defined = "@%s" % (self.defined_at,) + return "<%s%s:%s>" % (self.__class__.__name__, defined, self.parts) + + +class ChainPart(BasePattern): + """ + Part of a pattern chain. + """ + + def __init__(self, chain, pattern): + self._chain = chain + self.pattern = pattern + self.repeater_start = 1 + self.repeater_end = 1 + self._hidden = False + + @property + def _is_chain_start(self): + return self._chain.parts[0] == self + + def matches(self, input_string, context=None, with_raw_matches=False): + matches, raw_matches = self.pattern.matches(input_string, context=context, with_raw_matches=True) + + matches = self._truncate_repeater(matches, input_string) + raw_matches = self._truncate_repeater(raw_matches, input_string) + + self._validate_repeater(raw_matches) + + if with_raw_matches: + return matches, raw_matches + + return matches + + def _truncate_repeater(self, matches, input_string): + if not matches: + return matches + + if not self._is_chain_start: + separator = input_string[0:matches[0].initiator.raw_start] + if separator: + return [] + + j = 1 + for i in range(0, len(matches) - 1): + separator = input_string[matches[i].initiator.raw_end: + matches[i + 1].initiator.raw_start] + if separator: + break + j += 1 + truncated = matches[:j] + if self.repeater_end is not None: + truncated = [m for m in truncated if m.match_index < self.repeater_end] + return truncated + + def _validate_repeater(self, matches): + max_match_index = -1 + if matches: + max_match_index = max([m.match_index for m in matches]) + if max_match_index + 1 < self.repeater_start: + raise _InvalidChainException + + def chain(self): + """ + Add patterns chain, using configuration from this chain + + :return: + :rtype: + """ + return self._chain.chain() + + def hidden(self, hidden=True): + """ + Hide chain part results from global chain result + + :param hidden: + :type hidden: + :return: + :rtype: + """ + self._hidden = hidden + return self + + @property + def is_hidden(self): + """ + Check if the chain part is hidden + :return: + :rtype: + """ + return self._hidden + + def regex(self, *pattern, **kwargs): + """ + Add re pattern + + :param pattern: + :type pattern: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + return self._chain.regex(*pattern, **kwargs) + + def functional(self, *pattern, **kwargs): + """ + Add functional pattern + + :param pattern: + :type pattern: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + return self._chain.functional(*pattern, **kwargs) + + def string(self, *pattern, **kwargs): + """ + Add string pattern + + :param pattern: + :type pattern: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + return self._chain.string(*pattern, **kwargs) + + def close(self): + """ + Close the chain builder to continue registering other patterns + + :return: + :rtype: + """ + return self._chain.close() + + def repeater(self, value): + """ + Define the repeater of the current chain part. + + :param value: + :type value: + :return: + :rtype: + """ + try: + value = int(value) + self.repeater_start = value + self.repeater_end = value + return self + except ValueError: + pass + if value == '+': + self.repeater_start = 1 + self.repeater_end = None + if value == '*': + self.repeater_start = 0 + self.repeater_end = None + elif value == '?': + self.repeater_start = 0 + self.repeater_end = 1 + else: + match = re.match(r'\{\s*(\d*)\s*,?\s*(\d*)\s*\}', value) + if match: + start = match.group(1) + end = match.group(2) + if start or end: + self.repeater_start = int(start) if start else 0 + self.repeater_end = int(end) if end else None + return self + + def __repr__(self): + return "%s({%s,%s})" % (self.pattern, self.repeater_start, self.repeater_end) diff --git a/lib/rebulk/debug.py b/lib/rebulk/debug.py new file mode 100755 index 00000000..2384b26e --- /dev/null +++ b/lib/rebulk/debug.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Debug tools. + +Can be configured by changing values of those variable. + +DEBUG = False +Enable this variable to activate debug features (like defined_at parameters). It can slow down Rebulk + +LOG_LEVEL = 0 +Default log level of generated rebulk logs. +""" + +import inspect +import logging +import os +from collections import namedtuple + + +DEBUG = False +LOG_LEVEL = logging.DEBUG + + +class Frame(namedtuple('Frame', ['lineno', 'package', 'name', 'filename'])): + """ + Stack frame representation. + """ + __slots__ = () + + def __repr__(self): + return "%s#L%s" % (os.path.basename(self.filename), self.lineno) + + +def defined_at(): + """ + Get definition location of a pattern or a match (outside of rebulk package). + :return: + :rtype: + """ + if DEBUG: + frame = inspect.currentframe() + while frame: + try: + if frame.f_globals['__package__'] != __package__: + break + except KeyError: # pragma:no cover + # If package is missing, consider we are in. Workaround for python 3.3. + break + frame = frame.f_back + ret = Frame(frame.f_lineno, + frame.f_globals.get('__package__'), + frame.f_globals.get('__name__'), + frame.f_code.co_filename) + del frame + return ret diff --git a/lib/rebulk/formatters.py b/lib/rebulk/formatters.py new file mode 100755 index 00000000..7175a54a --- /dev/null +++ b/lib/rebulk/formatters.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Formatter functions to use in patterns. + +All those function have last argument as match.value (str). +""" + + +def formatters(*chained_formatters): + """ + Chain formatter functions. + :param chained_formatters: + :type chained_formatters: + :return: + :rtype: + """ + + def formatters_chain(input_string): # pylint:disable=missing-docstring + for chained_formatter in chained_formatters: + input_string = chained_formatter(input_string) + return input_string + + return formatters_chain + + +def default_formatter(input_string): + """ + Default formatter + :param input_string: + :return: + """ + return input_string diff --git a/lib/rebulk/introspector.py b/lib/rebulk/introspector.py new file mode 100755 index 00000000..bfefcb75 --- /dev/null +++ b/lib/rebulk/introspector.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Introspect rebulk object to retrieve capabilities. +""" +from abc import ABCMeta, abstractmethod +from collections import defaultdict + +import six +from .pattern import StringPattern, RePattern, FunctionalPattern +from .utils import extend_safe + + +@six.add_metaclass(ABCMeta) +class Description(object): + """ + Abstract class for a description. + """ + @property + @abstractmethod + def properties(self): # pragma: no cover + """ + Properties of described object. + :return: all properties that described object can generate grouped by name. + :rtype: dict + """ + pass + + +class PatternDescription(Description): + """ + Description of a pattern. + """ + def __init__(self, pattern): # pylint:disable=too-many-branches + self.pattern = pattern + self._properties = defaultdict(list) + + if pattern.properties: + for key, values in pattern.properties.items(): + extend_safe(self._properties[key], values) + elif 'value' in pattern.match_options: + self._properties[pattern.name].append(pattern.match_options['value']) + elif isinstance(pattern, StringPattern): + extend_safe(self._properties[pattern.name], pattern.patterns) + elif isinstance(pattern, RePattern): + if pattern.name and pattern.name not in pattern.private_names: + extend_safe(self._properties[pattern.name], [None]) + if not pattern.private_children: + for regex_pattern in pattern.patterns: + for group_name, values in regex_pattern.groupindex.items(): + if group_name not in pattern.private_names: + extend_safe(self._properties[group_name], [None]) + elif isinstance(pattern, FunctionalPattern): + if pattern.name and pattern.name not in pattern.private_names: + extend_safe(self._properties[pattern.name], [None]) + + + @property + def properties(self): + """ + Properties for this rule. + :return: + :rtype: dict + """ + return self._properties + + +class RuleDescription(Description): + """ + Description of a rule. + """ + def __init__(self, rule): + self.rule = rule + + self._properties = defaultdict(list) + + if rule.properties: + for key, values in rule.properties.items(): + extend_safe(self._properties[key], values) + + @property + def properties(self): + """ + Properties for this rule. + :return: + :rtype: dict + """ + return self._properties + + +class Introspection(Description): + """ + Introspection results. + """ + def __init__(self, rebulk, context=None): + self.patterns = [PatternDescription(pattern) for pattern in rebulk.effective_patterns(context) + if not pattern.private and not pattern.marker] + self.rules = [RuleDescription(rule) for rule in rebulk.effective_rules(context)] + + @property + def properties(self): + """ + Properties for Introspection results. + :return: + :rtype: + """ + properties = defaultdict(list) + for pattern in self.patterns: + for key, values in pattern.properties.items(): + extend_safe(properties[key], values) + for rule in self.rules: + for key, values in rule.properties.items(): + extend_safe(properties[key], values) + return properties + + +def introspect(rebulk, context=None): + """ + Introspect a Rebulk instance to grab defined objects and properties that can be generated. + :param rebulk: + :type rebulk: Rebulk + :param context: + :type context: + :return: Introspection instance + :rtype: Introspection + """ + return Introspection(rebulk, context) diff --git a/lib/rebulk/loose.py b/lib/rebulk/loose.py new file mode 100755 index 00000000..5e747a88 --- /dev/null +++ b/lib/rebulk/loose.py @@ -0,0 +1,242 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Various utilities functions +""" + +import sys + +from inspect import isclass +try: + from inspect import getfullargspec as getargspec + + _fullargspec_supported = True +except ImportError: + _fullargspec_supported = False + from inspect import getargspec + +from .utils import is_iterable + +if sys.version_info < (3, 4, 0): # pragma: no cover + def _constructor(class_): + """ + Retrieves constructor from given class + + :param class_: + :type class_: class + :return: constructor from given class + :rtype: callable + """ + return class_.__init__ +else: # pragma: no cover + def _constructor(class_): + """ + Retrieves constructor from given class + + :param class_: + :type class_: class + :return: constructor from given class + :rtype: callable + """ + return class_ + + +def call(function, *args, **kwargs): + """ + Call a function or constructor with given args and kwargs after removing args and kwargs that doesn't match + function or constructor signature + + :param function: Function or constructor to call + :type function: callable + :param args: + :type args: + :param kwargs: + :type kwargs: + :return: sale vakye as default function call + :rtype: object + """ + func = constructor_args if isclass(function) else function_args + call_args, call_kwargs = func(function, *args, **kwargs) + return function(*call_args, **call_kwargs) + + +def function_args(callable_, *args, **kwargs): + """ + Return (args, kwargs) matching the function signature + + :param callable: callable to inspect + :type callable: callable + :param args: + :type args: + :param kwargs: + :type kwargs: + :return: (args, kwargs) matching the function signature + :rtype: tuple + """ + argspec = getargspec(callable_) # pylint:disable=deprecated-method + return argspec_args(argspec, False, *args, **kwargs) + + +def constructor_args(class_, *args, **kwargs): + """ + Return (args, kwargs) matching the function signature + + :param callable: callable to inspect + :type callable: Callable + :param args: + :type args: + :param kwargs: + :type kwargs: + :return: (args, kwargs) matching the function signature + :rtype: tuple + """ + argspec = getargspec(_constructor(class_)) # pylint:disable=deprecated-method + return argspec_args(argspec, True, *args, **kwargs) + + +def argspec_args(argspec, constructor, *args, **kwargs): + """ + Return (args, kwargs) matching the argspec object + + :param argspec: argspec to use + :type argspec: argspec + :param constructor: is it a constructor ? + :type constructor: bool + :param args: + :type args: + :param kwargs: + :type kwargs: + :return: (args, kwargs) matching the function signature + :rtype: tuple + """ + if argspec.varkw: + call_kwarg = kwargs + else: + call_kwarg = dict((k, kwargs[k]) for k in kwargs if k in argspec.args) # Python 2.6 dict comprehension + if argspec.varargs: + call_args = args + else: + call_args = args[:len(argspec.args) - (1 if constructor else 0)] + return call_args, call_kwarg + + +if not _fullargspec_supported: + def argspec_args_legacy(argspec, constructor, *args, **kwargs): + """ + Return (args, kwargs) matching the argspec object + + :param argspec: argspec to use + :type argspec: argspec + :param constructor: is it a constructor ? + :type constructor: bool + :param args: + :type args: + :param kwargs: + :type kwargs: + :return: (args, kwargs) matching the function signature + :rtype: tuple + """ + if argspec.keywords: + call_kwarg = kwargs + else: + call_kwarg = dict((k, kwargs[k]) for k in kwargs if k in argspec.args) # Python 2.6 dict comprehension + if argspec.varargs: + call_args = args + else: + call_args = args[:len(argspec.args) - (1 if constructor else 0)] + return call_args, call_kwarg + + + argspec_args = argspec_args_legacy + + +def ensure_list(param): + """ + Retrieves a list from given parameter. + + :param param: + :type param: + :return: + :rtype: + """ + if not param: + param = [] + elif not is_iterable(param): + param = [param] + return param + + +def ensure_dict(param, default_value, default_key=None): + """ + Retrieves a dict and a default value from given parameter. + + if parameter is not a dict, it will be promoted as the default value. + + :param param: + :type param: + :param default_value: + :type default_value: + :param default_key: + :type default_key: + :return: + :rtype: + """ + if not param: + param = default_value + if not isinstance(param, dict): + if param: + default_value = param + return {default_key: param}, default_value + return param, default_value + + +def filter_index(collection, predicate=None, index=None): + """ + Filter collection with predicate function and index. + + If index is not found, returns None. + :param collection: + :type collection: collection supporting iteration and slicing + :param predicate: function to filter the collection with + :type predicate: function + :param index: position of a single element to retrieve + :type index: int + :return: filtered list, or single element of filtered list if index is defined + :rtype: list or object + """ + if index is None and isinstance(predicate, int): + index = predicate + predicate = None + if predicate: + collection = collection.__class__(filter(predicate, collection)) + if index is not None: + try: + collection = collection[index] + except IndexError: + collection = None + return collection + + +def set_defaults(defaults, kwargs, override=False): + """ + Set defaults from defaults dict to kwargs dict + + :param override: + :type override: + :param defaults: + :type defaults: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + if 'clear' in defaults.keys() and defaults.pop('clear'): + kwargs.clear() + for key, value in defaults.items(): + if key in kwargs: + if isinstance(value, list) and isinstance(kwargs[key], list): + kwargs[key] = list(value) + kwargs[key] + elif isinstance(value, dict) and isinstance(kwargs[key], dict): + set_defaults(value, kwargs[key]) + if key not in kwargs or override: + kwargs[key] = value diff --git a/lib/rebulk/match.py b/lib/rebulk/match.py new file mode 100755 index 00000000..d8e72df4 --- /dev/null +++ b/lib/rebulk/match.py @@ -0,0 +1,890 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Classes and functions related to matches +""" +import copy +import itertools +from collections import defaultdict +try: + from collections.abc import MutableSequence +except ImportError: + from collections import MutableSequence + +try: + from collections import OrderedDict # pylint:disable=ungrouped-imports +except ImportError: # pragma: no cover + from ordereddict import OrderedDict # pylint:disable=import-error +import six + +from .loose import ensure_list, filter_index +from .utils import is_iterable +from .debug import defined_at + + +class MatchesDict(OrderedDict): + """ + A custom dict with matches property. + """ + + def __init__(self): + super(MatchesDict, self).__init__() + self.matches = defaultdict(list) + self.values_list = defaultdict(list) + + +class _BaseMatches(MutableSequence): + """ + A custom list[Match] that automatically maintains name, tag, start and end lookup structures. + """ + _base = list + _base_add = _base.append + _base_remove = _base.remove + _base_extend = _base.extend + + def __init__(self, matches=None, input_string=None): # pylint: disable=super-init-not-called + self.input_string = input_string + self._max_end = 0 + self._delegate = [] + self.__name_dict = None + self.__tag_dict = None + self.__start_dict = None + self.__end_dict = None + self.__index_dict = None + if matches: + self.extend(matches) + + @property + def _name_dict(self): + if self.__name_dict is None: + self.__name_dict = defaultdict(_BaseMatches._base) + for name, values in itertools.groupby([m for m in self._delegate if m.name], lambda item: item.name): + _BaseMatches._base_extend(self.__name_dict[name], values) + + return self.__name_dict + + @property + def _start_dict(self): + if self.__start_dict is None: + self.__start_dict = defaultdict(_BaseMatches._base) + for start, values in itertools.groupby([m for m in self._delegate], lambda item: item.start): + _BaseMatches._base_extend(self.__start_dict[start], values) + + return self.__start_dict + + @property + def _end_dict(self): + if self.__end_dict is None: + self.__end_dict = defaultdict(_BaseMatches._base) + for start, values in itertools.groupby([m for m in self._delegate], lambda item: item.end): + _BaseMatches._base_extend(self.__end_dict[start], values) + + return self.__end_dict + + @property + def _tag_dict(self): + if self.__tag_dict is None: + self.__tag_dict = defaultdict(_BaseMatches._base) + for match in self._delegate: + for tag in match.tags: + _BaseMatches._base_add(self.__tag_dict[tag], match) + + return self.__tag_dict + + @property + def _index_dict(self): + if self.__index_dict is None: + self.__index_dict = defaultdict(_BaseMatches._base) + for match in self._delegate: + for index in range(*match.span): + _BaseMatches._base_add(self.__index_dict[index], match) + + return self.__index_dict + + def _add_match(self, match): + """ + Add a match + :param match: + :type match: Match + """ + if self.__name_dict is not None: + if match.name: + _BaseMatches._base_add(self._name_dict[match.name], (match)) + if self.__tag_dict is not None: + for tag in match.tags: + _BaseMatches._base_add(self._tag_dict[tag], match) + if self.__start_dict is not None: + _BaseMatches._base_add(self._start_dict[match.start], match) + if self.__end_dict is not None: + _BaseMatches._base_add(self._end_dict[match.end], match) + if self.__index_dict is not None: + for index in range(*match.span): + _BaseMatches._base_add(self._index_dict[index], match) + if match.end > self._max_end: + self._max_end = match.end + + def _remove_match(self, match): + """ + Remove a match + :param match: + :type match: Match + """ + if self.__name_dict is not None: + if match.name: + _BaseMatches._base_remove(self._name_dict[match.name], match) + if self.__tag_dict is not None: + for tag in match.tags: + _BaseMatches._base_remove(self._tag_dict[tag], match) + if self.__start_dict is not None: + _BaseMatches._base_remove(self._start_dict[match.start], match) + if self.__end_dict is not None: + _BaseMatches._base_remove(self._end_dict[match.end], match) + if self.__index_dict is not None: + for index in range(*match.span): + _BaseMatches._base_remove(self._index_dict[index], match) + if match.end >= self._max_end and not self._end_dict[match.end]: + self._max_end = max(self._end_dict.keys()) + + def previous(self, match, predicate=None, index=None): + """ + Retrieves the nearest previous matches. + :param match: + :type match: + :param predicate: + :type predicate: + :param index: + :type index: int + :return: + :rtype: + """ + current = match.start + while current > -1: + previous_matches = self.ending(current) + if previous_matches: + return filter_index(previous_matches, predicate, index) + current -= 1 + return filter_index(_BaseMatches._base(), predicate, index) + + def next(self, match, predicate=None, index=None): + """ + Retrieves the nearest next matches. + :param match: + :type match: + :param predicate: + :type predicate: + :param index: + :type index: int + :return: + :rtype: + """ + current = match.start + 1 + while current <= self._max_end: + next_matches = self.starting(current) + if next_matches: + return filter_index(next_matches, predicate, index) + current += 1 + return filter_index(_BaseMatches._base(), predicate, index) + + def named(self, name, predicate=None, index=None): + """ + Retrieves a set of Match objects that have the given name. + :param name: + :type name: str + :param predicate: + :type predicate: + :param index: + :type index: int + :return: set of matches + :rtype: set[Match] + """ + return filter_index(_BaseMatches._base(self._name_dict[name]), predicate, index) + + def tagged(self, tag, predicate=None, index=None): + """ + Retrieves a set of Match objects that have the given tag defined. + :param tag: + :type tag: str + :param predicate: + :type predicate: + :param index: + :type index: int + :return: set of matches + :rtype: set[Match] + """ + return filter_index(_BaseMatches._base(self._tag_dict[tag]), predicate, index) + + def starting(self, start, predicate=None, index=None): + """ + Retrieves a set of Match objects that starts at given index. + :param start: the starting index + :type start: int + :param predicate: + :type predicate: + :param index: + :type index: int + :return: set of matches + :rtype: set[Match] + """ + return filter_index(_BaseMatches._base(self._start_dict[start]), predicate, index) + + def ending(self, end, predicate=None, index=None): + """ + Retrieves a set of Match objects that ends at given index. + :param end: the ending index + :type end: int + :param predicate: + :type predicate: + :return: set of matches + :rtype: set[Match] + """ + return filter_index(_BaseMatches._base(self._end_dict[end]), predicate, index) + + def range(self, start=0, end=None, predicate=None, index=None): + """ + Retrieves a set of Match objects that are available in given range, sorted from start to end. + :param start: the starting index + :type start: int + :param end: the ending index + :type end: int + :param predicate: + :type predicate: + :param index: + :type index: int + :return: set of matches + :rtype: set[Match] + """ + if end is None: + end = self.max_end + else: + end = min(self.max_end, end) + ret = _BaseMatches._base() + for match in sorted(self): + if match.start < end and match.end > start: + ret.append(match) + return filter_index(ret, predicate, index) + + def chain_before(self, position, seps, start=0, predicate=None, index=None): + """ + Retrieves a list of chained matches, before position, matching predicate and separated by characters from seps + only. + :param position: + :type position: + :param seps: + :type seps: + :param start: + :type start: + :param predicate: + :type predicate: + :param index: + :type index: + :return: + :rtype: + """ + if hasattr(position, 'start'): + position = position.start + + chain = _BaseMatches._base() + position = min(self.max_end, position) + + for i in reversed(range(start, position)): + index_matches = self.at_index(i) + filtered_matches = [index_match for index_match in index_matches if not predicate or predicate(index_match)] + if filtered_matches: + for chain_match in filtered_matches: + if chain_match not in chain: + chain.append(chain_match) + elif self.input_string[i] not in seps: + break + + return filter_index(chain, predicate, index) + + def chain_after(self, position, seps, end=None, predicate=None, index=None): + """ + Retrieves a list of chained matches, after position, matching predicate and separated by characters from seps + only. + :param position: + :type position: + :param seps: + :type seps: + :param end: + :type end: + :param predicate: + :type predicate: + :param index: + :type index: + :return: + :rtype: + """ + if hasattr(position, 'end'): + position = position.end + chain = _BaseMatches._base() + + if end is None: + end = self.max_end + else: + end = min(self.max_end, end) + + for i in range(position, end): + index_matches = self.at_index(i) + filtered_matches = [index_match for index_match in index_matches if not predicate or predicate(index_match)] + if filtered_matches: + for chain_match in filtered_matches: + if chain_match not in chain: + chain.append(chain_match) + elif self.input_string[i] not in seps: + break + + return filter_index(chain, predicate, index) + + @property + def max_end(self): + """ + Retrieves the maximum index. + :return: + """ + return max(len(self.input_string), self._max_end) if self.input_string else self._max_end + + def _hole_start(self, position, ignore=None): + """ + Retrieves the start of hole index from position. + :param position: + :type position: + :param ignore: + :type ignore: + :return: + :rtype: + """ + for lindex in reversed(range(0, position)): + for starting in self.starting(lindex): + if not ignore or not ignore(starting): + return lindex + return 0 + + def _hole_end(self, position, ignore=None): + """ + Retrieves the end of hole index from position. + :param position: + :type position: + :param ignore: + :type ignore: + :return: + :rtype: + """ + for rindex in range(position, self.max_end): + for starting in self.starting(rindex): + if not ignore or not ignore(starting): + return rindex + return self.max_end + + def holes(self, start=0, end=None, formatter=None, ignore=None, seps=None, predicate=None, + index=None): # pylint: disable=too-many-branches,too-many-locals + """ + Retrieves a set of Match objects that are not defined in given range. + :param start: + :type start: + :param end: + :type end: + :param formatter: + :type formatter: + :param ignore: + :type ignore: + :param seps: + :type seps: + :param predicate: + :type predicate: + :param index: + :type index: + :return: + :rtype: + """ + assert self.input_string if seps else True, "input_string must be defined when using seps parameter" + if end is None: + end = self.max_end + else: + end = min(self.max_end, end) + ret = _BaseMatches._base() + hole = False + rindex = start + + loop_start = self._hole_start(start, ignore) + + for rindex in range(loop_start, end): + current = [] + for at_index in self.at_index(rindex): + if not ignore or not ignore(at_index): + current.append(at_index) + + if seps and hole and self.input_string and self.input_string[rindex] in seps: + hole = False + ret[-1].end = rindex + else: + if not current and not hole: + # Open a new hole match + hole = True + ret.append(Match(max(rindex, start), None, input_string=self.input_string, formatter=formatter)) + elif current and hole: + # Close current hole match + hole = False + ret[-1].end = rindex + + if ret and hole: + # go the the next starting element ... + ret[-1].end = min(self._hole_end(rindex, ignore), end) + return filter_index(ret, predicate, index) + + def conflicting(self, match, predicate=None, index=None): + """ + Retrieves a list of ``Match`` objects that conflicts with given match. + :param match: + :type match: + :param predicate: + :type predicate: + :param index: + :type index: + :return: + :rtype: + """ + ret = _BaseMatches._base() + + for i in range(*match.span): + for at_match in self.at_index(i): + if at_match not in ret: + ret.append(at_match) + + ret.remove(match) + + return filter_index(ret, predicate, index) + + def at_match(self, match, predicate=None, index=None): + """ + Retrieves a list of matches from given match. + """ + return self.at_span(match.span, predicate, index) + + def at_span(self, span, predicate=None, index=None): + """ + Retrieves a list of matches from given (start, end) tuple. + """ + starting = self._index_dict[span[0]] + ending = self._index_dict[span[1] - 1] + + merged = list(starting) + for marker in ending: + if marker not in merged: + merged.append(marker) + + return filter_index(merged, predicate, index) + + def at_index(self, pos, predicate=None, index=None): + """ + Retrieves a list of matches from given position + """ + return filter_index(self._index_dict[pos], predicate, index) + + @property + def names(self): + """ + Retrieve all names. + :return: + """ + return self._name_dict.keys() + + @property + def tags(self): + """ + Retrieve all tags. + :return: + """ + return self._tag_dict.keys() + + def to_dict(self, details=False, first_value=False, enforce_list=False): + """ + Converts matches to a dict object. + :param details if True, values will be complete Match object, else it will be only string Match.value property + :type details: bool + :param first_value if True, only the first value will be kept. Else, multiple values will be set as a list in + the dict. + :type first_value: bool + :param enforce_list: if True, value is wrapped in a list even when a single value is found. Else, list values + are available under `values_list` property of the returned dict object. + :type enforce_list: bool + :return: + :rtype: dict + """ + ret = MatchesDict() + for match in sorted(self): + value = match if details else match.value + ret.matches[match.name].append(match) + if not enforce_list and value not in ret.values_list[match.name]: + ret.values_list[match.name].append(value) + if match.name in ret.keys(): + if not first_value: + if not isinstance(ret[match.name], list): + if ret[match.name] == value: + continue + ret[match.name] = [ret[match.name]] + else: + if value in ret[match.name]: + continue + ret[match.name].append(value) + else: + if enforce_list and not isinstance(value, list): + ret[match.name] = [value] + else: + ret[match.name] = value + return ret + + if six.PY2: # pragma: no cover + def clear(self): + """ + Python 3 backport + """ + del self[:] + + def __len__(self): + return len(self._delegate) + + def __getitem__(self, index): + ret = self._delegate[index] + if isinstance(ret, list): + return Matches(ret) + return ret + + def __setitem__(self, index, match): + self._delegate[index] = match + if isinstance(index, slice): + for match_item in match: + self._add_match(match_item) + return + self._add_match(match) + + def __delitem__(self, index): + match = self._delegate[index] + del self._delegate[index] + if isinstance(match, list): + # if index is a slice, we has a match list + for match_item in match: + self._remove_match(match_item) + else: + self._remove_match(match) + + def __repr__(self): + return self._delegate.__repr__() + + def insert(self, index, value): + self._delegate.insert(index, value) + self._add_match(value) + + +class Matches(_BaseMatches): + """ + A custom list[Match] contains matches list. + """ + + def __init__(self, matches=None, input_string=None): + self.markers = Markers(input_string=input_string) + super(Matches, self).__init__(matches=matches, input_string=input_string) + + def _add_match(self, match): + assert not match.marker, "A marker match should not be added to <Matches> object" + super(Matches, self)._add_match(match) + + +class Markers(_BaseMatches): + """ + A custom list[Match] containing markers list. + """ + + def __init__(self, matches=None, input_string=None): + super(Markers, self).__init__(matches=None, input_string=input_string) + + def _add_match(self, match): + assert match.marker, "A non-marker match should not be added to <Markers> object" + super(Markers, self)._add_match(match) + + +class Match(object): + """ + Object storing values related to a single match + """ + + def __init__(self, start, end, value=None, name=None, tags=None, marker=None, parent=None, private=None, + pattern=None, input_string=None, formatter=None, conflict_solver=None, **kwargs): + # pylint: disable=unused-argument + self.start = start + self.end = end + self.name = name + self._value = value + self.tags = ensure_list(tags) + self.marker = marker + self.parent = parent + self.input_string = input_string + self.formatter = formatter + self.pattern = pattern + self.private = private + self.conflict_solver = conflict_solver + self._children = None + self._raw_start = None + self._raw_end = None + self.defined_at = pattern.defined_at if pattern else defined_at() + + @property + def span(self): + """ + 2-tuple with start and end indices of the match + """ + return self.start, self.end + + @property + def children(self): + """ + Children matches. + """ + if self._children is None: + self._children = Matches(None, self.input_string) + return self._children + + @children.setter + def children(self, value): + self._children = value + + @property + def value(self): + """ + Get the value of the match, using formatter if defined. + :return: + :rtype: + """ + if self._value: + return self._value + if self.formatter: + return self.formatter(self.raw) + return self.raw + + @value.setter + def value(self, value): + """ + Set the value (hardcode) + :param value: + :type value: + :return: + :rtype: + """ + self._value = value # pylint: disable=attribute-defined-outside-init + + @property + def names(self): + """ + Get all names of children + :return: + :rtype: + """ + if not self.children: + return set([self.name]) + ret = set() + for child in self.children: + for name in child.names: + ret.add(name) + return ret + + @property + def raw_start(self): + """ + start index of raw value + :return: + :rtype: + """ + if self._raw_start is None: + return self.start + return self._raw_start + + @raw_start.setter + def raw_start(self, value): + """ + Set start index of raw value + :return: + :rtype: + """ + self._raw_start = value + + @property + def raw_end(self): + """ + end index of raw value + :return: + :rtype: + """ + if self._raw_end is None: + return self.end + return self._raw_end + + @raw_end.setter + def raw_end(self, value): + """ + Set end index of raw value + :return: + :rtype: + """ + self._raw_end = value + + @property + def raw(self): + """ + Get the raw value of the match, without using hardcoded value nor formatter. + :return: + :rtype: + """ + if self.input_string: + return self.input_string[self.raw_start:self.raw_end] + return None + + @property + def initiator(self): + """ + Retrieve the initiator parent of a match + :param match: + :type match: + :return: + :rtype: + """ + match = self + while match.parent: + match = match.parent + return match + + def crop(self, crops, predicate=None, index=None): + """ + crop the match with given Match objects or spans tuples + :param crops: + :type crops: list or object + :return: a list of Match objects + :rtype: list[Match] + """ + if not is_iterable(crops) or len(crops) == 2 and isinstance(crops[0], int): + crops = [crops] + initial = copy.deepcopy(self) + ret = [initial] + for crop in crops: + if hasattr(crop, 'span'): + start, end = crop.span + else: + start, end = crop + for current in list(ret): + if start <= current.start and end >= current.end: + # self is included in crop, remove current ... + ret.remove(current) + elif start >= current.start and end <= current.end: + # crop is included in self, split current ... + right = copy.deepcopy(current) + current.end = start + if not current: + ret.remove(current) + right.start = end + if right: + ret.append(right) + elif current.end >= end > current.start: + current.start = end + elif current.start <= start < current.end: + current.end = start + return filter_index(ret, predicate, index) + + def split(self, seps, predicate=None, index=None): + """ + Split this match in multiple matches using given separators. + :param seps: + :type seps: string containing separator characters + :return: list of new Match objects + :rtype: list + """ + split_match = copy.deepcopy(self) + current_match = split_match + ret = [] + + for i in range(0, len(self.raw)): + if self.raw[i] in seps: + if not split_match: + split_match = copy.deepcopy(current_match) + current_match.end = self.start + i + + else: + if split_match: + split_match.start = self.start + i + current_match = split_match + ret.append(split_match) + split_match = None + + return filter_index(ret, predicate, index) + + def tagged(self, *tags): + """ + Check if this match has at least one of the provided tags + + :param tags: + :return: True if at least one tag is defined, False otherwise. + """ + return any(tag in self.tags for tag in tags) + + def named(self, *names): + """ + Check if one of the children match has one of the provided name + + :param names: + :return: True if at least one child is named with a given name is defined, False otherwise. + """ + return any(name in self.names for name in names) + + def __len__(self): + return self.end - self.start + + def __hash__(self): + return hash(Match) + hash(self.start) + hash(self.end) + hash(self.value) + + def __eq__(self, other): + if isinstance(other, Match): + return self.span == other.span and self.value == other.value and self.name == other.name and \ + self.parent == other.parent + return NotImplemented + + def __ne__(self, other): + if isinstance(other, Match): + return self.span != other.span or self.value != other.value or self.name != other.name or \ + self.parent != other.parent + return NotImplemented + + def __lt__(self, other): + if isinstance(other, Match): + return self.span < other.span + return NotImplemented + + def __gt__(self, other): + if isinstance(other, Match): + return self.span > other.span + return NotImplemented + + def __le__(self, other): + if isinstance(other, Match): + return self.span <= other.span + return NotImplemented + + def __ge__(self, other): + if isinstance(other, Match): + return self.span >= other.span + return NotImplemented + + def __repr__(self): + flags = "" + name = "" + tags = "" + defined = "" + initiator = "" + if self.initiator.value != self.value: + initiator = "+initiator=" + self.initiator.value + if self.private: + flags += '+private' + if self.name: + name = "+name=%s" % (self.name,) + if self.tags: + tags = "+tags=%s" % (self.tags,) + if self.defined_at: + defined += "@%s" % (self.defined_at,) + return "<%s:%s%s%s%s%s%s>" % (self.value, self.span, flags, name, tags, initiator, defined) diff --git a/lib/rebulk/pattern.py b/lib/rebulk/pattern.py new file mode 100755 index 00000000..beb8b273 --- /dev/null +++ b/lib/rebulk/pattern.py @@ -0,0 +1,559 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Abstract pattern class definition along with various implementations (regexp, string, functional) +""" +# pylint: disable=super-init-not-called,wrong-import-position + +from abc import ABCMeta, abstractmethod, abstractproperty + +import six + +from . import debug +from .formatters import default_formatter +from .loose import call, ensure_list, ensure_dict +from .match import Match +from .remodule import re, REGEX_AVAILABLE +from .utils import find_all, is_iterable, get_first_defined +from .validators import allways_true + + +@six.add_metaclass(ABCMeta) +class BasePattern(object): + """ + Base class for Pattern like objects + """ + + @abstractmethod + def matches(self, input_string, context=None, with_raw_matches=False): + """ + Computes all matches for a given input + + :param input_string: the string to parse + :type input_string: str + :param context: the context + :type context: dict + :param with_raw_matches: should return details + :type with_raw_matches: dict + :return: matches based on input_string for this pattern + :rtype: iterator[Match] + """ + pass + + +@six.add_metaclass(ABCMeta) +class Pattern(BasePattern): + """ + Definition of a particular pattern to search for. + """ + + def __init__(self, name=None, tags=None, formatter=None, value=None, validator=None, children=False, every=False, + private_parent=False, private_children=False, private=False, private_names=None, ignore_names=None, + marker=False, format_all=False, validate_all=False, disabled=lambda context: False, log_level=None, + properties=None, post_processor=None, pre_match_processor=None, post_match_processor=None, **kwargs): + """ + :param name: Name of this pattern + :type name: str + :param tags: List of tags related to this pattern + :type tags: list[str] + :param formatter: dict (name, func) of formatter to use with this pattern. name is the match name to support, + and func a function(input_string) that returns the formatted string. A single formatter function can also be + passed as a shortcut for {None: formatter}. The returned formatted string with be set in Match.value property. + :type formatter: dict[str, func] || func + :param value: dict (name, value) of value to use with this pattern. name is the match name to support, + and value an object for the match value. A single object value can also be + passed as a shortcut for {None: value}. The value with be set in Match.value property. + :type value: dict[str, object] || object + :param validator: dict (name, func) of validator to use with this pattern. name is the match name to support, + and func a function(match) that returns the a boolean. A single validator function can also be + passed as a shortcut for {None: validator}. If return value is False, match will be ignored. + :param children: generates children instead of parent + :type children: bool + :param every: generates both parent and children. + :type every: bool + :param private: flag this pattern as beeing private. + :type private: bool + :param private_parent: force return of parent and flag parent matches as private. + :type private_parent: bool + :param private_children: force return of children and flag children matches as private. + :type private_children: bool + :param private_names: force return of named matches as private. + :type private_names: bool + :param ignore_names: drop some named matches after validation. + :type ignore_names: bool + :param marker: flag this pattern as beeing a marker. + :type private: bool + :param format_all if True, pattern will format every match in the hierarchy (even match not yield). + :type format_all: bool + :param validate_all if True, pattern will validate every match in the hierarchy (even match not yield). + :type validate_all: bool + :param disabled: if True, this pattern is disabled. Can also be a function(context). + :type disabled: bool|function + :param log_lvl: Log level associated to this pattern + :type log_lvl: int + :param post_processor: Post processing function + :type post_processor: func + :param pre_match_processor: Pre match processing function + :type pre_match_processor: func + :param post_match_processor: Post match processing function + :type post_match_processor: func + """ + # pylint:disable=too-many-locals,unused-argument + self.name = name + self.tags = ensure_list(tags) + self.formatters, self._default_formatter = ensure_dict(formatter, default_formatter) + self.values, self._default_value = ensure_dict(value, None) + self.validators, self._default_validator = ensure_dict(validator, allways_true) + self.every = every + self.children = children + self.private = private + self.private_names = private_names if private_names else [] + self.ignore_names = ignore_names if ignore_names else [] + self.private_parent = private_parent + self.private_children = private_children + self.marker = marker + self.format_all = format_all + self.validate_all = validate_all + if not callable(disabled): + self.disabled = lambda context: disabled + else: + self.disabled = disabled + self._log_level = log_level + self._properties = properties + self.defined_at = debug.defined_at() + if not callable(post_processor): + self.post_processor = None + else: + self.post_processor = post_processor + if not callable(pre_match_processor): + self.pre_match_processor = None + else: + self.pre_match_processor = pre_match_processor + if not callable(post_match_processor): + self.post_match_processor = None + else: + self.post_match_processor = post_match_processor + + @property + def log_level(self): + """ + Log level for this pattern. + :return: + :rtype: + """ + return self._log_level if self._log_level is not None else debug.LOG_LEVEL + + def matches(self, input_string, context=None, with_raw_matches=False): + """ + Computes all matches for a given input + + :param input_string: the string to parse + :type input_string: str + :param context: the context + :type context: dict + :param with_raw_matches: should return details + :type with_raw_matches: dict + :return: matches based on input_string for this pattern + :rtype: iterator[Match] + """ + # pylint: disable=too-many-branches + + matches = [] + raw_matches = [] + + for pattern in self.patterns: + match_index = 0 + for match in self._match(pattern, input_string, context): + raw_matches.append(match) + matches.extend(self._process_matches(match, match_index)) + match_index += 1 + + matches = self._post_process_matches(matches) + + if with_raw_matches: + return matches, raw_matches + return matches + + @property + def _should_include_children(self): + """ + Check if children matches from this pattern should be included in matches results. + :param match: + :type match: + :return: + :rtype: + """ + return self.children or self.every + + @property + def _should_include_parent(self): + """ + Check is a match from this pattern should be included in matches results. + :param match: + :type match: + :return: + :rtype: + """ + return not self.children or self.every + + @staticmethod + def _match_config_property_keys(match, child=False): + if match.name: + yield match.name + if child: + yield '__children__' + else: + yield '__parent__' + yield None + + @staticmethod + def _process_match_index(match, match_index): + """ + Process match index from this pattern process state. + + :param match: + :return: + """ + match.match_index = match_index + + def _process_match_private(self, match, child=False): + """ + Process match privacy from this pattern configuration. + + :param match: + :param child: + :return: + """ + + if match.name and match.name in self.private_names or \ + not child and self.private_parent or \ + child and self.private_children: + match.private = True + + def _process_match_value(self, match, child=False): + """ + Process match value from this pattern configuration. + :param match: + :return: + """ + keys = self._match_config_property_keys(match, child=child) + pattern_value = get_first_defined(self.values, keys, self._default_value) + if pattern_value: + match.value = pattern_value + + def _process_match_formatter(self, match, child=False): + """ + Process match formatter from this pattern configuration. + + :param match: + :return: + """ + included = self._should_include_children if child else self._should_include_parent + if included or self.format_all: + keys = self._match_config_property_keys(match, child=child) + match.formatter = get_first_defined(self.formatters, keys, self._default_formatter) + + def _process_match_validator(self, match, child=False): + """ + Process match validation from this pattern configuration. + + :param match: + :return: True if match is validated by the configured validator, False otherwise. + """ + included = self._should_include_children if child else self._should_include_parent + if included or self.validate_all: + keys = self._match_config_property_keys(match, child=child) + validator = get_first_defined(self.validators, keys, self._default_validator) + if validator and not validator(match): + return False + return True + + def _process_match(self, match, match_index, child=False): + """ + Process match from this pattern by setting all properties from defined configuration + (index, private, value, formatter, validator, ...). + + :param match: + :type match: + :return: True if match is validated by the configured validator, False otherwise. + :rtype: + """ + self._process_match_index(match, match_index) + self._process_match_private(match, child) + self._process_match_value(match, child) + self._process_match_formatter(match, child) + return self._process_match_validator(match, child) + + @staticmethod + def _process_match_processor(match, processor): + if processor: + ret = processor(match) + if ret is not None: + return ret + return match + + def _process_matches(self, match, match_index): + """ + Process and generate all matches for the given unprocessed match. + :param match: + :param match_index: + :return: Process and dispatched matches. + """ + match = self._process_match_processor(match, self.pre_match_processor) + if not match: + return + + if not self._process_match(match, match_index): + return + + for child in match.children: + if not self._process_match(child, match_index, child=True): + return + + match = self._process_match_processor(match, self.post_match_processor) + if not match: + return + + if (self._should_include_parent or self.private_parent) and match.name not in self.ignore_names: + yield match + if self._should_include_children or self.private_children: + children = [x for x in match.children if x.name not in self.ignore_names] + for child in children: + yield child + + def _post_process_matches(self, matches): + """ + Post process matches with user defined function + :param matches: + :type matches: + :return: + :rtype: + """ + if self.post_processor: + return self.post_processor(matches, self) + return matches + + @abstractproperty + def patterns(self): # pragma: no cover + """ + List of base patterns defined + + :return: A list of base patterns + :rtype: list + """ + pass + + @property + def properties(self): + """ + Properties names and values that can ben retrieved by this pattern. + :return: + :rtype: + """ + if self._properties: + return self._properties + return {} + + @abstractproperty + def match_options(self): # pragma: no cover + """ + dict of default options for generated Match objects + + :return: **options to pass to Match constructor + :rtype: dict + """ + pass + + @abstractmethod + def _match(self, pattern, input_string, context=None): # pragma: no cover + """ + Computes all unprocess matches for a given pattern and input. + + :param pattern: the pattern to use + :param input_string: the string to parse + :type input_string: str + :param context: the context + :type context: dict + :return: matches based on input_string for this pattern + :rtype: iterator[Match] + """ + pass + + def __repr__(self): + defined = "" + if self.defined_at: + defined = "@%s" % (self.defined_at,) + return "<%s%s:%s>" % (self.__class__.__name__, defined, self.__repr__patterns__) + + @property + def __repr__patterns__(self): + return self.patterns + + +class StringPattern(Pattern): + """ + Definition of one or many strings to search for. + """ + + def __init__(self, *patterns, **kwargs): + super(StringPattern, self).__init__(**kwargs) + self._patterns = patterns + self._kwargs = kwargs + self._match_kwargs = filter_match_kwargs(kwargs) + + @property + def patterns(self): + return self._patterns + + @property + def match_options(self): + return self._match_kwargs + + def _match(self, pattern, input_string, context=None): + for index in find_all(input_string, pattern, **self._kwargs): + match = Match(index, index + len(pattern), pattern=self, input_string=input_string, **self._match_kwargs) + if match: + yield match + + +class RePattern(Pattern): + """ + Definition of one or many regular expression pattern to search for. + """ + + def __init__(self, *patterns, **kwargs): + super(RePattern, self).__init__(**kwargs) + self.repeated_captures = REGEX_AVAILABLE + if 'repeated_captures' in kwargs: + self.repeated_captures = kwargs.get('repeated_captures') + if self.repeated_captures and not REGEX_AVAILABLE: # pragma: no cover + raise NotImplementedError("repeated_capture is available only with regex module.") + self.abbreviations = kwargs.get('abbreviations', []) + self._kwargs = kwargs + self._match_kwargs = filter_match_kwargs(kwargs) + self._children_match_kwargs = filter_match_kwargs(kwargs, children=True) + self._patterns = [] + for pattern in patterns: + if isinstance(pattern, six.string_types): + if self.abbreviations and pattern: + for key, replacement in self.abbreviations: + pattern = pattern.replace(key, replacement) + pattern = call(re.compile, pattern, **self._kwargs) + elif isinstance(pattern, dict): + if self.abbreviations and 'pattern' in pattern: + for key, replacement in self.abbreviations: + pattern['pattern'] = pattern['pattern'].replace(key, replacement) + pattern = re.compile(**pattern) + elif hasattr(pattern, '__iter__'): + pattern = re.compile(*pattern) + self._patterns.append(pattern) + + @property + def patterns(self): + return self._patterns + + @property + def __repr__patterns__(self): + return [pattern.pattern for pattern in self.patterns] + + @property + def match_options(self): + return self._match_kwargs + + def _match(self, pattern, input_string, context=None): + names = dict((v, k) for k, v in pattern.groupindex.items()) + for match_object in pattern.finditer(input_string): + start = match_object.start() + end = match_object.end() + main_match = Match(start, end, pattern=self, input_string=input_string, **self._match_kwargs) + + if pattern.groups: + for i in range(1, pattern.groups + 1): + name = names.get(i, main_match.name) + if self.repeated_captures: + for start, end in match_object.spans(i): + child_match = Match(start, end, name=name, parent=main_match, pattern=self, + input_string=input_string, **self._children_match_kwargs) + if child_match: + main_match.children.append(child_match) + else: + start, end = match_object.span(i) + if start > -1 and end > -1: + child_match = Match(start, end, name=name, parent=main_match, pattern=self, + input_string=input_string, **self._children_match_kwargs) + if child_match: + main_match.children.append(child_match) + + if main_match: + yield main_match + + +class FunctionalPattern(Pattern): + """ + Definition of one or many functional pattern to search for. + """ + + def __init__(self, *patterns, **kwargs): + super(FunctionalPattern, self).__init__(**kwargs) + self._patterns = patterns + self._kwargs = kwargs + self._match_kwargs = filter_match_kwargs(kwargs) + + @property + def patterns(self): + return self._patterns + + @property + def match_options(self): + return self._match_kwargs + + def _match(self, pattern, input_string, context=None): + ret = call(pattern, input_string, context, **self._kwargs) + if ret: + if not is_iterable(ret) or isinstance(ret, dict) \ + or (is_iterable(ret) and hasattr(ret, '__getitem__') and isinstance(ret[0], int)): + args_iterable = [ret] + else: + args_iterable = ret + for args in args_iterable: + if isinstance(args, dict): + options = args + options.pop('input_string', None) + options.pop('pattern', None) + if self._match_kwargs: + options = self._match_kwargs.copy() + options.update(args) + match = Match(pattern=self, input_string=input_string, **options) + if match: + yield match + else: + kwargs = self._match_kwargs + if isinstance(args[-1], dict): + kwargs = dict(kwargs) + kwargs.update(args[-1]) + args = args[:-1] + match = Match(*args, pattern=self, input_string=input_string, **kwargs) + if match: + yield match + + +def filter_match_kwargs(kwargs, children=False): + """ + Filters out kwargs for Match construction + + :param kwargs: + :type kwargs: dict + :param children: + :type children: Flag to filter children matches + :return: A filtered dict + :rtype: dict + """ + kwargs = kwargs.copy() + for key in ('pattern', 'start', 'end', 'parent', 'formatter', 'value'): + if key in kwargs: + del kwargs[key] + if children: + for key in ('name',): + if key in kwargs: + del kwargs[key] + return kwargs diff --git a/lib/rebulk/processors.py b/lib/rebulk/processors.py new file mode 100755 index 00000000..6a4f0bab --- /dev/null +++ b/lib/rebulk/processors.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Processor functions +""" +from logging import getLogger + +from .utils import IdentitySet + +from .rules import Rule, RemoveMatch + +log = getLogger(__name__).log + +DEFAULT = '__default__' + +POST_PROCESS = -2048 +PRE_PROCESS = 2048 + + +def _default_conflict_solver(match, conflicting_match): + """ + Default conflict solver for matches, shorter matches if they conflicts with longer ones + + :param conflicting_match: + :type conflicting_match: + :param match: + :type match: + :return: + :rtype: + """ + if len(conflicting_match.initiator) < len(match.initiator): + return conflicting_match + if len(match.initiator) < len(conflicting_match.initiator): + return match + return None + + +class ConflictSolver(Rule): + """ + Remove conflicting matches. + """ + priority = PRE_PROCESS + + consequence = RemoveMatch + + @property + def default_conflict_solver(self): # pylint:disable=no-self-use + """ + Default conflict solver to use. + """ + return _default_conflict_solver + + def when(self, matches, context): + # pylint:disable=too-many-nested-blocks + to_remove_matches = IdentitySet() + + public_matches = [match for match in matches if not match.private] + public_matches.sort(key=len) + + for match in public_matches: + conflicting_matches = matches.conflicting(match) + + if conflicting_matches: + # keep the match only if it's the longest + conflicting_matches = [conflicting_match for conflicting_match in conflicting_matches if + not conflicting_match.private] + conflicting_matches.sort(key=len) + + for conflicting_match in conflicting_matches: + conflict_solvers = [(self.default_conflict_solver, False)] + + if match.conflict_solver: + conflict_solvers.append((match.conflict_solver, False)) + if conflicting_match.conflict_solver: + conflict_solvers.append((conflicting_match.conflict_solver, True)) + + for conflict_solver, reverse in reversed(conflict_solvers): + if reverse: + to_remove = conflict_solver(conflicting_match, match) + else: + to_remove = conflict_solver(match, conflicting_match) + if to_remove == DEFAULT: + continue + if to_remove and to_remove not in to_remove_matches: + both_matches = [match, conflicting_match] + both_matches.remove(to_remove) + to_keep = both_matches[0] + + if to_keep not in to_remove_matches: + log(self.log_level, "Conflicting match %s will be removed in favor of match %s", + to_remove, to_keep) + + to_remove_matches.add(to_remove) + break + return to_remove_matches + + +class PrivateRemover(Rule): + """ + Removes private matches rule. + """ + priority = POST_PROCESS + + consequence = RemoveMatch + + def when(self, matches, context): + return [match for match in matches if match.private] diff --git a/lib/rebulk/rebulk.py b/lib/rebulk/rebulk.py new file mode 100755 index 00000000..a6a0fd2f --- /dev/null +++ b/lib/rebulk/rebulk.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Entry point functions and classes for Rebulk +""" +from logging import getLogger + +from .builder import Builder +from .match import Matches +from .processors import ConflictSolver, PrivateRemover +from .rules import Rules +from .utils import extend_safe + +log = getLogger(__name__).log + + +class Rebulk(Builder): + r""" + Regular expression, string and function based patterns are declared in a ``Rebulk`` object. It use a fluent API to + chain ``string``, ``regex``, and ``functional`` methods to define various patterns types. + + .. code-block:: python + + >>> from rebulk import Rebulk + >>> bulk = Rebulk().string('brown').regex(r'qu\w+').functional(lambda s: (20, 25)) + + When ``Rebulk`` object is fully configured, you can call ``matches`` method with an input string to retrieve all + ``Match`` objects found by registered pattern. + + .. code-block:: python + + >>> bulk.matches("The quick brown fox jumps over the lazy dog") + [<brown:(10, 15)>, <quick:(4, 9)>, <jumps:(20, 25)>] + + If multiple ``Match`` objects are found at the same position, only the longer one is kept. + + .. code-block:: python + + >>> bulk = Rebulk().string('lakers').string('la') + >>> bulk.matches("the lakers are from la") + [<lakers:(4, 10)>, <la:(20, 22)>] + """ + + # pylint:disable=protected-access + + def __init__(self, disabled=lambda context: False, default_rules=True): + """ + Creates a new Rebulk object. + :param disabled: if True, this pattern is disabled. Can also be a function(context). + :type disabled: bool|function + :param default_rules: use default rules + :type default_rules: + :return: + :rtype: + """ + super(Rebulk, self).__init__() + if not callable(disabled): + self.disabled = lambda context: disabled + else: + self.disabled = disabled + self._patterns = [] + self._rules = Rules() + if default_rules: + self.rules(ConflictSolver, PrivateRemover) + self._rebulks = [] + + def pattern(self, *pattern): + """ + Add patterns objects + + :param pattern: + :type pattern: rebulk.pattern.Pattern + :return: self + :rtype: Rebulk + """ + self._patterns.extend(pattern) + return self + + def rules(self, *rules): + """ + Add rules as a module, class or instance. + :param rules: + :type rules: list[Rule] + :return: + """ + self._rules.load(*rules) + return self + + def rebulk(self, *rebulks): + """ + Add a children rebulk object + :param rebulks: + :type rebulks: Rebulk + :return: + """ + self._rebulks.extend(rebulks) + return self + + def matches(self, string, context=None): + """ + Search for all matches with current configuration against input_string + :param string: string to search into + :type string: str + :param context: context to use + :type context: dict + :return: A custom list of matches + :rtype: Matches + """ + matches = Matches(input_string=string) + if context is None: + context = {} + + self._matches_patterns(matches, context) + + self._execute_rules(matches, context) + + return matches + + def effective_rules(self, context=None): + """ + Get effective rules for this rebulk object and its children. + :param context: + :type context: + :return: + :rtype: + """ + rules = Rules() + rules.extend(self._rules) + for rebulk in self._rebulks: + if not rebulk.disabled(context): + extend_safe(rules, rebulk._rules) + return rules + + def _execute_rules(self, matches, context): + """ + Execute rules for this rebulk and children. + :param matches: + :type matches: + :param context: + :type context: + :return: + :rtype: + """ + if not self.disabled(context): + rules = self.effective_rules(context) + rules.execute_all_rules(matches, context) + + def effective_patterns(self, context=None): + """ + Get effective patterns for this rebulk object and its children. + :param context: + :type context: + :return: + :rtype: + """ + patterns = list(self._patterns) + for rebulk in self._rebulks: + if not rebulk.disabled(context): + extend_safe(patterns, rebulk._patterns) + return patterns + + def _matches_patterns(self, matches, context): + """ + Search for all matches with current paterns agains input_string + :param matches: matches list + :type matches: Matches + :param context: context to use + :type context: dict + :return: + :rtype: + """ + if not self.disabled(context): + patterns = self.effective_patterns(context) + for pattern in patterns: + if not pattern.disabled(context): + pattern_matches = pattern.matches(matches.input_string, context) + if pattern_matches: + log(pattern.log_level, "Pattern has %s match(es). (%s)", len(pattern_matches), pattern) + else: + pass + # log(pattern.log_level, "Pattern doesn't match. (%s)" % (pattern,)) + for match in pattern_matches: + if match.marker: + log(pattern.log_level, "Marker found. (%s)", match) + matches.markers.append(match) + else: + log(pattern.log_level, "Match found. (%s)", match) + matches.append(match) + else: + log(pattern.log_level, "Pattern is disabled. (%s)", pattern) diff --git a/lib/rebulk/remodule.py b/lib/rebulk/remodule.py new file mode 100755 index 00000000..d1d68d19 --- /dev/null +++ b/lib/rebulk/remodule.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Uniform re module +""" +# pylint: disable-all +import os + +REGEX_AVAILABLE = False +if os.environ.get('REGEX_DISABLED') in ["1", "true", "True", "Y"]: + import re +else: + try: + import regex as re + REGEX_AVAILABLE = True + except ImportError: + import re diff --git a/lib/rebulk/rules.py b/lib/rebulk/rules.py new file mode 100755 index 00000000..2514904f --- /dev/null +++ b/lib/rebulk/rules.py @@ -0,0 +1,373 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Abstract rule class definition and rule engine implementation +""" +from abc import ABCMeta, abstractmethod +import inspect +from itertools import groupby +from logging import getLogger + +import six +from .utils import is_iterable + +from .toposort import toposort + +from . import debug + +log = getLogger(__name__).log + + +@six.add_metaclass(ABCMeta) +class Consequence(object): + """ + Definition of a consequence to apply. + """ + @abstractmethod + def then(self, matches, when_response, context): # pragma: no cover + """ + Action implementation. + + :param matches: + :type matches: rebulk.match.Matches + :param context: + :type context: + :param when_response: return object from when call. + :type when_response: object + :return: True if the action was runned, False if it wasn't. + :rtype: bool + """ + pass + + +@six.add_metaclass(ABCMeta) +class Condition(object): + """ + Definition of a condition to check. + """ + @abstractmethod + def when(self, matches, context): # pragma: no cover + """ + Condition implementation. + + :param matches: + :type matches: rebulk.match.Matches + :param context: + :type context: + :return: truthy if rule should be triggered and execute then action, falsy if it should not. + :rtype: object + """ + pass + + +@six.add_metaclass(ABCMeta) +class CustomRule(Condition, Consequence): + """ + Definition of a rule to apply + """ + # pylint: disable=no-self-use, unused-argument, abstract-method + priority = 0 + name = None + dependency = None + properties = {} + + def __init__(self, log_level=None): + self.defined_at = debug.defined_at() + if log_level is None and not hasattr(self, 'log_level'): + self.log_level = debug.LOG_LEVEL + + def enabled(self, context): + """ + Disable rule. + + :param context: + :type context: + :return: True if rule is enabled, False if disabled + :rtype: bool + """ + return True + + def __lt__(self, other): + return self.priority > other.priority + + def __repr__(self): + defined = "" + if self.defined_at: + defined = "@%s" % (self.defined_at,) + return "<%s%s>" % (self.name if self.name else self.__class__.__name__, defined) + + def __eq__(self, other): + return self.__class__ == other.__class__ + + def __hash__(self): + return hash(self.__class__) + + +class Rule(CustomRule): + """ + Definition of a rule to apply + """ + # pylint:disable=abstract-method + consequence = None + + def then(self, matches, when_response, context): + assert self.consequence + if is_iterable(self.consequence): + if not is_iterable(when_response): + when_response = [when_response] + iterator = iter(when_response) + for cons in self.consequence: #pylint: disable=not-an-iterable + if inspect.isclass(cons): + cons = cons() + cons.then(matches, next(iterator), context) + else: + cons = self.consequence + if inspect.isclass(cons): + cons = cons() # pylint:disable=not-callable + cons.then(matches, when_response, context) + + +class RemoveMatch(Consequence): # pylint: disable=abstract-method + """ + Remove matches returned by then + """ + def then(self, matches, when_response, context): + if is_iterable(when_response): + ret = [] + when_response = list(when_response) + for match in when_response: + if match in matches: + matches.remove(match) + ret.append(match) + return ret + if when_response in matches: + matches.remove(when_response) + return when_response + + +class AppendMatch(Consequence): # pylint: disable=abstract-method + """ + Append matches returned by then + """ + def __init__(self, match_name=None): + self.match_name = match_name + + def then(self, matches, when_response, context): + if is_iterable(when_response): + ret = [] + when_response = list(when_response) + for match in when_response: + if match not in matches: + if self.match_name: + match.name = self.match_name + matches.append(match) + ret.append(match) + return ret + if self.match_name: + when_response.name = self.match_name + if when_response not in matches: + matches.append(when_response) + return when_response + + +class RenameMatch(Consequence): # pylint: disable=abstract-method + """ + Rename matches returned by then + """ + def __init__(self, match_name): + self.match_name = match_name + self.remove = RemoveMatch() + self.append = AppendMatch() + + def then(self, matches, when_response, context): + removed = self.remove.then(matches, when_response, context) + if is_iterable(removed): + removed = list(removed) + for match in removed: + match.name = self.match_name + elif removed: + removed.name = self.match_name + if removed: + self.append.then(matches, removed, context) + + +class AppendTags(Consequence): # pylint: disable=abstract-method + """ + Add tags to returned matches + """ + def __init__(self, tags): + self.tags = tags + self.remove = RemoveMatch() + self.append = AppendMatch() + + def then(self, matches, when_response, context): + removed = self.remove.then(matches, when_response, context) + if is_iterable(removed): + removed = list(removed) + for match in removed: + match.tags.extend(self.tags) + elif removed: + removed.tags.extend(self.tags) # pylint: disable=no-member + if removed: + self.append.then(matches, removed, context) + + +class RemoveTags(Consequence): # pylint: disable=abstract-method + """ + Remove tags from returned matches + """ + def __init__(self, tags): + self.tags = tags + self.remove = RemoveMatch() + self.append = AppendMatch() + + def then(self, matches, when_response, context): + removed = self.remove.then(matches, when_response, context) + if is_iterable(removed): + removed = list(removed) + for match in removed: + for tag in self.tags: + if tag in match.tags: + match.tags.remove(tag) + elif removed: + for tag in self.tags: + if tag in removed.tags: # pylint: disable=no-member + removed.tags.remove(tag) # pylint: disable=no-member + if removed: + self.append.then(matches, removed, context) + + +class Rules(list): + """ + list of rules ready to execute. + """ + + def __init__(self, *rules): + super(Rules, self).__init__() + self.load(*rules) + + def load(self, *rules): + """ + Load rules from a Rule module, class or instance + + :param rules: + :type rules: + :return: + :rtype: + """ + for rule in rules: + if inspect.ismodule(rule): + self.load_module(rule) + elif inspect.isclass(rule): + self.load_class(rule) + else: + self.append(rule) + + def load_module(self, module): + """ + Load a rules module + + :param module: + :type module: + :return: + :rtype: + """ + # pylint: disable=unused-variable + for name, obj in inspect.getmembers(module, + lambda member: hasattr(member, '__module__') + and member.__module__ == module.__name__ + and inspect.isclass): + self.load_class(obj) + + def load_class(self, class_): + """ + Load a Rule class. + + :param class_: + :type class_: + :return: + :rtype: + """ + self.append(class_()) + + def execute_all_rules(self, matches, context): + """ + Execute all rules from this rules list. All when condition with same priority will be performed before + calling then actions. + + :param matches: + :type matches: + :param context: + :type context: + :return: + :rtype: + """ + ret = [] + for priority, priority_rules in groupby(sorted(self), lambda rule: rule.priority): + sorted_rules = toposort_rules(list(priority_rules)) # Group by dependency graph toposort + for rules_group in sorted_rules: + rules_group = list(sorted(rules_group, key=self.index)) # Sort rules group based on initial ordering. + group_log_level = None + for rule in rules_group: + if group_log_level is None or group_log_level < rule.log_level: + group_log_level = rule.log_level + log(group_log_level, "%s independent rule(s) at priority %s.", len(rules_group), priority) + for rule in rules_group: + when_response = execute_rule(rule, matches, context) + if when_response is not None: + ret.append((rule, when_response)) + + return ret + + +def execute_rule(rule, matches, context): + """ + Execute the given rule. + :param rule: + :type rule: + :param matches: + :type matches: + :param context: + :type context: + :return: + :rtype: + """ + if rule.enabled(context): + log(rule.log_level, "Checking rule condition: %s", rule) + when_response = rule.when(matches, context) + if when_response: + log(rule.log_level, "Rule was triggered: %s", when_response) + log(rule.log_level, "Running rule consequence: %s %s", rule, when_response) + rule.then(matches, when_response, context) + return when_response + else: + log(rule.log_level, "Rule is disabled: %s", rule) + +def toposort_rules(rules): + """ + Sort given rules using toposort with dependency parameter. + :param rules: + :type rules: + :return: + :rtype: + """ + graph = {} + class_dict = {} + for rule in rules: + if rule.__class__ in class_dict: + raise ValueError("Duplicate class rules are not allowed: %s" % rule.__class__) + class_dict[rule.__class__] = rule + for rule in rules: + if not is_iterable(rule.dependency) and rule.dependency: + rule_dependencies = [rule.dependency] + else: + rule_dependencies = rule.dependency + dependencies = set() + if rule_dependencies: + for dependency in rule_dependencies: + if inspect.isclass(dependency): + dependency = class_dict.get(dependency) + if dependency: + dependencies.add(dependency) + graph[rule] = dependencies + return toposort(graph) diff --git a/lib/rebulk/toposort.py b/lib/rebulk/toposort.py new file mode 100755 index 00000000..2bcba9ae --- /dev/null +++ b/lib/rebulk/toposort.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright 2014 True Blade Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Original: +# - https://bitbucket.org/ericvsmith/toposort (1.4) +# Modifications: +# - merged Pull request #2 for CyclicDependency error +# - import reduce as original name +# - support python 2.6 dict comprehension + +# pylint: skip-file +from functools import reduce + + +class CyclicDependency(ValueError): + def __init__(self, cyclic): + s = 'Cyclic dependencies exist among these items: {0}'.format(', '.join(repr(x) for x in cyclic.items())) + super(CyclicDependency, self).__init__(s) + self.cyclic = cyclic + + +def toposort(data): + """ + Dependencies are expressed as a dictionary whose keys are items + and whose values are a set of dependent items. Output is a list of + sets in topological order. The first set consists of items with no + dependences, each subsequent set consists of items that depend upon + items in the preceeding sets. + :param data: + :type data: + :return: + :rtype: + """ + + # Special case empty input. + if len(data) == 0: + return + + # Copy the input so as to leave it unmodified. + data = data.copy() + + # Ignore self dependencies. + for k, v in data.items(): + v.discard(k) + # Find all items that don't depend on anything. + extra_items_in_deps = reduce(set.union, data.values()) - set(data.keys()) + # Add empty dependences where needed. + data.update(dict((item, set()) for item in extra_items_in_deps)) + while True: + ordered = set(item for item, dep in data.items() if len(dep) == 0) + if not ordered: + break + yield ordered + data = dict((item, (dep - ordered)) + for item, dep in data.items() + if item not in ordered) + if len(data) != 0: + raise CyclicDependency(data) + + +def toposort_flatten(data, sort=True): + """ + Returns a single list of dependencies. For any set returned by + toposort(), those items are sorted and appended to the result (just to + make the results deterministic). + :param data: + :type data: + :param sort: + :type sort: + :return: Single list of dependencies. + :rtype: list + """ + + result = [] + for d in toposort(data): + result.extend((sorted if sort else list)(d)) + return result diff --git a/lib/rebulk/utils.py b/lib/rebulk/utils.py new file mode 100755 index 00000000..85ddd41e --- /dev/null +++ b/lib/rebulk/utils.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Various utilities functions +""" +try: + from collections.abc import MutableSet +except ImportError: + from collections import MutableSet + +from types import GeneratorType + + +def find_all(string, sub, start=None, end=None, ignore_case=False, **kwargs): + """ + Return all indices in string s where substring sub is + found, such that sub is contained in the slice s[start:end]. + + >>> list(find_all('The quick brown fox jumps over the lazy dog', 'fox')) + [16] + + >>> list(find_all('The quick brown fox jumps over the lazy dog', 'mountain')) + [] + + >>> list(find_all('The quick brown fox jumps over the lazy dog', 'The')) + [0] + + >>> list(find_all( + ... 'Carved symbols in a mountain hollow on the bank of an inlet irritated an eccentric person', + ... 'an')) + [44, 51, 70] + + >>> list(find_all( + ... 'Carved symbols in a mountain hollow on the bank of an inlet irritated an eccentric person', + ... 'an', + ... 50, + ... 60)) + [51] + + :param string: the input string + :type string: str + :param sub: the substring + :type sub: str + :return: all indices in the input string + :rtype: __generator[str] + """ + #pylint: disable=unused-argument + if ignore_case: + sub = sub.lower() + string = string.lower() + while True: + start = string.find(sub, start, end) + if start == -1: + return + yield start + start += len(sub) + + +def get_first_defined(data, keys, default_value=None): + """ + Get the first defined key in data. + :param data: + :type data: + :param keys: + :type keys: + :param default_value: + :type default_value: + :return: + :rtype: + """ + for key in keys: + if key in data: + return data[key] + return default_value + + +def is_iterable(obj): + """ + Are we being asked to look up a list of things, instead of a single thing? + We check for the `__iter__` attribute so that this can cover types that + don't have to be known by this module, such as NumPy arrays. + + Strings, however, should be considered as atomic values to look up, not + iterables. + + We don't need to check for the Python 2 `unicode` type, because it doesn't + have an `__iter__` attribute anyway. + """ + # pylint: disable=consider-using-ternary + return hasattr(obj, '__iter__') and not isinstance(obj, str) or isinstance(obj, GeneratorType) + + +def extend_safe(target, source): + """ + Extends source list to target list only if elements doesn't exists in target list. + :param target: + :type target: list + :param source: + :type source: list + """ + for elt in source: + if elt not in target: + target.append(elt) + + +class _Ref(object): + """ + Reference for IdentitySet + """ + def __init__(self, value): + self.value = value + + def __eq__(self, other): + return self.value is other.value + + def __hash__(self): + return id(self.value) + + +class IdentitySet(MutableSet): # pragma: no cover + """ + Set based on identity + """ + def __init__(self, items=None): # pylint: disable=super-init-not-called + if items is None: + items = [] + self.refs = set(map(_Ref, items)) + + def __contains__(self, elem): + return _Ref(elem) in self.refs + + def __iter__(self): + return (ref.value for ref in self.refs) + + def __len__(self): + return len(self.refs) + + def add(self, value): + self.refs.add(_Ref(value)) + + def discard(self, value): + self.refs.discard(_Ref(value)) + + def update(self, iterable): + """ + Update set with iterable + :param iterable: + :type iterable: + :return: + :rtype: + """ + for elem in iterable: + self.add(elem) + + def __repr__(self): # pragma: no cover + return "%s(%s)" % (type(self).__name__, list(self)) diff --git a/lib/rebulk/validators.py b/lib/rebulk/validators.py new file mode 100755 index 00000000..b8959c54 --- /dev/null +++ b/lib/rebulk/validators.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Validator functions to use in patterns. + +All those function have last argument as match, so it's possible to use functools.partial to bind previous arguments. +""" + + +def chars_before(chars, match): + """ + Validate the match if left character is in a given sequence. + + :param chars: + :type chars: + :param match: + :type match: + :return: + :rtype: + """ + if match.start <= 0: + return True + return match.input_string[match.start - 1] in chars + + +def chars_after(chars, match): + """ + Validate the match if right character is in a given sequence. + + :param chars: + :type chars: + :param match: + :type match: + :return: + :rtype: + """ + if match.end >= len(match.input_string): + return True + return match.input_string[match.end] in chars + + +def chars_surround(chars, match): + """ + Validate the match if surrounding characters are in a given sequence. + + :param chars: + :type chars: + :param match: + :type match: + :return: + :rtype: + """ + return chars_before(chars, match) and chars_after(chars, match) + + +def validators(*chained_validators): + """ + Creates a validator chain from several validator functions. + + :param chained_validators: + :type chained_validators: + :return: + :rtype: + """ + + def validator_chain(match): # pylint:disable=missing-docstring + for chained_validator in chained_validators: + if not chained_validator(match): + return False + return True + + return validator_chain + + +def allways_true(match): # pylint:disable=unused-argument + """ + A validator which is allways true + :param match: + :return: + """ + return True diff --git a/lib/schedule.py b/lib/schedule.py new file mode 100644 index 00000000..67fb19d4 --- /dev/null +++ b/lib/schedule.py @@ -0,0 +1,617 @@ +""" +Python job scheduling for humans. + +github.com/dbader/schedule + +An in-process scheduler for periodic jobs that uses the builder pattern +for configuration. Schedule lets you run Python functions (or any other +callable) periodically at pre-determined intervals using a simple, +human-friendly syntax. + +Inspired by Addam Wiggins' article "Rethinking Cron" [1] and the +"clockwork" Ruby module [2][3]. + +Features: + - A simple to use API for scheduling jobs. + - Very lightweight and no external dependencies. + - Excellent test coverage. + - Tested on Python 2.7, 3.5 and 3.6 + +Usage: + >>> import schedule + >>> import time + + >>> def job(message='stuff'): + >>> print("I'm working on:", message) + + >>> schedule.every(10).minutes.do(job) + >>> schedule.every(5).to(10).days.do(job) + >>> schedule.every().hour.do(job, message='things') + >>> schedule.every().day.at("10:30").do(job) + + >>> while True: + >>> schedule.run_pending() + >>> time.sleep(1) + +[1] https://adam.herokuapp.com/past/2010/4/13/rethinking_cron/ +[2] https://github.com/Rykian/clockwork +[3] https://adam.herokuapp.com/past/2010/6/30/replace_cron_with_clockwork/ +""" +try: + from collections.abc import Hashable +except ImportError: + from collections import Hashable +import datetime +import functools +import logging +import random +import re +import time + +logger = logging.getLogger('schedule') + + +class ScheduleError(Exception): + """Base schedule exception""" + pass + + +class ScheduleValueError(ScheduleError): + """Base schedule value error""" + pass + + +class IntervalError(ScheduleValueError): + """An improper interval was used""" + pass + + +class CancelJob(object): + """ + Can be returned from a job to unschedule itself. + """ + pass + + +class Scheduler(object): + """ + Objects instantiated by the :class:`Scheduler <Scheduler>` are + factories to create jobs, keep record of scheduled jobs and + handle their execution. + """ + def __init__(self): + self.jobs = [] + + def run_pending(self): + """ + Run all jobs that are scheduled to run. + + Please note that it is *intended behavior that run_pending() + does not run missed jobs*. For example, if you've registered a job + that should run every minute and you only call run_pending() + in one hour increments then your job won't be run 60 times in + between but only once. + """ + runnable_jobs = (job for job in self.jobs if job.should_run) + for job in sorted(runnable_jobs): + self._run_job(job) + + def run_all(self, delay_seconds=0): + """ + Run all jobs regardless if they are scheduled to run or not. + + A delay of `delay` seconds is added between each job. This helps + distribute system load generated by the jobs more evenly + over time. + + :param delay_seconds: A delay added between every executed job + """ + logger.info('Running *all* %i jobs with %is delay inbetween', + len(self.jobs), delay_seconds) + for job in self.jobs[:]: + self._run_job(job) + time.sleep(delay_seconds) + + def clear(self, tag=None): + """ + Deletes scheduled jobs marked with the given tag, or all jobs + if tag is omitted. + + :param tag: An identifier used to identify a subset of + jobs to delete + """ + if tag is None: + del self.jobs[:] + else: + self.jobs[:] = (job for job in self.jobs if tag not in job.tags) + + def cancel_job(self, job): + """ + Delete a scheduled job. + + :param job: The job to be unscheduled + """ + try: + self.jobs.remove(job) + except ValueError: + pass + + def every(self, interval=1): + """ + Schedule a new periodic job. + + :param interval: A quantity of a certain time unit + :return: An unconfigured :class:`Job <Job>` + """ + job = Job(interval, self) + return job + + def _run_job(self, job): + ret = job.run() + if isinstance(ret, CancelJob) or ret is CancelJob: + self.cancel_job(job) + + @property + def next_run(self): + """ + Datetime when the next job should run. + + :return: A :class:`~datetime.datetime` object + """ + if not self.jobs: + return None + return min(self.jobs).next_run + + @property + def idle_seconds(self): + """ + :return: Number of seconds until + :meth:`next_run <Scheduler.next_run>`. + """ + return (self.next_run - datetime.datetime.now()).total_seconds() + + +class Job(object): + """ + A periodic job as used by :class:`Scheduler`. + + :param interval: A quantity of a certain time unit + :param scheduler: The :class:`Scheduler <Scheduler>` instance that + this job will register itself with once it has + been fully configured in :meth:`Job.do()`. + + Every job runs at a given fixed time interval that is defined by: + + * a :meth:`time unit <Job.second>` + * a quantity of `time units` defined by `interval` + + A job is usually created and returned by :meth:`Scheduler.every` + method, which also defines its `interval`. + """ + def __init__(self, interval, scheduler=None): + self.interval = interval # pause interval * unit between runs + self.latest = None # upper limit to the interval + self.job_func = None # the job job_func to run + self.unit = None # time units, e.g. 'minutes', 'hours', ... + self.at_time = None # optional time at which this job runs + self.last_run = None # datetime of the last run + self.next_run = None # datetime of the next run + self.period = None # timedelta between runs, only valid for + self.start_day = None # Specific day of the week to start on + self.tags = set() # unique set of tags for the job + self.scheduler = scheduler # scheduler to register with + + def __lt__(self, other): + """ + PeriodicJobs are sortable based on the scheduled time they + run next. + """ + return self.next_run < other.next_run + + def __str__(self): + return ( + "Job(interval={}, " + "unit={}, " + "do={}, " + "args={}, " + "kwargs={})" + ).format(self.interval, + self.unit, + self.job_func.__name__, + self.job_func.args, + self.job_func.keywords) + + def __repr__(self): + def format_time(t): + return t.strftime('%Y-%m-%d %H:%M:%S') if t else '[never]' + + def is_repr(j): + return not isinstance(j, Job) + + timestats = '(last run: %s, next run: %s)' % ( + format_time(self.last_run), format_time(self.next_run)) + + if hasattr(self.job_func, '__name__'): + job_func_name = self.job_func.__name__ + else: + job_func_name = repr(self.job_func) + args = [repr(x) if is_repr(x) else str(x) for x in self.job_func.args] + kwargs = ['%s=%s' % (k, repr(v)) + for k, v in self.job_func.keywords.items()] + call_repr = job_func_name + '(' + ', '.join(args + kwargs) + ')' + + if self.at_time is not None: + return 'Every %s %s at %s do %s %s' % ( + self.interval, + self.unit[:-1] if self.interval == 1 else self.unit, + self.at_time, call_repr, timestats) + else: + fmt = ( + 'Every %(interval)s ' + + ('to %(latest)s ' if self.latest is not None else '') + + '%(unit)s do %(call_repr)s %(timestats)s' + ) + + return fmt % dict( + interval=self.interval, + latest=self.latest, + unit=(self.unit[:-1] if self.interval == 1 else self.unit), + call_repr=call_repr, + timestats=timestats + ) + + @property + def second(self): + if self.interval != 1: + raise IntervalError('Use seconds instead of second') + return self.seconds + + @property + def seconds(self): + self.unit = 'seconds' + return self + + @property + def minute(self): + if self.interval != 1: + raise IntervalError('Use minutes instead of minute') + return self.minutes + + @property + def minutes(self): + self.unit = 'minutes' + return self + + @property + def hour(self): + if self.interval != 1: + raise IntervalError('Use hours instead of hour') + return self.hours + + @property + def hours(self): + self.unit = 'hours' + return self + + @property + def day(self): + if self.interval != 1: + raise IntervalError('Use days instead of day') + return self.days + + @property + def days(self): + self.unit = 'days' + return self + + @property + def week(self): + if self.interval != 1: + raise IntervalError('Use weeks instead of week') + return self.weeks + + @property + def weeks(self): + self.unit = 'weeks' + return self + + @property + def monday(self): + if self.interval != 1: + raise IntervalError('Use mondays instead of monday') + self.start_day = 'monday' + return self.weeks + + @property + def tuesday(self): + if self.interval != 1: + raise IntervalError('Use tuesdays instead of tuesday') + self.start_day = 'tuesday' + return self.weeks + + @property + def wednesday(self): + if self.interval != 1: + raise IntervalError('Use wednesdays instead of wednesday') + self.start_day = 'wednesday' + return self.weeks + + @property + def thursday(self): + if self.interval != 1: + raise IntervalError('Use thursdays instead of thursday') + self.start_day = 'thursday' + return self.weeks + + @property + def friday(self): + if self.interval != 1: + raise IntervalError('Use fridays instead of friday') + self.start_day = 'friday' + return self.weeks + + @property + def saturday(self): + if self.interval != 1: + raise IntervalError('Use saturdays instead of saturday') + self.start_day = 'saturday' + return self.weeks + + @property + def sunday(self): + if self.interval != 1: + raise IntervalError('Use sundays instead of sunday') + self.start_day = 'sunday' + return self.weeks + + def tag(self, *tags): + """ + Tags the job with one or more unique indentifiers. + + Tags must be hashable. Duplicate tags are discarded. + + :param tags: A unique list of ``Hashable`` tags. + :return: The invoked job instance + """ + if not all(isinstance(tag, Hashable) for tag in tags): + raise TypeError('Tags must be hashable') + self.tags.update(tags) + return self + + def at(self, time_str): + """ + Specify a particular time that the job should be run at. + + :param time_str: A string in one of the following formats: `HH:MM:SS`, + `HH:MM`,`:MM`, `:SS`. The format must make sense given how often + the job is repeating; for example, a job that repeats every minute + should not be given a string in the form `HH:MM:SS`. The difference + between `:MM` and `:SS` is inferred from the selected time-unit + (e.g. `every().hour.at(':30')` vs. `every().minute.at(':30')`). + :return: The invoked job instance + """ + if (self.unit not in ('days', 'hours', 'minutes') + and not self.start_day): + raise ScheduleValueError('Invalid unit') + if not isinstance(time_str, str): + raise TypeError('at() should be passed a string') + if self.unit == 'days' or self.start_day: + if not re.match(r'^([0-2]\d:)?[0-5]\d:[0-5]\d$', time_str): + raise ScheduleValueError('Invalid time format') + if self.unit == 'hours': + if not re.match(r'^([0-5]\d)?:[0-5]\d$', time_str): + raise ScheduleValueError(('Invalid time format for' + ' an hourly job')) + if self.unit == 'minutes': + if not re.match(r'^:[0-5]\d$', time_str): + raise ScheduleValueError(('Invalid time format for' + ' a minutely job')) + time_values = time_str.split(':') + if len(time_values) == 3: + hour, minute, second = time_values + elif len(time_values) == 2 and self.unit == 'minutes': + hour = 0 + minute = 0 + _, second = time_values + else: + hour, minute = time_values + second = 0 + if self.unit == 'days' or self.start_day: + hour = int(hour) + if not (0 <= hour <= 23): + raise ScheduleValueError('Invalid number of hours') + elif self.unit == 'hours': + hour = 0 + elif self.unit == 'minutes': + hour = 0 + minute = 0 + minute = int(minute) + second = int(second) + self.at_time = datetime.time(hour, minute, second) + return self + + def to(self, latest): + """ + Schedule the job to run at an irregular (randomized) interval. + + The job's interval will randomly vary from the value given + to `every` to `latest`. The range defined is inclusive on + both ends. For example, `every(A).to(B).seconds` executes + the job function every N seconds such that A <= N <= B. + + :param latest: Maximum interval between randomized job runs + :return: The invoked job instance + """ + self.latest = latest + return self + + def do(self, job_func, *args, **kwargs): + """ + Specifies the job_func that should be called every time the + job runs. + + Any additional arguments are passed on to job_func when + the job runs. + + :param job_func: The function to be scheduled + :return: The invoked job instance + """ + self.job_func = functools.partial(job_func, *args, **kwargs) + try: + functools.update_wrapper(self.job_func, job_func) + except AttributeError: + # job_funcs already wrapped by functools.partial won't have + # __name__, __module__ or __doc__ and the update_wrapper() + # call will fail. + pass + self._schedule_next_run() + self.scheduler.jobs.append(self) + return self + + @property + def should_run(self): + """ + :return: ``True`` if the job should be run now. + """ + return datetime.datetime.now() >= self.next_run + + def run(self): + """ + Run the job and immediately reschedule it. + + :return: The return value returned by the `job_func` + """ + logger.info('Running job %s', self) + ret = self.job_func() + self.last_run = datetime.datetime.now() + self._schedule_next_run() + return ret + + def _schedule_next_run(self): + """ + Compute the instant when this job should run next. + """ + if self.unit not in ('seconds', 'minutes', 'hours', 'days', 'weeks'): + raise ScheduleValueError('Invalid unit') + + if self.latest is not None: + if not (self.latest >= self.interval): + raise ScheduleError('`latest` is greater than `interval`') + interval = random.randint(self.interval, self.latest) + else: + interval = self.interval + + self.period = datetime.timedelta(**{self.unit: interval}) + self.next_run = datetime.datetime.now() + self.period + if self.start_day is not None: + if self.unit != 'weeks': + raise ScheduleValueError('`unit` should be \'weeks\'') + weekdays = ( + 'monday', + 'tuesday', + 'wednesday', + 'thursday', + 'friday', + 'saturday', + 'sunday' + ) + if self.start_day not in weekdays: + raise ScheduleValueError('Invalid start day') + weekday = weekdays.index(self.start_day) + days_ahead = weekday - self.next_run.weekday() + if days_ahead <= 0: # Target day already happened this week + days_ahead += 7 + self.next_run += datetime.timedelta(days_ahead) - self.period + if self.at_time is not None: + if (self.unit not in ('days', 'hours', 'minutes') + and self.start_day is None): + raise ScheduleValueError(('Invalid unit without' + ' specifying start day')) + kwargs = { + 'second': self.at_time.second, + 'microsecond': 0 + } + if self.unit == 'days' or self.start_day is not None: + kwargs['hour'] = self.at_time.hour + if self.unit in ['days', 'hours'] or self.start_day is not None: + kwargs['minute'] = self.at_time.minute + self.next_run = self.next_run.replace(**kwargs) + # If we are running for the first time, make sure we run + # at the specified time *today* (or *this hour*) as well + if not self.last_run: + now = datetime.datetime.now() + if (self.unit == 'days' and self.at_time > now.time() and + self.interval == 1): + self.next_run = self.next_run - datetime.timedelta(days=1) + elif self.unit == 'hours' \ + and self.at_time.minute > now.minute \ + or (self.at_time.minute == now.minute + and self.at_time.second > now.second): + self.next_run = self.next_run - datetime.timedelta(hours=1) + elif self.unit == 'minutes' \ + and self.at_time.second > now.second: + self.next_run = self.next_run - \ + datetime.timedelta(minutes=1) + if self.start_day is not None and self.at_time is not None: + # Let's see if we will still make that time we specified today + if (self.next_run - datetime.datetime.now()).days >= 7: + self.next_run -= self.period + + +# The following methods are shortcuts for not having to +# create a Scheduler instance: + +#: Default :class:`Scheduler <Scheduler>` object +default_scheduler = Scheduler() + +#: Default :class:`Jobs <Job>` list +jobs = default_scheduler.jobs # todo: should this be a copy, e.g. jobs()? + + +def every(interval=1): + """Calls :meth:`every <Scheduler.every>` on the + :data:`default scheduler instance <default_scheduler>`. + """ + return default_scheduler.every(interval) + + +def run_pending(): + """Calls :meth:`run_pending <Scheduler.run_pending>` on the + :data:`default scheduler instance <default_scheduler>`. + """ + default_scheduler.run_pending() + + +def run_all(delay_seconds=0): + """Calls :meth:`run_all <Scheduler.run_all>` on the + :data:`default scheduler instance <default_scheduler>`. + """ + default_scheduler.run_all(delay_seconds=delay_seconds) + + +def clear(tag=None): + """Calls :meth:`clear <Scheduler.clear>` on the + :data:`default scheduler instance <default_scheduler>`. + """ + default_scheduler.clear(tag) + + +def cancel_job(job): + """Calls :meth:`cancel_job <Scheduler.cancel_job>` on the + :data:`default scheduler instance <default_scheduler>`. + """ + default_scheduler.cancel_job(job) + + +def next_run(): + """Calls :meth:`next_run <Scheduler.next_run>` on the + :data:`default scheduler instance <default_scheduler>`. + """ + return default_scheduler.next_run + + +def idle_seconds(): + """Calls :meth:`idle_seconds <Scheduler.idle_seconds>` on the + :data:`default scheduler instance <default_scheduler>`. + """ + return default_scheduler.idle_seconds \ No newline at end of file diff --git a/lib/torrentool/__init__.py b/lib/torrentool/__init__.py new file mode 100644 index 00000000..f7f572ba --- /dev/null +++ b/lib/torrentool/__init__.py @@ -0,0 +1 @@ +VERSION = (1, 0, 2) \ No newline at end of file diff --git a/lib/torrentool/api.py b/lib/torrentool/api.py new file mode 100644 index 00000000..baac4b3b --- /dev/null +++ b/lib/torrentool/api.py @@ -0,0 +1,7 @@ +""" +Exposes commonly used classes and functions. + +""" +from .bencode import Bencode +from .torrent import Torrent +from .utils import upload_to_cache_server, get_open_trackers_from_local, get_open_trackers_from_remote diff --git a/lib/torrentool/bencode.py b/lib/torrentool/bencode.py new file mode 100644 index 00000000..6d431d13 --- /dev/null +++ b/lib/torrentool/bencode.py @@ -0,0 +1,204 @@ +from collections import OrderedDict +from operator import itemgetter +from codecs import encode +from sys import version_info + +from .exceptions import BencodeDecodingError, BencodeEncodingError + + +PY3 = version_info >= (3, 0) + +if PY3: + str_type = str + byte_types = (bytes, bytearray) + chr_ = chr + int_types = int +else: + str_type = basestring + byte_types = bytes + chr_ = lambda ch: ch + int_types = (int, long) + + +class Bencode(object): + """Exposes utilities for bencoding.""" + + @classmethod + def encode(cls, value): + """Encodes a value into bencoded bytes. + + :param value: Python object to be encoded (str, int, list, dict). + :param str val_encoding: Encoding used by strings in a given object. + :rtype: bytes + """ + val_encoding = 'utf-8' + + def encode_str(v): + try: + v_enc = encode(v, val_encoding) + + except UnicodeDecodeError: + if PY3: + raise + else: + # Suppose bytestring + v_enc = v + + prefix = encode('%s:' % len(v_enc), val_encoding) + return prefix + v_enc + + def encode_(val): + if isinstance(val, str_type): + result = encode_str(val) + + elif isinstance(val, int_types): + result = encode(('i%se' % val), val_encoding) + + elif isinstance(val, (list, set, tuple)): + result = encode('l', val_encoding) + for item in val: + result += encode_(item) + result += encode('e', val_encoding) + + elif isinstance(val, dict): + result = encode('d', val_encoding) + + # Dictionaries are expected to be sorted by key. + for k, v in OrderedDict(sorted(val.items(), key=itemgetter(0))).items(): + result += (encode_str(k) + encode_(v)) + + result += encode('e', val_encoding) + + elif isinstance(val, byte_types): + result = encode('%s:' % len(val), val_encoding) + result += val + + else: + raise BencodeEncodingError('Unable to encode `%s` %s' % (type(val), val)) + + return result + + return encode_(value) + + @classmethod + def decode(cls, encoded): + """Decodes bencoded data introduced as bytes. + + Returns decoded structure(s). + + :param bytes encoded: + """ + def create_dict(items): + # Let's guarantee that dictionaries are sorted. + k_v_pair = zip(*[iter(items)] * 2) + return OrderedDict(sorted(k_v_pair, key=itemgetter(0))) + + def create_list(items): + return list(items) + + stack_items = [] + stack_containers = [] + + def compress_stack(): + target_container = stack_containers.pop() + subitems = [] + + while True: + subitem = stack_items.pop() + subitems.append(subitem) + if subitem is target_container: + break + + container_creator = subitems.pop() + container = container_creator(reversed(subitems)) + stack_items.append(container) + + def parse_forward(till_char, sequence): + number = '' + char_sub_idx = 0 + + for char_sub_idx, char_sub in enumerate(sequence): + char_sub = chr_(char_sub) + if char_sub == till_char: + break + + number += char_sub + + number = int(number or 0) + char_sub_idx += 1 + + return number, char_sub_idx + + while encoded: + char = encoded[0] + char = chr_(char) + + if char == 'd': # Dictionary + stack_items.append(create_dict) + stack_containers.append(create_dict) + encoded = encoded[1:] + + elif char == 'l': # List + stack_items.append(create_list) + stack_containers.append(create_list) + encoded = encoded[1:] + + elif char == 'i': # Integer + number, char_sub_idx = parse_forward('e', encoded[1:]) + char_sub_idx += 1 + + stack_items.append(number) + encoded = encoded[char_sub_idx:] + + elif char.isdigit(): # String + str_len, char_sub_idx = parse_forward(':', encoded) + last_char_idx = char_sub_idx + str_len + + string = encoded[char_sub_idx:last_char_idx] + try: + string = string.decode('utf-8') + except UnicodeDecodeError: + # Considered bytestring (e.g. `pieces` hashes concatenation). + pass + + stack_items.append(string) + encoded = encoded[last_char_idx:] + + elif char == 'e': # End of a dictionary or a list. + compress_stack() + encoded = encoded[1:] + + else: + raise BencodeDecodingError('Unable to interpret `%s` char.' % char) + + if len(stack_items) == 1: + stack_items = stack_items.pop() + + return stack_items + + @classmethod + def read_string(cls, string): + """Decodes a given bencoded string or bytestring. + + Returns decoded structure(s). + + :param str string: + :rtype: list + """ + if PY3 and not isinstance(string, byte_types): + string = string.encode() + + return cls.decode(string) + + @classmethod + def read_file(cls, filepath): + """Decodes bencoded data of a given file. + + Returns decoded structure(s). + + :param str filepath: + :rtype: list + """ + with open(filepath, mode='rb') as f: + contents = f.read() + return cls.decode(contents) diff --git a/lib/torrentool/cli.py b/lib/torrentool/cli.py new file mode 100644 index 00000000..d07a8ee3 --- /dev/null +++ b/lib/torrentool/cli.py @@ -0,0 +1,94 @@ +from __future__ import division +import click +from os import path, getcwd + +from . import VERSION +from .api import Torrent +from .utils import humanize_filesize, upload_to_cache_server, get_open_trackers_from_remote, \ + get_open_trackers_from_local +from .exceptions import RemoteUploadError, RemoteDownloadError + + +@click.group() +@click.version_option(version='.'.join(map(str, VERSION))) +def start(): + """Torrentool command line utilities.""" + + +@start.group() +def torrent(): + """Torrent-related commands.""" + + +@torrent.command() +@click.argument('torrent_path', type=click.Path(exists=True, writable=False, dir_okay=False)) +def info(torrent_path): + """Print out information from .torrent file.""" + + my_torrent = Torrent.from_file(torrent_path) + + size = my_torrent.total_size + + click.secho('Name: %s' % my_torrent.name, fg='blue') + click.secho('Files:') + for file_tuple in my_torrent.files: + click.secho(file_tuple.name) + + click.secho('Hash: %s' % my_torrent.info_hash, fg='blue') + click.secho('Size: %s (%s)' % (humanize_filesize(size), size), fg='blue') + click.secho('Magnet: %s' % my_torrent.get_magnet(), fg='yellow') + + +@torrent.command() +@click.argument('source', type=click.Path(exists=True, writable=False)) +@click.option('--dest', default=getcwd, type=click.Path(file_okay=False), help='Destination path to put .torrent file into. Default: current directory.') +@click.option('--tracker', default=None, help='Tracker announce URL (multiple comma-separated values supported).') +@click.option('--open_trackers', default=False, is_flag=True, help='Add open trackers announce URLs.') +@click.option('--comment', default=None, help='Arbitrary comment.') +@click.option('--cache', default=False, is_flag=True, help='Upload file to torrent cache services.') +def create(source, dest, tracker, open_trackers, comment, cache): + """Create torrent file from a single file or a directory.""" + + source_title = path.basename(source).replace('.', '_').replace(' ', '_') + dest = '%s.torrent' % path.join(dest, source_title) + + click.secho('Creating torrent from %s ...' % source) + + my_torrent = Torrent.create_from(source) + + if comment: + my_torrent.comment = comment + + urls = [] + + if tracker: + urls = tracker.split(',') + + if open_trackers: + click.secho('Fetching an up-to-date open tracker list ...') + try: + urls.extend(get_open_trackers_from_remote()) + except RemoteDownloadError: + click.secho('Failed. Using built-in open tracker list.', fg='red', err=True) + urls.extend(get_open_trackers_from_local()) + + if urls: + my_torrent.announce_urls = urls + + my_torrent.to_file(dest) + + click.secho('Torrent file created: %s' % dest, fg='green') + click.secho('Torrent info hash: %s' % my_torrent.info_hash, fg='blue') + + if cache: + click.secho('Uploading to %s torrent cache service ...') + try: + result = upload_to_cache_server(dest) + click.secho('Cached torrent URL: %s' % result, fg='yellow') + + except RemoteUploadError as e: + click.secho('Failed: %s' % e, fg='red', err=True) + + +def main(): + start(obj={}) diff --git a/lib/torrentool/exceptions.py b/lib/torrentool/exceptions.py new file mode 100644 index 00000000..53118482 --- /dev/null +++ b/lib/torrentool/exceptions.py @@ -0,0 +1,27 @@ + +class TorrentoolException(Exception): + """Base torrentool exception. All others are inherited from it.""" + + +class BencodeError(TorrentoolException): + """Base exception for bencode related errors.""" + + +class BencodeDecodingError(BencodeError): + """Raised when torrentool is unable to decode bencoded data.""" + + +class BencodeEncodingError(BencodeError): + """Raised when torrentool is unable to encode data into bencode.""" + + +class TorrentError(TorrentoolException): + """Base exception for Torrent object related errors.""" + + +class RemoteUploadError(TorrentoolException): + """Base class for upload to remotes related issues.""" + + +class RemoteDownloadError(TorrentoolException): + """Base class for issues related to downloads from remotes.""" diff --git a/lib/torrentool/repo/open_trackers.ini b/lib/torrentool/repo/open_trackers.ini new file mode 100644 index 00000000..c0ca0aa0 --- /dev/null +++ b/lib/torrentool/repo/open_trackers.ini @@ -0,0 +1,8 @@ +udp://tracker.coppersurfer.tk:6969/announce +udp://tracker.internetwarriors.net:1337/announce +udp://tracker.leechers-paradise.org:6969/announce +udp://tracker.opentrackr.org:1337/announce +udp://tracker.openbittorrent.com:80/announce +udp://tracker.sktorrent.net:6969/announce +udp://tracker.zer0day.to:1337/announce +udp://exodus.desync.com:6969/announce diff --git a/lib/torrentool/torrent.py b/lib/torrentool/torrent.py new file mode 100644 index 00000000..8472c8cb --- /dev/null +++ b/lib/torrentool/torrent.py @@ -0,0 +1,436 @@ +from calendar import timegm +from collections import namedtuple +from datetime import datetime +from functools import reduce +from hashlib import sha1 +from os import walk, sep +from os.path import join, isdir, getsize, normpath, basename + +try: + from urllib.parse import urlencode +except ImportError: # Py2 + from urllib import urlencode + +from .bencode import Bencode +from .exceptions import TorrentError +from .utils import get_app_version + + +_ITERABLE_TYPES = (list, tuple, set) + + +TorrentFile = namedtuple('TorrentFile', ['name', 'length']) + + +class Torrent(object): + """Represents a torrent file, and exposes utilities to work with it.""" + + _filepath = None + + def __init__(self, dict_struct=None): + dict_struct = dict_struct or {'info': {}} + self._struct = dict_struct + + def __str__(self): + return 'Torrent: %s' % self.name + + announce_urls = property() + """List of lists of tracker announce URLs.""" + + comment = property() + """Optional. Free-form textual comments of the author.""" + + creation_date = property() + """Optional. The creation time of the torrent, in standard UNIX epoch format. UTC.""" + + created_by = property() + """Optional. Name and version of the program used to create the .torrent""" + + private = property() + """Optional. If True the client MUST publish its presence to get other peers + ONLY via the trackers explicitly described in the metainfo file. If False or is not present, + the client may obtain peer from other means, e.g. PEX peer exchange, dht. + + """ + + name = property() + """Torrent name (title).""" + + webseeds = property() + """A list of URLs where torrent data can be retrieved. + + See also: Torrent.httpseeds + + http://bittorrent.org/beps/bep_0019.html + """ + + httpseeds = property() + """A list of URLs where torrent data can be retrieved. + + See also and prefer Torrent.webseeds + + http://bittorrent.org/beps/bep_0017.html + """ + + def _list_getter(self, key): + return self._struct.get(key, []) + + def _list_setter(self, key, val): + if val is None: + try: + del self._struct[key] + return + except KeyError: + return + + if not isinstance(val, _ITERABLE_TYPES): + val = [val] + + self._struct[key] = val + + @webseeds.getter + def webseeds(self): + return self._list_getter('url-list') + + @webseeds.setter + def webseeds(self, val): + self._list_setter('url-list', val) + + @httpseeds.getter + def httpseeds(self): + return self._list_getter('httpseeds') + + @httpseeds.setter + def httpseeds(self, val): + self._list_setter('httpseeds', val) + + @property + def files(self): + """Files in torrent. + + List of namedtuples (filepath, size). + + :rtype: list[TorrentFile] + """ + files = [] + info = self._struct.get('info') + + if not info: + return files + + if 'files' in info: + base = info['name'] + + for f in info['files']: + files.append(TorrentFile(join(base, *f['path']), f['length'])) + + else: + files.append(TorrentFile(info['name'], info['length'])) + + return files + + @property + def total_size(self): + """Total size of all files in torrent.""" + return reduce(lambda prev, curr: prev + curr[1], self.files, 0) + + @property + def info_hash(self): + """Hash of torrent file info section. Also known as torrent hash.""" + info = self._struct.get('info') + + if not info: + return None + + return sha1(Bencode.encode(info)).hexdigest() + + @property + def magnet_link(self): + """Magnet link using BTIH (BitTorrent Info Hash) URN.""" + return self.get_magnet(detailed=False) + + @announce_urls.getter + def announce_urls(self): + """List of lists of announce (tracker) URLs. + + First inner list is considered as primary announcers list, + the following lists as back-ups. + + http://bittorrent.org/beps/bep_0012.html + + """ + urls = self._struct.get('announce-list') + + if not urls: + urls = self._struct.get('announce') + if not urls: + return [] + urls = [[urls]] + + return urls + + @announce_urls.setter + def announce_urls(self, val): + self._struct['announce'] = '' + self._struct['announce-list'] = [] + + def set_single(val): + del self._struct['announce-list'] + self._struct['announce'] = val + + if isinstance(val, _ITERABLE_TYPES): + length = len(val) + + if length: + if length == 1: + set_single(val[0]) + else: + for item in val: + if not isinstance(item, _ITERABLE_TYPES): + item = [item] + self._struct['announce-list'].append(item) + self._struct['announce'] = val[0] + + else: + set_single(val) + + @comment.getter + def comment(self): + return self._struct.get('comment') + + @comment.setter + def comment(self, val): + self._struct['comment'] = val + + @creation_date.getter + def creation_date(self): + date = self._struct.get('creation date') + if date is not None: + date = datetime.utcfromtimestamp(int(date)) + return date + + @creation_date.setter + def creation_date(self, val): + self._struct['creation date'] = timegm(val.timetuple()) + + @created_by.getter + def created_by(self): + return self._struct.get('created by') + + @created_by.setter + def created_by(self, val): + self._struct['created by'] = val + + @private.getter + def private(self): + return self._struct.get('info', {}).get('private', False) + + @private.setter + def private(self, val): + if not val: + try: + del self._struct['info']['private'] + except KeyError: + pass + else: + self._struct['info']['private'] = 1 + + @name.getter + def name(self): + return self._struct.get('info', {}).get('name', None) + + @name.setter + def name(self, val): + self._struct['info']['name'] = val + + def get_magnet(self, detailed=True): + """Returns torrent magnet link, consisting of BTIH (BitTorrent Info Hash) URN + anr optional other information. + + :param bool|list|tuple|set detailed: + For boolean - whether additional info (such as trackers) should be included. + For iterable - expected allowed parameter names: + tr - trackers + ws - webseeds + + """ + result = 'magnet:?xt=urn:btih:' + self.info_hash + + def add_tr(): + urls = self.announce_urls + if not urls: + return + + trackers = [] + + urls = urls[0] # Only primary announcers are enough. + for url in urls: + trackers.append(('tr', url)) + + if trackers: + return urlencode(trackers) + + def add_ws(): + webseeds = [('ws', url) for url in self.webseeds] + if webseeds: + return urlencode(webseeds) + + params_map = { + 'tr': add_tr, + 'ws': add_ws, + } + + if detailed: + details = [] + + if isinstance(detailed, _ITERABLE_TYPES): + requested_params = detailed + else: + requested_params = params_map.keys() + + for param in requested_params: + param_val = params_map[param]() + param_val and details.append(param_val) + + if details: + result += '&%s' % '&'.join(details) + + return result + + def to_file(self, filepath=None): + """Writes Torrent object into file, either + + :param filepath: + """ + if filepath is None and self._filepath is None: + raise TorrentError('Unable to save torrent to file: no filepath supplied.') + + if filepath is not None: + self._filepath = filepath + + with open(self._filepath, mode='wb') as f: + f.write(self.to_string()) + + def to_string(self): + """Returns bytes representing torrent file. + + :param str encoding: Encoding used by strings in Torrent object. + :rtype: bytearray + """ + return Bencode.encode(self._struct) + + @classmethod + def _get_target_files_info(cls, src_path): + src_path = u'%s' % src_path # Force walk() to return unicode names. + + is_dir = isdir(src_path) + target_files = [] + + if is_dir: + for base, _, files in walk(src_path): + target_files.extend([join(base, fname) for fname in sorted(files)]) + + else: + target_files.append(src_path) + + target_files_ = [] + total_size = 0 + for fpath in target_files: + file_size = getsize(fpath) + if not file_size: + continue + target_files_.append((fpath, file_size, normpath(fpath.replace(src_path, '')).strip(sep).split(sep))) + total_size += file_size + + return target_files_, total_size + + @classmethod + def create_from(cls, src_path): + """Returns Torrent object created from a file or a directory. + + :param str src_path: + :rtype: Torrent + """ + is_dir = isdir(src_path) + target_files, size_data = cls._get_target_files_info(src_path) + + SIZE_MIN = 32768 # 32 KiB + SIZE_DEFAULT = 262144 # 256 KiB + SIZE_MAX = 1048576 # 1 MiB + + CHUNKS_MIN = 1000 # todo use those limits as advised + CHUNKS_MAX = 2200 + + size_piece = SIZE_MIN + if size_data > SIZE_MIN: + size_piece = SIZE_DEFAULT + + if size_piece > SIZE_MAX: + size_piece = SIZE_MAX + + def read(filepath): + with open(filepath, 'rb') as f: + while True: + chunk = f.read(size_piece - len(pieces_buffer)) + chunk_size = len(chunk) + if chunk_size == 0: + break + yield chunk + + pieces = bytearray() + pieces_buffer = bytearray() + + for fpath, _, _ in target_files: + for chunk in read(fpath): + pieces_buffer += chunk + + if len(pieces_buffer) == size_piece: + pieces += sha1(pieces_buffer).digest()[:20] + pieces_buffer = bytearray() + + if len(pieces_buffer): + pieces += sha1(pieces_buffer).digest()[:20] + pieces_buffer = bytearray() + + info = { + 'name': basename(src_path), + 'pieces': bytes(pieces), + 'piece length': size_piece, + } + + if is_dir: + files = [] + + for _, length, path in target_files: + files.append({'length': length, 'path': path}) + + info['files'] = files + + else: + info['length'] = target_files[0][1] + + torrent = cls({'info': info}) + torrent.created_by = get_app_version() + torrent.creation_date = datetime.utcnow() + + return torrent + + @classmethod + def from_string(cls, string): + """Alternative constructor to get Torrent object from string. + + :param str string: + :rtype: Torrent + """ + return cls(Bencode.read_string(string)) + + @classmethod + def from_file(cls, filepath): + """Alternative constructor to get Torrent object from file. + + :param str filepath: + :rtype: Torrent + """ + torrent = cls(Bencode.read_file(filepath)) + torrent._filepath = filepath + return torrent diff --git a/lib/torrentool/utils.py b/lib/torrentool/utils.py new file mode 100644 index 00000000..7d346cd7 --- /dev/null +++ b/lib/torrentool/utils.py @@ -0,0 +1,91 @@ +import math +from os import path + +from .exceptions import RemoteUploadError, RemoteDownloadError + + +OPEN_TRACKERS_FILENAME = 'open_trackers.ini' +REMOTE_TIMEOUT = 4 + + +def get_app_version(): + """Returns full version string including application name + suitable for putting into Torrent.created_by. + + """ + from torrentool import VERSION + return 'torrentool/%s' % '.'.join(map(str, VERSION)) + + +def humanize_filesize(bytes_size): + """Returns human readable filesize. + + :param int bytes_size: + :rtype: str + """ + if not bytes_size: + return '0 B' + + names = ('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB') + + name_idx = int(math.floor(math.log(bytes_size, 1024))) + size = round(bytes_size / math.pow(1024, name_idx), 2) + + return '%s %s' % (size, names[name_idx]) + + +def upload_to_cache_server(fpath): + """Uploads .torrent file to a cache server. + + Returns upload file URL. + + :rtype: str + """ + url_base = 'http://torrage.info' + url_upload = '%s/autoupload.php' % url_base + url_download = '%s/torrent.php?h=' % url_base + file_field = 'torrent' + + try: + import requests + + response = requests.post(url_upload, files={file_field: open(fpath, 'rb')}, timeout=REMOTE_TIMEOUT) + response.raise_for_status() + + info_cache = response.text + return url_download + info_cache + + except (ImportError, requests.RequestException) as e: + + # Now trace is lost. `raise from` to consider. + raise RemoteUploadError('Unable to upload to %s: %s' % (url_upload, e)) + + +def get_open_trackers_from_remote(): + """Returns open trackers announce URLs list from remote repo.""" + + url_base = 'https://raw.githubusercontent.com/idlesign/torrentool/master/torrentool/repo' + url = '%s/%s' % (url_base, OPEN_TRACKERS_FILENAME) + + try: + import requests + + response = requests.get(url, timeout=REMOTE_TIMEOUT) + response.raise_for_status() + + open_trackers = response.text.splitlines() + + except (ImportError, requests.RequestException) as e: + + # Now trace is lost. `raise from` to consider. + raise RemoteDownloadError('Unable to download from %s: %s' % (url, e)) + + return open_trackers + + +def get_open_trackers_from_local(): + """Returns open trackers announce URLs list from local backup.""" + with open(path.join(path.dirname(__file__), 'repo', OPEN_TRACKERS_FILENAME)) as f: + open_trackers = map(str.strip, f.readlines()) + + return list(open_trackers) diff --git a/platformcode/config.py b/platformcode/config.py index f8df53a7..e94b0dc8 100644 --- a/platformcode/config.py +++ b/platformcode/config.py @@ -189,65 +189,7 @@ def get_all_settings_addon(): def open_settings(): - settings_pre = get_all_settings_addon() __settings__.openSettings() - settings_post = get_all_settings_addon() - - # cb_validate_config (util para validar cambios realizados en el cuadro de dialogo) - if settings_post.get('adult_aux_intro_password', None): - # Hemos accedido a la seccion de Canales para adultos - from platformcode import platformtools - if 'adult_password' not in settings_pre: - adult_password = set_setting('adult_password', '0000') - else: - adult_password = settings_pre['adult_password'] - - if settings_post['adult_aux_intro_password'] == adult_password: - # La contraseña de acceso es correcta - - # Cambio de contraseña - if settings_post['adult_aux_new_password1']: - if settings_post['adult_aux_new_password1'] == settings_post['adult_aux_new_password2']: - set_setting('adult_password', settings_post['adult_aux_new_password1']) - else: - platformtools.dialog_ok(get_localized_string(60305), - get_localized_string(60306), - get_localized_string(60307)) - - else: - platformtools.dialog_ok(get_localized_string(60305), get_localized_string(60309), - get_localized_string(60310)) - - # Deshacer cambios - set_setting("adult_mode", settings_pre.get("adult_mode", 0)) - set_setting("adult_request_password", settings_pre.get("adult_request_password", True)) - - # Borramos settings auxiliares - set_setting('adult_aux_intro_password', '') - set_setting('adult_aux_new_password1', '') - set_setting('adult_aux_new_password2', '') - - from specials import videolibrary - from platformcode import xbmc_videolibrary - if settings_pre.get('downloadpath', None) != settings_post.get('downloadpath', None): - xbmc_videolibrary.update_sources(settings_post.get('downloadpath', None), settings_pre.get('downloadpath', None)) - - # si se ha cambiado la ruta de la videoteca llamamos a comprobar directorios para que lo cree y pregunte - # automaticamente si configurar la videoteca - if settings_pre.get("videolibrarypath", None) != settings_post.get("videolibrarypath", None) or \ - settings_pre.get("folder_movies", None) != settings_post.get("folder_movies", None) or \ - settings_pre.get("folder_tvshows", None) != settings_post.get("folder_tvshows", None): - videolibrary.move_videolibrary(settings_pre.get("videolibrarypath", None), settings_post.get("videolibrarypath", None), - settings_pre.get("folder_movies", None), settings_post.get("folder_movies", None), - settings_pre.get("folder_tvshows", None), settings_post.get("folder_tvshows", None)) - - # si se ha puesto que se quiere autoconfigurar y se había creado el directorio de la videoteca - if not settings_pre.get("videolibrary_kodi", None) and settings_post.get("videolibrary_kodi", None): - xbmc_videolibrary.ask_set_content(silent=True) - elif settings_pre.get("videolibrary_kodi", None) and not settings_post.get("videolibrary_kodi", None): - strm_list = [] - strm_list.append(get_setting('videolibrarypath')) - xbmc_videolibrary.clean(strm_list) def get_setting(name, channel="", server="", default=None): @@ -310,15 +252,11 @@ def get_setting(name, channel="", server="", default=None): return False else: # special case return as str - if name in ["adult_password", "adult_aux_intro_password", "adult_aux_new_password1", - "adult_aux_new_password2"]: - return value - else: - try: - value = int(value) - except ValueError: - pass - return value + try: + value = int(value) + except ValueError: + pass + return value def set_setting(name, value, channel="", server=""): @@ -397,9 +335,9 @@ def get_localized_category(categ): categories = {'movie': get_localized_string(30122), 'tvshow': get_localized_string(30123), 'anime': get_localized_string(30124), 'documentary': get_localized_string(30125), 'vos': get_localized_string(30136), 'sub-ita': get_localized_string(70566), - 'adult': get_localized_string(30126), 'direct': get_localized_string(30137), - 'torrent': get_localized_string(70015), 'live': get_localized_string(30138), - 'music': get_localized_string(30139) } + 'direct': get_localized_string(30137), 'torrent': get_localized_string(70015), + 'live': get_localized_string(30138), 'music': get_localized_string(30139) + } return categories[categ] if categ in categories else categ diff --git a/platformcode/custom_code.py b/platformcode/custom_code.py index 46ce5009..0881057f 100644 --- a/platformcode/custom_code.py +++ b/platformcode/custom_code.py @@ -70,11 +70,11 @@ def init(): verify_Kodi_video_DB() #LIBTORRENT: se descarga el binario de Libtorrent cada vez que se actualiza Alfa - try: - threading.Thread(target=update_libtorrent).start() # Creamos un Thread independiente, hasta el fin de Kodi - time.sleep(2) # Dejamos terminar la inicialización... - except: # Si hay problemas de threading, nos vamos - logger.error(traceback.format_exc()) + # try: + # threading.Thread(target=update_libtorrent).start() # Creamos un Thread independiente, hasta el fin de Kodi + # time.sleep(2) # Dejamos terminar la inicialización... + # except: # Si hay problemas de threading, nos vamos + # logger.error(traceback.format_exc()) # #QUASAR: Preguntamos si se hacen modificaciones a Quasar # if not filetools.exists(filetools.join(config.get_data_path(), "quasar.json")) \ @@ -245,102 +245,102 @@ def update_external_addon(addon_name): return False -def update_libtorrent(): - logger.info() +# def update_libtorrent(): +# logger.info() - if not config.get_setting("mct_buffer", server="torrent", default=""): - default = config.get_setting("torrent_client", server="torrent", default=0) - config.set_setting("torrent_client", default, server="torrent") - config.set_setting("mct_buffer", "50", server="torrent") - if config.get_setting("mct_download_path", server="torrent", default=config.get_setting("downloadpath")): - config.set_setting("mct_download_path", config.get_setting("downloadpath"), server="torrent") - config.set_setting("mct_background_download", True, server="torrent") - config.set_setting("mct_rar_unpack", True, server="torrent") - config.set_setting("bt_buffer", "50", server="torrent") - if config.get_setting("bt_download_path", server="torrent", default=config.get_setting("downloadpath")): - config.set_setting("bt_download_path", config.get_setting("downloadpath"), server="torrent") - config.set_setting("mct_download_limit", "", server="torrent") - config.set_setting("magnet2torrent", False, server="torrent") +# if not config.get_setting("mct_buffer", server="torrent", default=""): +# default = config.get_setting("torrent_client", server="torrent", default=0) +# config.set_setting("torrent_client", default, server="torrent") +# config.set_setting("mct_buffer", "50", server="torrent") +# if config.get_setting("mct_download_path", server="torrent", default=config.get_setting("downloadpath")): +# config.set_setting("mct_download_path", config.get_setting("downloadpath"), server="torrent") +# config.set_setting("mct_background_download", True, server="torrent") +# config.set_setting("mct_rar_unpack", True, server="torrent") +# config.set_setting("bt_buffer", "50", server="torrent") +# if config.get_setting("bt_download_path", server="torrent", default=config.get_setting("downloadpath")): +# config.set_setting("bt_download_path", config.get_setting("downloadpath"), server="torrent") +# config.set_setting("mct_download_limit", "", server="torrent") +# config.set_setting("magnet2torrent", False, server="torrent") - if not filetools.exists(filetools.join(config.get_runtime_path(), "custom_code.json")) or not \ - config.get_setting("unrar_path", server="torrent", default=""): +# if not filetools.exists(filetools.join(config.get_runtime_path(), "custom_code.json")) or not \ +# config.get_setting("unrar_path", server="torrent", default=""): - path = filetools.join(config.get_runtime_path(), 'lib', 'rarfiles') - creationflags = '' - sufix = '' - unrar = '' - for device in filetools.listdir(path): - if xbmc.getCondVisibility("system.platform.android") and 'android' not in device: continue - if xbmc.getCondVisibility("system.platform.windows") and 'windows' not in device: continue - if not xbmc.getCondVisibility("system.platform.windows") and not xbmc.getCondVisibility("system.platform.android") \ - and ('android' in device or 'windows' in device): continue - if 'windows' in device: - creationflags = 0x08000000 - sufix = '.exe' - else: - creationflags = '' - sufix = '' - unrar = filetools.join(path, device, 'unrar%s') % sufix - if not filetools.exists(unrar): unrar = '' - if unrar: - if not xbmc.getCondVisibility("system.platform.windows"): - try: - if xbmc.getCondVisibility("system.platform.android"): - # Para Android copiamos el binario a la partición del sistema - unrar_org = unrar - unrar = filetools.join(xbmc.translatePath('special://xbmc/'), 'files').replace('/cache/apk/assets', '') - if not filetools.exists(unrar): - filetools.mkdir(unrar) - unrar = filetools.join(unrar, 'unrar') - filetools.copy(unrar_org, unrar, silent=True) +# path = filetools.join(config.get_runtime_path(), 'lib', 'rarfiles') +# creationflags = '' +# sufix = '' +# unrar = '' +# for device in filetools.listdir(path): +# if xbmc.getCondVisibility("system.platform.android") and 'android' not in device: continue +# if xbmc.getCondVisibility("system.platform.windows") and 'windows' not in device: continue +# if not xbmc.getCondVisibility("system.platform.windows") and not xbmc.getCondVisibility("system.platform.android") \ +# and ('android' in device or 'windows' in device): continue +# if 'windows' in device: +# creationflags = 0x08000000 +# sufix = '.exe' +# else: +# creationflags = '' +# sufix = '' +# unrar = filetools.join(path, device, 'unrar%s') % sufix +# if not filetools.exists(unrar): unrar = '' +# if unrar: +# if not xbmc.getCondVisibility("system.platform.windows"): +# try: +# if xbmc.getCondVisibility("system.platform.android"): +# # Para Android copiamos el binario a la partición del sistema +# unrar_org = unrar +# unrar = filetools.join(xbmc.translatePath('special://xbmc/'), 'files').replace('/cache/apk/assets', '') +# if not filetools.exists(unrar): +# filetools.mkdir(unrar) +# unrar = filetools.join(unrar, 'unrar') +# filetools.copy(unrar_org, unrar, silent=True) - command = ['chmod', '777', '%s' % unrar] - p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - output_cmd, error_cmd = p.communicate() - command = ['ls', '-l', unrar] - p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - output_cmd, error_cmd = p.communicate() - xbmc.log('######## UnRAR file: %s' % str(output_cmd), xbmc.LOGNOTICE) - except: - xbmc.log('######## UnRAR ERROR in path: %s' % str(unrar), xbmc.LOGNOTICE) - logger.error(traceback.format_exc(1)) +# command = ['chmod', '777', '%s' % unrar] +# p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) +# output_cmd, error_cmd = p.communicate() +# command = ['ls', '-l', unrar] +# p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) +# output_cmd, error_cmd = p.communicate() +# xbmc.log('######## UnRAR file: %s' % str(output_cmd), xbmc.LOGNOTICE) +# except: +# xbmc.log('######## UnRAR ERROR in path: %s' % str(unrar), xbmc.LOGNOTICE) +# logger.error(traceback.format_exc(1)) - try: - if xbmc.getCondVisibility("system.platform.windows"): - p = subprocess.Popen(unrar, stdout=subprocess.PIPE, stderr=subprocess.PIPE, creationflags=creationflags) - else: - p = subprocess.Popen(unrar, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - output_cmd, error_cmd = p.communicate() - if p.returncode != 0 or error_cmd: - xbmc.log('######## UnRAR returncode in module %s: %s, %s in %s' % \ - (device, str(p.returncode), str(error_cmd), unrar), xbmc.LOGNOTICE) - unrar = '' - else: - xbmc.log('######## UnRAR OK in %s: %s' % (device, unrar), xbmc.LOGNOTICE) - break - except: - xbmc.log('######## UnRAR ERROR in module %s: %s' % (device, unrar), xbmc.LOGNOTICE) - logger.error(traceback.format_exc(1)) - unrar = '' +# try: +# if xbmc.getCondVisibility("system.platform.windows"): +# p = subprocess.Popen(unrar, stdout=subprocess.PIPE, stderr=subprocess.PIPE, creationflags=creationflags) +# else: +# p = subprocess.Popen(unrar, stdout=subprocess.PIPE, stderr=subprocess.PIPE) +# output_cmd, error_cmd = p.communicate() +# if p.returncode != 0 or error_cmd: +# xbmc.log('######## UnRAR returncode in module %s: %s, %s in %s' % \ +# (device, str(p.returncode), str(error_cmd), unrar), xbmc.LOGNOTICE) +# unrar = '' +# else: +# xbmc.log('######## UnRAR OK in %s: %s' % (device, unrar), xbmc.LOGNOTICE) +# break +# except: +# xbmc.log('######## UnRAR ERROR in module %s: %s' % (device, unrar), xbmc.LOGNOTICE) +# logger.error(traceback.format_exc(1)) +# unrar = '' - if unrar: config.set_setting("unrar_path", unrar, server="torrent") +# if unrar: config.set_setting("unrar_path", unrar, server="torrent") - if filetools.exists(filetools.join(config.get_runtime_path(), "custom_code.json")) and \ - config.get_setting("libtorrent_path", server="torrent", default="") : - return +# if filetools.exists(filetools.join(config.get_runtime_path(), "custom_code.json")) and \ +# config.get_setting("libtorrent_path", server="torrent", default="") : +# return - try: - from lib.python_libtorrent.python_libtorrent import get_libtorrent - except Exception as e: - logger.error(traceback.format_exc(1)) - if not PY3: - e = unicode(str(e), "utf8", errors="replace").encode("utf8") - config.set_setting("libtorrent_path", "", server="torrent") - if not config.get_setting("libtorrent_error", server="torrent", default=''): - config.set_setting("libtorrent_error", str(e), server="torrent") +# try: +# from lib.python_libtorrent.python_libtorrent import get_libtorrent +# except Exception as e: +# logger.error(traceback.format_exc(1)) +# if not PY3: +# e = unicode(str(e), "utf8", errors="replace").encode("utf8") +# config.set_setting("libtorrent_path", "", server="torrent") +# if not config.get_setting("libtorrent_error", server="torrent", default=''): +# config.set_setting("libtorrent_error", str(e), server="torrent") - return +# return def verify_Kodi_video_DB(): diff --git a/platformcode/envtal.py b/platformcode/envtal.py index f413d281..c68342e8 100644 --- a/platformcode/envtal.py +++ b/platformcode/envtal.py @@ -4,7 +4,6 @@ # ------------------------------------------------------------ from __future__ import division -# from builtins import str from past.utils import old_div import sys @@ -31,8 +30,8 @@ from platformcode import logger, config, platformtools def get_environment(): """ - Devuelve las variables de entorno del OS, de Kodi y de Alfa más habituales, - necesarias para el diagnóstico de fallos + Returns the most common OS, Kodi and Alpha environment variables, +    necessary for fault diagnosis """ try: @@ -56,9 +55,9 @@ def get_environment(): try: for label_a in subprocess.check_output('getprop').split('\n'): if 'build.version.release' in label_a: - environment['os_release'] = str(scrapertools.find_single_match(label_a, ':\s*\[(.*?)\]$')) + environment['os_release'] = str(scrapertools.find_single_match(label_a, r':\s*\[(.*?)\]$')) if 'product.model' in label_a: - environment['prod_model'] = str(scrapertools.find_single_match(label_a, ':\s*\[(.*?)\]$')) + environment['prod_model'] = str(scrapertools.find_single_match(label_a, r':\s*\[(.*?)\]$')) except: try: for label_a in filetools.read(os.environ['ANDROID_ROOT'] + '/build.prop').split(): @@ -196,87 +195,87 @@ def get_environment(): except: environment['videolab_free'] = '?' - environment['torrent_list'] = [] - environment['torrentcli_option'] = '' - environment['torrent_error'] = '' - environment['torrentcli_rar'] = config.get_setting("mct_rar_unpack", server="torrent", default=True) - environment['torrentcli_backgr'] = config.get_setting("mct_background_download", server="torrent", default=True) - environment['torrentcli_lib_path'] = config.get_setting("libtorrent_path", server="torrent", default="") - if environment['torrentcli_lib_path']: - lib_path = 'Activo' - else: - lib_path = 'Inactivo' - environment['torrentcli_unrar'] = config.get_setting("unrar_path", server="torrent", default="") - if environment['torrentcli_unrar']: - if xbmc.getCondVisibility("system.platform.Android"): - unrar = 'Android' - else: - unrar, bin = filetools.split(environment['torrentcli_unrar']) - unrar = unrar.replace('\\', '/') - if not unrar.endswith('/'): - unrar = unrar + '/' - unrar = scrapertools.find_single_match(unrar, '\/([^\/]+)\/$').capitalize() - else: - unrar = 'Inactivo' - torrent_id = config.get_setting("torrent_client", server="torrent", default=0) - environment['torrentcli_option'] = str(torrent_id) - torrent_options = platformtools.torrent_client_installed() - if lib_path == 'Activo': - torrent_options = ['MCT'] + torrent_options - torrent_options = ['BT'] + torrent_options - environment['torrent_list'].append({'Torrent_opt': str(torrent_id), 'Libtorrent': lib_path, \ - 'RAR_Auto': str(environment['torrentcli_rar']), \ - 'RAR_backgr': str(environment['torrentcli_backgr']), \ - 'UnRAR': unrar}) - environment['torrent_error'] = config.get_setting("libtorrent_error", server="torrent", default="") - if environment['torrent_error']: - environment['torrent_list'].append({'Libtorrent_error': environment['torrent_error']}) + # environment['torrent_list'] = [] + # environment['torrentcli_option'] = '' + # environment['torrent_error'] = '' + # environment['torrentcli_rar'] = config.get_setting("mct_rar_unpack", server="torrent", default=True) + # environment['torrentcli_backgr'] = config.get_setting("mct_background_download", server="torrent", default=True) + # environment['torrentcli_lib_path'] = config.get_setting("libtorrent_path", server="torrent", default="") + # if environment['torrentcli_lib_path']: + # lib_path = 'Activo' + # else: + # lib_path = 'Inactivo' + # environment['torrentcli_unrar'] = config.get_setting("unrar_path", server="torrent", default="") + # if environment['torrentcli_unrar']: + # if xbmc.getCondVisibility("system.platform.Android"): + # unrar = 'Android' + # else: + # unrar, bin = filetools.split(environment['torrentcli_unrar']) + # unrar = unrar.replace('\\', '/') + # if not unrar.endswith('/'): + # unrar = unrar + '/' + # unrar = scrapertools.find_single_match(unrar, '\/([^\/]+)\/$').capitalize() + # else: + # unrar = 'Inactivo' + # torrent_id = config.get_setting("torrent_client", server="torrent", default=0) + # environment['torrentcli_option'] = str(torrent_id) + # torrent_options = platformtools.torrent_client_installed() + # if lib_path == 'Activo': + # torrent_options = ['MCT'] + torrent_options + # torrent_options = ['BT'] + torrent_options + # environment['torrent_list'].append({'Torrent_opt': str(torrent_id), 'Libtorrent': lib_path, \ + # 'RAR_Auto': str(environment['torrentcli_rar']), \ + # 'RAR_backgr': str(environment['torrentcli_backgr']), \ + # 'UnRAR': unrar}) + # environment['torrent_error'] = config.get_setting("libtorrent_error", server="torrent", default="") + # if environment['torrent_error']: + # environment['torrent_list'].append({'Libtorrent_error': environment['torrent_error']}) - for torrent_option in torrent_options: - cliente = dict() - cliente['D_load_Path'] = '' - cliente['Libre'] = '?' - cliente['Plug_in'] = torrent_option.replace('Plugin externo: ', '') - if cliente['Plug_in'] == 'BT': - cliente['D_load_Path'] = str(config.get_setting("bt_download_path", server="torrent", default='')) - if not cliente['D_load_Path']: continue - cliente['Buffer'] = str(config.get_setting("bt_buffer", server="torrent", default=50)) - elif cliente['Plug_in'] == 'MCT': - cliente['D_load_Path'] = str(config.get_setting("mct_download_path", server="torrent", default='')) - if not cliente['D_load_Path']: continue - cliente['Buffer'] = str(config.get_setting("mct_buffer", server="torrent", default=50)) - elif xbmc.getCondVisibility('System.HasAddon("plugin.video.%s")' % cliente['Plug_in']): - __settings__ = xbmcaddon.Addon(id="plugin.video.%s" % cliente['Plug_in']) - cliente['Plug_in'] = cliente['Plug_in'].capitalize() - if cliente['Plug_in'] == 'Torrenter': - cliente['D_load_Path'] = str(xbmc.translatePath(__settings__.getSetting('storage'))) - if not cliente['D_load_Path']: - cliente['D_load_Path'] = str(filetools.join(xbmc.translatePath("special://home/"), \ - "cache", "xbmcup", "plugin.video.torrenter", - "Torrenter")) - cliente['Buffer'] = str(__settings__.getSetting('pre_buffer_bytes')) - else: - cliente['D_load_Path'] = str(xbmc.translatePath(__settings__.getSetting('download_path'))) - cliente['Buffer'] = str(__settings__.getSetting('buffer_size')) - if __settings__.getSetting('download_storage') == '1' and __settings__.getSetting('memory_size'): - cliente['Memoria'] = str(__settings__.getSetting('memory_size')) + # for torrent_option in torrent_options: + # cliente = dict() + # cliente['D_load_Path'] = '' + # cliente['Libre'] = '?' + # cliente['Plug_in'] = torrent_option.replace('Plugin externo: ', '') + # if cliente['Plug_in'] == 'BT': + # cliente['D_load_Path'] = str(config.get_setting("bt_download_path", server="torrent", default='')) + # if not cliente['D_load_Path']: continue + # cliente['Buffer'] = str(config.get_setting("bt_buffer", server="torrent", default=50)) + # elif cliente['Plug_in'] == 'MCT': + # cliente['D_load_Path'] = str(config.get_setting("mct_download_path", server="torrent", default='')) + # if not cliente['D_load_Path']: continue + # cliente['Buffer'] = str(config.get_setting("mct_buffer", server="torrent", default=50)) + # elif xbmc.getCondVisibility('System.HasAddon("plugin.video.%s")' % cliente['Plug_in']): + # __settings__ = xbmcaddon.Addon(id="plugin.video.%s" % cliente['Plug_in']) + # cliente['Plug_in'] = cliente['Plug_in'].capitalize() + # if cliente['Plug_in'] == 'Torrenter': + # cliente['D_load_Path'] = str(xbmc.translatePath(__settings__.getSetting('storage'))) + # if not cliente['D_load_Path']: + # cliente['D_load_Path'] = str(filetools.join(xbmc.translatePath("special://home/"), \ + # "cache", "xbmcup", "plugin.video.torrenter", + # "Torrenter")) + # cliente['Buffer'] = str(__settings__.getSetting('pre_buffer_bytes')) + # else: + # cliente['D_load_Path'] = str(xbmc.translatePath(__settings__.getSetting('download_path'))) + # cliente['Buffer'] = str(__settings__.getSetting('buffer_size')) + # if __settings__.getSetting('download_storage') == '1' and __settings__.getSetting('memory_size'): + # cliente['Memoria'] = str(__settings__.getSetting('memory_size')) - if cliente['D_load_Path']: - try: - if environment['os_name'].lower() == 'windows': - free_bytes = ctypes.c_ulonglong(0) - ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(cliente['D_load_Path']), - None, None, ctypes.pointer(free_bytes)) - cliente['Libre'] = str(round(float(free_bytes.value) / \ - (1024 ** 3), 3)).replace('.', ',') - else: - disk_space = os.statvfs(cliente['D_load_Path']) - if not disk_space.f_frsize: disk_space.f_frsize = disk_space.f_frsize.f_bsize - cliente['Libre'] = str(round((float(disk_space.f_bavail) / \ - (1024 ** 3)) * float(disk_space.f_frsize), 3)).replace('.', ',') - except: - pass - environment['torrent_list'].append(cliente) + # if cliente['D_load_Path']: + # try: + # if environment['os_name'].lower() == 'windows': + # free_bytes = ctypes.c_ulonglong(0) + # ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(cliente['D_load_Path']), + # None, None, ctypes.pointer(free_bytes)) + # cliente['Libre'] = str(round(float(free_bytes.value) / \ + # (1024 ** 3), 3)).replace('.', ',') + # else: + # disk_space = os.statvfs(cliente['D_load_Path']) + # if not disk_space.f_frsize: disk_space.f_frsize = disk_space.f_frsize.f_bsize + # cliente['Libre'] = str(round((float(disk_space.f_bavail) / \ + # (1024 ** 3)) * float(disk_space.f_frsize), 3)).replace('.', ',') + # except: + # pass + # environment['torrent_list'].append(cliente) environment['proxy_active'] = '' try: @@ -359,16 +358,16 @@ def get_environment(): def list_env(environment={}): + sep = '-----------------------------------------------------------' if not environment: environment = get_environment() if environment['debug'] == 'False': logger.log_enable(True) - logger.info('----------------------------------------------') - logger.info('Variables de entorno Alfa: ' + environment['addon_version'] + - ' Debug: ' + environment['debug']) - logger.info("----------------------------------------------") + logger.info(sep) + logger.info('KoD environment variables: ' + environment['addon_version'] + ' Debug: ' + environment['debug']) + logger.info(sep) logger.info(environment['os_name'] + ' ' + environment['prod_model'] + ' ' + environment['os_release'] + ' ' + environment['machine'] + ' ' + @@ -381,45 +380,45 @@ def list_env(environment={}): logger.info('CPU: ' + environment['cpu_usage']) if environment['mem_total'] or environment['mem_free']: - logger.info('Memoria: Total: ' + environment['mem_total'] + ' MB / Disp.: ' + - environment['mem_free'] + ' MB / Buffers: ' + - str(int(environment['kodi_buffer']) * 3) + ' MB / Buffermode: ' + - environment['kodi_bmode'] + ' / Readfactor: ' + + logger.info('Memory: Total: ' + environment['mem_total'] + ' MB | Disp.: ' + + environment['mem_free'] + ' MB | Buffers: ' + + str(int(environment['kodi_buffer']) * 3) + ' MB | Buffermode: ' + + environment['kodi_bmode'] + ' | Readfactor: ' + environment['kodi_rfactor']) - logger.info('Userdata: ' + environment['userdata_path'] + ' - Libre: ' + + logger.info('Userdata: ' + environment['userdata_path'] + ' - Free: ' + environment['userdata_free'].replace('.', ',') + ' GB') - logger.info('Videoteca: Series/Epis: ' + environment['videolab_series'] + '/' + + logger.info('Videolibrary: Series/Episodes: ' + environment['videolab_series'] + '/' + environment['videolab_episodios'] + ' - Pelis: ' + environment['videolab_pelis'] + ' - Upd: ' + environment['videolab_update'] + ' - Path: ' + - environment['videolab_path'] + ' - Libre: ' + + environment['videolab_path'] + ' - Free: ' + environment['videolab_free'].replace('.', ',') + ' GB') - if environment['torrent_list']: - for x, cliente in enumerate(environment['torrent_list']): - if x == 0: - cliente_alt = cliente.copy() - del cliente_alt['Torrent_opt'] - logger.info('Torrent: Opt: %s, %s' % (str(cliente['Torrent_opt']), \ - str(cliente_alt).replace('{', '').replace('}', '') \ - .replace("'", '').replace('_', ' '))) - elif x == 1 and environment['torrent_error']: - logger.info('- ' + str(cliente).replace('{', '').replace('}', '') \ - .replace("'", '').replace('_', ' ')) - else: - cliente_alt = cliente.copy() - del cliente_alt['Plug_in'] - cliente_alt['Libre'] = cliente_alt['Libre'].replace('.', ',') + ' GB' - logger.info('- %s: %s' % (str(cliente['Plug_in']), str(cliente_alt) \ - .replace('{', '').replace('}', '').replace("'", '') \ - .replace('\\\\', '\\'))) + # if environment['torrent_list']: + # for x, cliente in enumerate(environment['torrent_list']): + # if x == 0: + # cliente_alt = cliente.copy() + # del cliente_alt['Torrent_opt'] + # logger.info('Torrent: Opt: %s, %s' % (str(cliente['Torrent_opt']), \ + # str(cliente_alt).replace('{', '').replace('}', '') \ + # .replace("'", '').replace('_', ' '))) + # elif x == 1 and environment['torrent_error']: + # logger.info('- ' + str(cliente).replace('{', '').replace('}', '') \ + # .replace("'", '').replace('_', ' ')) + # else: + # cliente_alt = cliente.copy() + # del cliente_alt['Plug_in'] + # cliente_alt['Libre'] = cliente_alt['Libre'].replace('.', ',') + ' GB' + # logger.info('- %s: %s' % (str(cliente['Plug_in']), str(cliente_alt) \ + # .replace('{', '').replace('}', '').replace("'", '') \ + # .replace('\\\\', '\\'))) - logger.info('Proxy: ' + environment['proxy_active']) + # logger.info('Proxy: ' + environment['proxy_active']) - logger.info('TAMAÑO del LOG: ' + environment['log_size'].replace('.', ',') + ' MB') - logger.info("----------------------------------------------") + logger.info('LOG Size: ' + environment['log_size'].replace('.', ',') + ' MB') + logger.info(sep) if environment['debug'] == 'False': logger.log_enable(False) diff --git a/platformcode/keymaptools.py b/platformcode/keymaptools.py index 3f2ae5eb..bc3be98e 100644 --- a/platformcode/keymaptools.py +++ b/platformcode/keymaptools.py @@ -1,18 +1,14 @@ # -*- coding: utf-8 -*- from builtins import map -#from builtins import str -import sys +import sys, xbmc, xbmcaddon, xbmcgui, base64, json PY3 = False if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int from threading import Timer -import xbmc -import xbmcaddon -import xbmcgui - from channelselector import get_thumb from platformcode import config, logger +import channelselector class KeyListener(xbmcgui.WindowXMLDialog): @@ -66,23 +62,11 @@ def set_key(): from platformcode import platformtools import xbmc file_xml = "special://profile/keymaps/kod.xml" - data = '<keymap><global><keyboard><key id="%s">' % new_key + 'runplugin(plugin://' \ - 'plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAia2V5bWFwIiwNCiAgICAib3BlbiI6IHRydWUNCn0=)</key></keyboard></global></keymap>' + data = '<keymap><global><keyboard><key id="%s">' % new_key + 'runplugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAia2V5bWFwIiwNCiAgICAib3BlbiI6IHRydWUNCn0=)</key></keyboard></global></keymap>' filetools.write(xbmc.translatePath(file_xml), data) platformtools.dialog_notification(config.get_localized_string(70700),config.get_localized_string(70702)) config.set_setting("shortcut_key", new_key) - # file_idioma = filetools.join(config.get_runtime_path(), 'resources', 'language', 'Spanish', 'strings.xml') - # data = filetools.read(file_idioma) - # value_xml = scrapertools.find_single_match(data, '<string id="31100">([^<]+)<') - # if "tecla" in value_xml: - # data = data.replace(value_xml, 'Cambiar tecla/botón para abrir la ventana (Guardada: %s)' % new_key) - # elif "key" in value_xml: - # data = data.replace(value_xml, 'Change key/button to open the window (Saved: %s)' % new_key) - # else: - # data = data.replace(value_xml, - # 'Cambiamento di chiave/pulsante per aprire la finestra (Salvato: %s)' % new_key) - # filetools.write(file_idioma, data) return @@ -98,16 +82,6 @@ def delete_key(): config.set_setting("shortcut_key", '') -MAIN_MENU = { - "news": {"label": config.get_localized_string(30130), "icon": get_thumb("news.png"), "order": 0}, - "channels": {"label": config.get_localized_string(30118), "icon": get_thumb("channels.png"), "order": 1}, - "search": {"label": config.get_localized_string(70082), "icon": get_thumb("search.png"), "order": 2}, - "favorites": {"label": config.get_localized_string(30102), "icon": get_thumb("favorites.png"), "order": 3}, - "videolibrary": {"label": config.get_localized_string(30131), "icon": get_thumb("videolibrary.png"), "order": 4}, - "downloads": {"label": config.get_localized_string(60332), "icon": get_thumb("downloads.png"), "order": 5}, - "settings": {"label": config.get_localized_string(60333), "icon": get_thumb("setting_0.png"), "order": 6} -} - class Main(xbmcgui.WindowXMLDialog): def __init__(self, *args, **kwargs): @@ -118,61 +92,71 @@ class Main(xbmcgui.WindowXMLDialog): if config.get_platform(True)['num_version'] < 18: self.setCoordinateResolution(2) - for menuentry in list(MAIN_MENU.keys()): - item = xbmcgui.ListItem(MAIN_MENU[menuentry]["label"]) - item.setProperty("thumb", str(MAIN_MENU[menuentry]["icon"])) - item.setProperty("identifier", str(menuentry)) - item.setProperty("order", str(MAIN_MENU[menuentry]["order"])) - self.items.append(item) + for menuentry in menu: + if not menuentry.channel: menuentry.channel = prevchannel + item = xbmcgui.ListItem(menuentry.title) + if not submenu and menuentry.channel in ['news', 'channelselector', 'search', 'videolibrary']: + item.setProperty('sub', 'Controls/spinUp-Focus.png') + if menuentry.title != 'Redirect': + for key, value in json.loads(menuentry.tojson()).items(): + item.setProperty(key, str(value)) + item.setProperty('run', menuentry.tojson()) + self.items.append(item) - self.items.sort(key=lambda it: it.getProperty("order")) self.getControl(32500).addItems(self.items) self.setFocusId(32500) def onClick(self, control_id): if control_id == 32500: - identifier = self.getControl(32500).getSelectedItem().getProperty("identifier") - if identifier == "news": - xbmc.executebuiltin('Dialog.Close(all,true)') - xbmc.executebuiltin( - 'ActivateWindow(10025, "plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAibWFpbmxpc3QiLCANCiAgICAiY2hhbm5lbCI6ICJuZXdzIg0KfQ==")') - elif identifier == "channels": - xbmc.executebuiltin('Dialog.Close(all,true)') - xbmc.executebuiltin( - 'ActivateWindow(10025, "plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAiZ2V0Y2hhbm5lbHR5cGVzIiwgDQogICAgImNoYW5uZWwiOiAiY2hhbm5lbHNlbGVjdG9yIg0KfQ==")') - elif identifier == "search": - xbmc.executebuiltin('Dialog.Close(all,true)') - xbmc.executebuiltin( - 'ActivateWindow(10025, "plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAibWFpbmxpc3QiLCANCiAgICAiY2hhbm5lbCI6ICJzZWFyY2giDQp9")') - elif identifier == "favorites": - xbmc.executebuiltin('Dialog.Close(all,true)') - xbmc.executebuiltin( - 'ActivateWindow(10025, "plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAibWFpbmxpc3QiLCANCiAgICAiY2hhbm5lbCI6ICJmYXZvcml0ZXMiDQp9")') - elif identifier == "videolibrary": - xbmc.executebuiltin('Dialog.Close(all,true)') - xbmc.executebuiltin( - 'ActivateWindow(10025, "plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAibWFpbmxpc3QiLCANCiAgICAiY2hhbm5lbCI6ICJ2aWRlb2xpYnJhcnkiDQp9")') - elif identifier == "downloads": - xbmc.executebuiltin('Dialog.Close(all,true)') - xbmc.executebuiltin( - 'ActivateWindow(10025, "plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAibWFpbmxpc3QiLCANCiAgICAiY2hhbm5lbCI6ICJkb3dubG9hZHMiDQp9")') - elif identifier == "settings": - xbmc.executebuiltin('Dialog.Close(all,true)') - xbmc.executebuiltin( - 'ActivateWindow(10025, "plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAibWFpbmxpc3QiLCANCiAgICAiY2hhbm5lbCI6ICJzZXR0aW5nIg0KfQ==")') + action = self.getControl(32500).getSelectedItem().getProperty('run') + self.close() + xbmc.executebuiltin('ActivateWindow(10025, "plugin://plugin.video.kod/?' + base64.b64encode(action) + '")') + def onAction(self, action): # exit if action.getId() in [xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK]: - # main.close() - xbmc.executebuiltin('Dialog.Close(all,true)') + self.close() + if submenu: open_shortcut_menu() if action.getId() == xbmcgui.ACTION_CONTEXT_MENU: config.open_settings() + focus = self.getFocusId() -def open_shortcut_menu(): + if action == 3: + if focus == 61: + self.setFocusId(32500) + elif submenu: + self.close() + open_shortcut_menu() + elif self.getControl(32500).getSelectedItem().getProperty('channel') in ['news', 'channelselector', 'search', 'videolibrary']: + channel_name = self.getControl(32500).getSelectedItem().getProperty('channel') + if channel_name == 'channelselector': + import channelselector + self.close() + open_shortcut_menu(channelselector.getchanneltypes(), channel_name) + else: + from core.item import Item + channel = __import__('specials.%s' % channel_name, fromlist=["specials.%s" % channel_name]) + self.close() + open_shortcut_menu(channel.mainlist(Item()), channel_name) + + + +def open_shortcut_menu(newmenu='', channel=''): + xbmc.executebuiltin('Dialog.Close(all,true)') + global menu + global submenu + global prevchannel + prevchannel = channel + if newmenu: + menu = newmenu + submenu = True + else: + menu = channelselector.getmainlist() + submenu = False XML = 'ShortCutMenu.xml' if config.get_setting('icon_set') == 'dark': XML = 'Dark' + XML diff --git a/platformcode/launcher.py b/platformcode/launcher.py index d9ab9f8b..c6a80bb6 100644 --- a/platformcode/launcher.py +++ b/platformcode/launcher.py @@ -10,13 +10,12 @@ import sys PY3 = False if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int -if PY3: - import urllib.error as urllib2 # Es muy lento en PY2. En PY3 es nativo -else: - import urllib2 # Usamos el nativo de PY2 que es más rápido +# if PY3: +# import urllib.error as urllib2 # Es muy lento en PY2. En PY3 es nativo +# else: +# import urllib2 # Usamos el nativo de PY2 que es más rápido import os -import sys from core.item import Item from platformcode import config, logger @@ -163,17 +162,6 @@ def run(item=None): config.get_localized_string(70740) % short) # Action in certain channel specified in "action" and "channel" parameters else: - # Entry point for a channel is the "mainlist" action, so here we check parental control - if item.action == "mainlist": - from core import channeltools - #updater.checkforupdates() beta version checking for update, still disabled - - # Parental control - # If it is an adult channel, and user has configured pin, asks for it - if channeltools.is_adult(item.channel) and config.get_setting("adult_request_password"): - tecleado = platformtools.dialog_input("", config.get_localized_string(60334), True) - if tecleado is None or tecleado != config.get_setting("adult_password"): - return # # Actualiza el canal individual # if (item.action == "mainlist" and item.channel != "channelselector" and # config.get_setting("check_for_channel_updates") == True): @@ -183,16 +171,10 @@ def run(item=None): # Checks if channel exists if os.path.isfile(os.path.join(config.get_runtime_path(), 'channels', item.channel + ".py")): CHANNELS = 'channels' - elif os.path.isfile(os.path.join(config.get_runtime_path(), 'channels', 'porn', item.channel + ".py")): - CHANNELS = 'channels.porn' else: CHANNELS = 'specials' - if CHANNELS != 'channels.porn': - channel_file = os.path.join(config.get_runtime_path(), CHANNELS, item.channel + ".py") - else: - channel_file = os.path.join(config.get_runtime_path(), 'channels', 'porn', - item.channel + ".py") + channel_file = os.path.join(config.get_runtime_path(), CHANNELS, item.channel + ".py") logger.info("channel_file= " + channel_file + ' - ' + CHANNELS + ' - ' + item.channel) @@ -329,21 +311,21 @@ def run(item=None): platformtools.render_items(itemlist, item) - except urllib2.URLError as e: - import traceback - logger.error(traceback.format_exc()) - - # Grab inner and third party errors - if hasattr(e, 'reason'): - logger.error("Reason for the error, code: %s | Reason: %s" % (str(e.reason[0]), str(e.reason[1]))) - texto = config.get_localized_string(30050) # "No se puede conectar con el sitio web" - platformtools.dialog_ok(config.get_localized_string(20000), texto) - - # Grab server response errors - elif hasattr(e, 'code'): - logger.error("HTTP error code: %d" % e.code) - # "El sitio web no funciona correctamente (error http %d)" - platformtools.dialog_ok(config.get_localized_string(20000), config.get_localized_string(30051) % e.code) + # except urllib2.URLError as e: + # import traceback + # logger.error(traceback.format_exc()) + # + # # Grab inner and third party errors + # if hasattr(e, 'reason'): + # logger.error("Reason for the error, code: %s | Reason: %s" % (str(e.reason[0]), str(e.reason[1]))) + # texto = config.get_localized_string(30050) # "No se puede conectar con el sitio web" + # platformtools.dialog_ok(config.get_localized_string(20000), texto) + # + # # Grab server response errors + # elif hasattr(e, 'code'): + # logger.error("HTTP error code: %d" % e.code) + # # "El sitio web no funciona correctamente (error http %d)" + # platformtools.dialog_ok(config.get_localized_string(20000), config.get_localized_string(30051) % e.code) except WebErrorException as e: import traceback from core import scrapertools diff --git a/platformcode/platformtools.py b/platformcode/platformtools.py index 0a187aa0..d9f85ae9 100644 --- a/platformcode/platformtools.py +++ b/platformcode/platformtools.py @@ -2,43 +2,31 @@ # ------------------------------------------------------------ # platformtools # ------------------------------------------------------------ -# Herramientas responsables de adaptar los diferentes -# cuadros de dialogo a una plataforma en concreto, -# en este caso Kodi. +# Tools responsible for adapting the different dialog boxes to a specific platform. # version 2.0 # ------------------------------------------------------------ from __future__ import division from __future__ import absolute_import from past.utils import old_div -#from builtins import str import sys PY3 = False if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int if PY3: - #from future import standard_library - #standard_library.install_aliases() - import urllib.parse as urllib # Es muy lento en PY2. En PY3 es nativo + import urllib.parse as urllib else: - import urllib # Usamos el nativo de PY2 que es más rápido + import urllib -import os - -import xbmc -import xbmcgui -import xbmcplugin -import xbmcaddon +import os, xbmc, xbmcgui, xbmcplugin from channelselector import get_thumb from core import channeltools from core import trakt_tools, scrapertools from core.item import Item -from platformcode import logger -from platformcode import config -from platformcode import unify +from platformcode import logger, config, unify -addon = xbmcaddon.Addon('plugin.video.kod') +addon = config.__settings__ addon_icon = os.path.join( addon.getAddonInfo( "path" ), "logo.png" ) class XBMCPlayer(xbmc.Player): @@ -86,8 +74,8 @@ def dialog_yesno(heading, line1, line2="", line3="", nolabel="No", yeslabel="Si" return dialog.yesno(heading, makeMessage(line1, line2, line3), nolabel=nolabel, yeslabel=yeslabel) -def dialog_select(heading, _list): - return xbmcgui.Dialog().select(heading, _list) +def dialog_select(heading, _list, preselect=0): + return xbmcgui.Dialog().select(heading, _list, preselect=preselect) def dialog_multiselect(heading, _list, autoclose=0, preselect=[], useDetails=False): @@ -124,7 +112,7 @@ def dialog_numeric(_type, heading, default=""): return d -def dialog_textviewer(heading, text): # disponible a partir de kodi 16 +def dialog_textviewer(heading, text): # available from kodi 16 return xbmcgui.Dialog().textviewer(heading, text) @@ -135,8 +123,16 @@ def dialog_browse(_type, heading, default=""): def itemlist_refresh(): + pos = Item().fromurl(xbmc.getInfoLabel('ListItem.FileNameAndPath')).itemlistPosition + logger.info('Current position: ' + str(pos)) xbmc.executebuiltin("Container.Refresh") + while Item().fromurl(xbmc.getInfoLabel('ListItem.FileNameAndPath')).itemlistPosition != pos: + win = xbmcgui.Window(xbmcgui.getCurrentWindowId()) + cid = win.getFocusId() + ctl = win.getControl(cid) + ctl.selectItem(pos) + def itemlist_update(item, replace=False): if replace: # reset the path history @@ -172,14 +168,15 @@ def render_items(itemlist, parent_item): itemlist.append(Item(title=config.get_localized_string(60347), thumbnail=get_thumb('nofolder.png'))) dirItems = [] - for item in itemlist: + for n, item in enumerate(itemlist): + item.itemlistPosition = n + 1 item_url = item.tourl() if item.category == "": item.category = parent_item.category if not item.title: item.title = '' - # Si no hay action o es findvideos/play, folder=False porque no se va a devolver ningún listado + # If there is no action or it is findvideos / play, folder = False because no listing will be returned if item.action in ['play', '']: item.folder = False if item.fanart == "": @@ -187,11 +184,15 @@ def render_items(itemlist, parent_item): if item.action == 'play' and thumb_type == 1 and not item.forcethumb: item.thumbnail = "https://github.com/kodiondemand/media/raw/master/resources/servers/" + item.server.lower() + '.png' - # if cloudflare, cookies are needed to display images taken from site + # if cloudflare and cloudscraper is used, cookies are needed to display images taken from site # before checking domain (time consuming), checking if tmdb failed (so, images scraped from website are used) - if item.action in ['findvideos'] and not item.infoLabels['tmdb_id'] and item.channel in httptools.channelsCF: - item.thumbnail = httptools.get_url_headers(item.thumbnail) - item.fanart = httptools.get_url_headers(item.fanart) + if item.action in ['findvideos'] and not item.infoLabels['tmdb_id']: + # faster but ugly way of checking + for d in httptools.FORCE_CLOUDSCRAPER_LIST: + if d + '/' in item.url: + item.thumbnail = httptools.get_url_headers(item.thumbnail) + item.fanart = httptools.get_url_headers(item.fanart) + break icon_image = "DefaultFolder.png" if item.folder else "DefaultVideo.png" listitem = xbmcgui.ListItem(item.title) @@ -205,8 +206,7 @@ def render_items(itemlist, parent_item): # context menu if parent_item.channel != 'special': - context_commands = def_context_commands + set_context_commands(item, item_url, parent_item, has_extendedinfo=has_extendedinfo, - superfavourites=superfavourites) + context_commands = def_context_commands + set_context_commands(item, item_url, parent_item, has_extendedinfo=has_extendedinfo, superfavourites=superfavourites) else: context_commands = def_context_commands listitem.addContextMenuItems(context_commands) @@ -233,316 +233,326 @@ def render_items(itemlist, parent_item): logger.info('END render_items') -def set_view_mode(item, parent_item): - def mode(content, Type): - mode = int(config.get_setting('view_mode_%s' % content).split(',')[-1]) - if mode == 0: - logger.info('default mode') - mode = 55 - elif not Type: - Type = 'addons' - xbmcplugin.setContent(handle=int(sys.argv[1]), content=Type) - xbmc.executebuiltin('Container.SetViewMode(%s)' % mode) - logger.info('TYPE: ' + Type + ' - ' + 'CONTENT: ' + content) +def getCurrentView(item=None, parent_item=None): + if not parent_item: + info = xbmc.getInfoLabel('Container.FolderPath') + if not info: + return None, None + parent_item = Item().fromurl(info) + if not item: + info = xbmc.getInfoLabel('Container.ListItem(1).FileNameAndPath') + if not info: + return None, None + item = Item().fromurl(info) if info else Item() + parent_actions = ['peliculas', 'novedades', 'search', 'get_from_temp', 'newest', 'discover_list', 'new_search', 'channel_search'] + if parent_item.action == 'findvideos' or (parent_item.action in ['channel_search', 'new_search'] and parent_item.infoLabels['tmdb_id']): + return 'server', 'addons' if config.get_setting('touch_view') else '' + + elif parent_item.action == 'mainlist': + return 'channel', 'addons' if config.get_setting('touch_view') else '' + + elif (item.contentType in ['movie'] and parent_item.action in parent_actions) \ + or (item.channel in ['videolibrary'] and parent_item.action in ['list_movies']) \ + or (parent_item.channel in ['favorites'] and parent_item.action in ['mainlist']) \ + or parent_item.action in ['now_on_tv', 'now_on_misc', 'now_on_misc_film', 'mostrar_perfil']: + return 'movie', 'movies' + + elif (item.contentType in ['tvshow'] and parent_item.action in parent_actions) \ + or (item.channel in ['videolibrary'] and parent_item.action in ['list_tvshows']): + return 'tvshow', 'tvshows' + + elif parent_item.action in ['get_seasons']: + return 'season', 'tvshows' + + elif parent_item.action in ['episodios', 'get_episodes'] or item.contentType == 'episode': + return 'episode', 'tvshows' + + else: + return 'addon', 'addons' if config.get_setting('touch_view') else '' + + +def set_view_mode(item, parent_item): def reset_view_mode(): for mode in ['addon','channel','movie','tvshow','season','episode','server']: config.set_setting('skin_name', xbmc.getSkinDir()) config.set_setting('view_mode_%s' % mode, config.get_localized_string(70003) + ' , 0') - parent_actions = ['peliculas', 'novedades', 'search', 'get_from_temp', 'channel_search', 'newest', 'discover_list', 'new_search'] - if xbmc.getSkinDir() != config.get_setting('skin_name') or not config.get_setting('skin_name'): reset_view_mode() xbmcplugin.setContent(handle=int(sys.argv[1]), content='') xbmc.executebuiltin('Container.SetViewMode(%s)' % 55) - elif parent_item.action == 'findvideos': - mode('server', '') - - elif parent_item.action == 'mainlist': - mode('channel', '') - - elif (item.contentType in ['movie'] and parent_item.action in parent_actions ) \ - or (item.channel in ['videolibrary'] and parent_item.action in ['list_movies']) \ - or (parent_item.channel in ['favorites'] and parent_item.action in ['mainlist']) \ - or parent_item.action in ['now_on_tv', 'now_on_misc', 'now_on_misc_film', 'mostrar_perfil']: - mode('movie', 'movies') - - elif (item.contentType in ['tvshow'] and parent_item.action in parent_actions ) \ - or (item.channel in ['videolibrary'] and parent_item.action in ['list_tvshows']): - mode('tvshow', 'tvshows') - - elif parent_item.action in ['get_seasons']: - mode('season', 'tvshows') - - elif parent_item.action in ['episodios', 'get_episodes'] or item.contentType == 'episode': - mode('episode', 'tvshows') - - else: - mode('addon', '') + content, Type = getCurrentView(item, parent_item) + if content: + mode = int(config.get_setting('view_mode_%s' % content).split(',')[-1]) + if mode == 0: + logger.info('default mode') + mode = 55 + xbmcplugin.setContent(handle=int(sys.argv[1]), content=Type) + xbmc.executebuiltin('Container.SetViewMode(%s)' % mode) + logger.info('TYPE: ' + Type + ' - ' + 'CONTENT: ' + content) -def render_items_old(itemlist, parent_item): - """ - Función encargada de mostrar el itemlist en kodi, se pasa como parametros el itemlist y el item del que procede - @type itemlist: list - @param itemlist: lista de elementos a mostrar +# def render_items_old(itemlist, parent_item): +# """ +# Function responsible for displaying the itemlist in kodi, the itemlist and the item it comes from are passed as parameters +# @type itemlist: list +# @param itemlist: list of elements to show - @type parent_item: item - @param parent_item: elemento padre - """ - logger.info('INICIO render_items') - from core import httptools +# @type parent_item: item +# @param parent_item: parent element +# """ +# logger.info('START render_items') +# from core import httptools - # Si el itemlist no es un list salimos - if not isinstance(itemlist, list): - return +# # If the itemlist is not a list we leave +# if not isinstance(itemlist, list): +# return - if parent_item.start: - menu_icon = get_thumb('menu.png') - menu = Item(channel="channelselector", action="getmainlist", viewmode="movie", thumbnail=menu_icon, - title='Menu') - itemlist.insert(0, menu) +# if parent_item.start: +# menu_icon = get_thumb('menu.png') +# menu = Item(channel="channelselector", action="getmainlist", viewmode="movie", thumbnail=menu_icon, title='Menu') +# itemlist.insert(0, menu) - # Si no hay ningun item, mostramos un aviso - if not len(itemlist): - itemlist.append(Item(title=config.get_localized_string(60347), thumbnail=get_thumb('nofolder.png'))) +# # If there is no item, we show a notice +# if not len(itemlist): +# itemlist.append(Item(title=config.get_localized_string(60347), thumbnail=get_thumb('nofolder.png'))) - genre = False - if 'nero' in parent_item.title: - genre = True - anime = False - if 'anime' in channeltools.get_channel_parameters(parent_item.channel)['categories']: - anime = True - # try: - # force_unify = channeltools.get_channel_parameters(parent_item.channel)['force_unify'] - # except: - force_unify = False +# genre = False +# if 'nero' in parent_item.title: +# genre = True +# anime = False +# if 'anime' in channeltools.get_channel_parameters(parent_item.channel)['categories']: +# anime = True +# # try: +# # force_unify = channeltools.get_channel_parameters(parent_item.channel)['force_unify'] +# # except: +# force_unify = False - unify_enabled = False +# unify_enabled = False - has_extendedinfo = xbmc.getCondVisibility('System.HasAddon(script.extendedinfo)') +# has_extendedinfo = xbmc.getCondVisibility('System.HasAddon(script.extendedinfo)') - # Añadir SuperFavourites al menu contextual (1.0.53 o superior necesario) - sf_file_path = xbmc.translatePath("special://home/addons/plugin.program.super.favourites/LaunchSFMenu.py") - check_sf = os.path.exists(sf_file_path) - superfavourites = check_sf and xbmc.getCondVisibility('System.HasAddon("plugin.program.super.favourites")') - # try: - # if channeltools.get_channel_parameters(parent_item.channel)['adult']: - # unify_enabled = False - # except: - # pass - # logger.debug('unify_enabled: %s' % unify_enabled) +# # Add SuperFavourites to context menu (1.0.53 or higher required) +# sf_file_path = xbmc.translatePath("special://home/addons/plugin.program.super.favourites/LaunchSFMenu.py") +# check_sf = os.path.exists(sf_file_path) +# superfavourites = check_sf and xbmc.getCondVisibility('System.HasAddon("plugin.program.super.favourites")') +# # try: +# # if channeltools.get_channel_parameters(parent_item.channel)['adult']: +# # unify_enabled = False +# # except: +# # pass +# # logger.debug('unify_enabled: %s' % unify_enabled) - # Recorremos el itemlist - for item in itemlist: - # logger.debug(item) - # Si el item no contiene categoria, le ponemos la del item padre - item_url = item.tourl() - if item.category == "": - item.category = parent_item.category +# # We go through the itemlist +# for item in itemlist: +# # logger.debug(item) +# # If the item does not contain a category, we will add the parent item +# item_url = item.tourl() +# if item.category == "": +# item.category = parent_item.category - # Si title no existe, lo iniciamos como str, para evitar errones "NoType" - if not item.title: - item.title = '' +# # If title does not exist, we start it as str, to avoid "NoType" mistakes +# if not item.title: +# item.title = '' - # Si no hay action o es findvideos/play, folder=False porque no se va a devolver ningún listado - if item.action in ['play', '']: - item.folder = False +# # If there is no action or it is findvideos / play, folder = False because no listing will be returned +# if item.action in ['play', '']: +# item.folder = False - # Si el item no contiene fanart, le ponemos el del item padre - if item.fanart == "": - item.fanart = parent_item.fanart +# # If the item does not contain fanart, we put the one of the parent item +# if item.fanart == "": +# item.fanart = parent_item.fanart - if genre: - valid_genre = True - thumb = get_thumb(item.title, auto=True) - if thumb != '': - item.thumbnail = thumb - valid_genre = True - elif anime: - valid_genre = True - elif (('siguiente' in item.title.lower() and '>' in item.title) or ('pagina:' in item.title.lower())): - item.thumbnail = get_thumb("next.png") - elif 'add' in item.action: - if 'pelicula' in item.action: - item.thumbnail = get_thumb("add_to_videolibrary.png") - elif 'serie' in item.action: - item.thumbnail = get_thumb("add_to_videolibrary.png") +# if genre: +# valid_genre = True +# thumb = get_thumb(item.title, auto=True) +# if thumb != '': +# item.thumbnail = thumb +# valid_genre = True +# elif anime: +# valid_genre = True +# elif (('siguiente' in item.title.lower() and '>' in item.title) or ('pagina:' in item.title.lower())): +# item.thumbnail = get_thumb("next.png") +# elif 'add' in item.action: +# if 'pelicula' in item.action: +# item.thumbnail = get_thumb("add_to_videolibrary.png") +# elif 'serie' in item.action: +# item.thumbnail = get_thumb("add_to_videolibrary.png") - if (unify_enabled or force_unify) and parent_item.channel not in ['kodfavourites']: - # Formatear titulo con unify - item = unify.title_format(item) - else: - # Formatear titulo metodo old school - if item.text_color: - item.title = '[COLOR %s]%s[/COLOR]' % (item.text_color, item.title) - if item.text_bold: - item.title = '[B]%s[/B]' % item.title - if item.text_italic: - item.title = '[I]%s[/I]' % item.title +# if (unify_enabled or force_unify) and parent_item.channel not in ['kodfavourites']: +# # Format title with unify +# item = unify.title_format(item) +# else: +# # Format title method old school +# if item.text_color: +# item.title = '[COLOR %s]%s[/COLOR]' % (item.text_color, item.title) +# if item.text_bold: +# item.title = '[B]%s[/B]' % item.title +# if item.text_italic: +# item.title = '[I]%s[/I]' % item.title - # Añade headers a las imagenes si estan en un servidor con cloudflare - if item.action == 'play': - item.thumbnail = unify.thumbnail_type(item) - else: - item.thumbnail = httptools.get_url_headers(item.thumbnail) - item.fanart = httptools.get_url_headers(item.fanart) +# # Add headers to images if they are on a server with cloudflare +# if item.action == 'play': +# item.thumbnail = unify.thumbnail_type(item) +# else: +# item.thumbnail = httptools.get_url_headers(item.thumbnail) +# item.fanart = httptools.get_url_headers(item.fanart) - # IconImage para folder y video - if item.folder: - icon_image = "DefaultFolder.png" - else: - icon_image = "DefaultVideo.png" +# # Icon Image for folder and video +# if item.folder: +# icon_image = "DefaultFolder.png" +# else: +# icon_image = "DefaultVideo.png" - # Ponemos el fanart - if item.fanart: - fanart = item.fanart - else: - fanart = config.get_fanart() +# # fanart +# if item.fanart: +# fanart = item.fanart +# else: +# fanart = config.get_fanart() - # Creamos el listitem - listitem = xbmcgui.ListItem(item.title) +# # Create listitem +# listitem = xbmcgui.ListItem(item.title) - # values icon, thumb or poster are skin dependent.. so we set all to avoid problems - # if not exists thumb it's used icon value - if config.get_platform(True)['num_version'] >= 16.0: - listitem.setArt({'icon': icon_image, 'thumb': item.thumbnail, 'poster': item.thumbnail, - 'fanart': fanart}) - else: - listitem.setIconImage(icon_image) - listitem.setThumbnailImage(item.thumbnail) - listitem.setProperty('fanart_image', fanart) +# # values icon, thumb or poster are skin dependent.. so we set all to avoid problems +# # if not exists thumb it's used icon value +# if config.get_platform(True)['num_version'] >= 16.0: +# listitem.setArt({'icon': icon_image, 'thumb': item.thumbnail, 'poster': item.thumbnail, +# 'fanart': fanart}) +# else: +# listitem.setIconImage(icon_image) +# listitem.setThumbnailImage(item.thumbnail) +# listitem.setProperty('fanart_image', fanart) - # No need it, use fanart instead - # xbmcplugin.setPluginFanart(int(sys.argv[1]), os.path.join(config.get_runtime_path(), "fanart.jpg")) +# # No need it, use fanart instead +# # xbmcplugin.setPluginFanart(int(sys.argv[1]), os.path.join(config.get_runtime_path(), "fanart.jpg")) - # Esta opcion es para poder utilizar el xbmcplugin.setResolvedUrl() - # if item.isPlayable == True or (config.get_setting("player_mode") == 1 and item.action == "play"): - if config.get_setting("player_mode") == 1 and item.action == "play": - listitem.setProperty('IsPlayable', 'true') +# # This option is to be able to use the xbmcplugin.setResolvedUrl() +# # if item.isPlayable == True or (config.get_setting("player_mode") == 1 and item.action == "play"): +# if config.get_setting("player_mode") == 1 and item.action == "play": +# listitem.setProperty('IsPlayable', 'true') - # Añadimos los infoLabels - set_infolabels(listitem, item) +# # Add infoLabels +# set_infolabels(listitem, item) - # No arrastrar plot si no es una peli/serie/temporada/episodio - if item.plot and item.contentType not in ['movie', 'tvshow', 'season', 'episode']: - item.__dict__['infoLabels'].pop('plot') +# # Do not drag plot if it is not a movie / series / season / episode +# if item.plot and item.contentType not in ['movie', 'tvshow', 'season', 'episode']: +# item.__dict__['infoLabels'].pop('plot') - # Montamos el menu contextual - if parent_item.channel != 'special': - context_commands = set_context_commands(item, item_url, parent_item, has_extendedinfo=has_extendedinfo, superfavourites=superfavourites) - else: - context_commands = [] - # Añadimos el menu contextual - if config.get_platform(True)['num_version'] >= 17.0 and parent_item.list_type == '': - listitem.addContextMenuItems(context_commands) - elif parent_item.list_type == '': - listitem.addContextMenuItems(context_commands, replaceItems=True) +# # Mount context menu +# if parent_item.channel != 'special': +# context_commands = set_context_commands(item, item_url, parent_item, has_extendedinfo=has_extendedinfo, superfavourites=superfavourites) +# else: +# context_commands = [] +# # Add context menu +# if config.get_platform(True)['num_version'] >= 17.0 and parent_item.list_type == '': +# listitem.addContextMenuItems(context_commands) +# elif parent_item.list_type == '': +# listitem.addContextMenuItems(context_commands, replaceItems=True) - from specials import shortcuts - context_commands += shortcuts.context() +# from specials import shortcuts +# context_commands += shortcuts.context() - if not item.totalItems: - item.totalItems = 0 - xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url='%s?%s' % (sys.argv[0], item_url), - listitem=listitem, isFolder=item.folder, - totalItems=item.totalItems) +# if not item.totalItems: +# item.totalItems = 0 +# xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url='%s?%s' % (sys.argv[0], item_url), +# listitem=listitem, isFolder=item.folder, +# totalItems=item.totalItems) - # Fijar los tipos de vistas... - if config.get_setting("forceview"): # ...forzamos segun el viewcontent - xbmcplugin.setContent(int(sys.argv[1]), parent_item.viewcontent) +# # Set types of views ... +# if config.get_setting("forceview"): # ...force according to the viewcontent +# xbmcplugin.setContent(int(sys.argv[1]), parent_item.viewcontent) - elif parent_item.channel not in ["channelselector", "", "kodfavourites"]: # ... o segun el canal - xbmcplugin.setContent(int(sys.argv[1]), "movies") +# elif parent_item.channel not in ["channelselector", "", "kodfavourites"]: # ... or according to the channel +# xbmcplugin.setContent(int(sys.argv[1]), "movies") - elif parent_item.channel == "kodfavourites" and parent_item.action == 'mostrar_perfil': - xbmcplugin.setContent(int(sys.argv[1]), "movies") +# elif parent_item.channel == "kodfavourites" and parent_item.action == 'mostrar_perfil': +# xbmcplugin.setContent(int(sys.argv[1]), "movies") - # Fijamos el "breadcrumb" - if parent_item.list_type == '': - breadcrumb = parent_item.category.capitalize() - else: - if 'similar' in parent_item.list_type: - if parent_item.contentTitle != '': - breadcrumb = config.get_localized_string(70693) + parent_item.contentTitle - else: - breadcrumb = config.get_localized_string(70693) + parent_item.contentSerieName - else: - breadcrumb = config.get_localized_string(70693) +# # set "breadcrumb" +# if parent_item.list_type == '': +# breadcrumb = parent_item.category.capitalize() +# else: +# if 'similar' in parent_item.list_type: +# if parent_item.contentTitle != '': +# breadcrumb = config.get_localized_string(70693) + parent_item.contentTitle +# else: +# breadcrumb = config.get_localized_string(70693) + parent_item.contentSerieName +# else: +# breadcrumb = config.get_localized_string(70693) - xbmcplugin.setPluginCategory(handle=int(sys.argv[1]), category=breadcrumb) +# xbmcplugin.setPluginCategory(handle=int(sys.argv[1]), category=breadcrumb) - # No ordenar items - xbmcplugin.addSortMethod(handle=int(sys.argv[1]), sortMethod=xbmcplugin.SORT_METHOD_NONE) +# # Do not sort items +# xbmcplugin.addSortMethod(handle=int(sys.argv[1]), sortMethod=xbmcplugin.SORT_METHOD_NONE) - # Cerramos el directorio - xbmcplugin.endOfDirectory(handle=int(sys.argv[1]), succeeded=True) +# # We close the directory +# xbmcplugin.endOfDirectory(handle=int(sys.argv[1]), succeeded=True) - # Fijar la vista - # if config.get_setting("forceview"): - # viewmode_id = get_viewmode_id(parent_item) - # xbmc.executebuiltin("Container.SetViewMode(%s)" % viewmode_id) - # if parent_item.mode in ['silent', 'get_cached', 'set_cache', 'finish']: - # xbmc.executebuiltin("Container.SetViewMode(500)") +# # Fix the view +# # if config.get_setting("forceview"): +# # viewmode_id = get_viewmode_id(parent_item) +# # xbmc.executebuiltin("Container.SetViewMode(%s)" % viewmode_id) +# # if parent_item.mode in ['silent', 'get_cached', 'set_cache', 'finish']: +# # xbmc.executebuiltin("Container.SetViewMode(500)") - logger.info('END render_items') +# logger.info('END render_items') -def get_viewmode_id(parent_item): - # viewmode_json habria q guardarlo en un archivo y crear un metodo para q el user fije sus preferencias en: - # user_files, user_movies, user_tvshows, user_season y user_episodes. - viewmode_json = {'skin.confluence': {'default_files': 50, - 'default_movies': 515, - 'default_tvshows': 508, - 'default_seasons': 503, - 'default_episodes': 504, - 'view_list': 50, - 'view_thumbnails': 500, - 'view_movie_with_plot': 503}, - 'skin.estuary': {'default_files': 50, - 'default_movies': 54, - 'default_tvshows': 502, - 'default_seasons': 500, - 'default_episodes': 53, - 'view_list': 50, - 'view_thumbnails': 500, - 'view_movie_with_plot': 54}} +# def get_viewmode_id(parent_item): +# # viewmode_json would have to save it in a file and create a method for the user to set their preferences in: +# # user_files, user_movies, user_tvshows, user_season and user_episodes. +# viewmode_json = {'skin.confluence': {'default_files': 50, +# 'default_movies': 515, +# 'default_tvshows': 508, +# 'default_seasons': 503, +# 'default_episodes': 504, +# 'view_list': 50, +# 'view_thumbnails': 500, +# 'view_movie_with_plot': 503}, +# 'skin.estuary': {'default_files': 50, +# 'default_movies': 54, +# 'default_tvshows': 502, +# 'default_seasons': 500, +# 'default_episodes': 53, +# 'view_list': 50, +# 'view_thumbnails': 500, +# 'view_movie_with_plot': 54}} - # Si el parent_item tenia fijado un viewmode usamos esa vista... - if parent_item.viewmode == 'movie': - # Remplazamos el antiguo viewmode 'movie' por 'thumbnails' - parent_item.viewmode = 'thumbnails' +# # If the parent_item had a viewmode set we use that view ... +# if parent_item.viewmode == 'movie': +# # We replace the old viewmode 'movie' with 'thumbnails' +# parent_item.viewmode = 'thumbnails' - if parent_item.viewmode in ["list", "movie_with_plot", "thumbnails"]: - view_name = "view_" + parent_item.viewmode +# if parent_item.viewmode in ["list", "movie_with_plot", "thumbnails"]: +# view_name = "view_" + parent_item.viewmode - '''elif isinstance(parent_item.viewmode, int): - # only for debug - viewName = parent_item.viewmode''' +# '''elif isinstance(parent_item.viewmode, int): +# # only for debug +# viewName = parent_item.viewmode''' - # ...sino ponemos la vista por defecto en funcion del viewcontent - else: - view_name = "default_" + parent_item.viewcontent +# # ...otherwise we put the default view according to the viewcontent +# else: +# view_name = "default_" + parent_item.viewcontent - skin_name = xbmc.getSkinDir() - if skin_name not in viewmode_json: - skin_name = 'skin.confluence' - view_skin = viewmode_json[skin_name] - return view_skin.get(view_name, 50) +# skin_name = xbmc.getSkinDir() +# if skin_name not in viewmode_json: +# skin_name = 'skin.confluence' +# view_skin = viewmode_json[skin_name] +# return view_skin.get(view_name, 50) def set_infolabels(listitem, item, player=False): """ - Metodo para pasar la informacion al listitem (ver tmdb.set_InfoLabels() ) - item.infoLabels es un dicionario con los pares de clave/valor descritos en: - http://mirrors.xbmc.org/docs/python-docs/14.x-helix/xbmcgui.html#ListItem-setInfo - https://kodi.wiki/view/InfoLabels - @param listitem: objeto xbmcgui.ListItem - @type listitem: xbmcgui.ListItem - @param item: objeto Item que representa a una pelicula, serie o capitulo - @type item: item + Method to pass the information to the listitem (see tmdb.set_InfoLabels()) +    item.infoLabels is a dictionary with the key / value pairs described in: +    http://mirrors.xbmc.org/docs/python-docs/14.x-helix/xbmcgui.html#ListItem-setInfo +    https://kodi.wiki/view/InfoLabels +    @param listitem: xbmcgui.ListItem object +    @type listitem: xbmcgui.ListItem +    @param item: Item object that represents a movie, series or chapter +    @type item: item """ infoLabels_dict = {'aired': 'aired', 'album': 'album', 'artist': 'artist', 'cast': 'cast', @@ -602,38 +612,37 @@ def set_infolabels(listitem, item, player=False): def set_context_commands(item, item_url, parent_item, **kwargs): """ - Función para generar los menus contextuales. - 1. Partiendo de los datos de item.context - a. Metodo antiguo item.context tipo str separando las opciones por "|" (ejemplo: item.context = "1|2|3") - (solo predefinidos) - b. Metodo list: item.context es un list con las diferentes opciones del menu: - - Predefinidos: Se cargara una opcion predefinida con un nombre. - item.context = ["1","2","3"] + Function to generate context menus. +        1. Based on the data in item.context +            a. Old method item.context type str separating options by "|" (example: item.context = "1 | 2 | 3") +                (only predefined) +            b. List method: item.context is a list with the different menu options: +                - Predefined: A predefined option will be loaded with a name. +                    item.context = ["1", "2", "3"] - - dict(): Se cargara el item actual modificando los campos que se incluyan en el dict() en caso de - modificar los campos channel y action estos serán guardados en from_channel y from_action. - item.context = [{"title":"Nombre del menu", "action": "action del menu", - "channel":"channel del menu"}, {...}] +                - dict (): The current item will be loaded modifying the fields included in the dict () in case of +                    modify the channel and action fields these will be saved in from_channel and from_action. +                    item.context = [{"title": "Name of the menu", "action": "action of the menu", "channel": "menu channel"}, {...}] - 2. Añadiendo opciones segun criterios - Se pueden añadir opciones al menu contextual a items que cumplan ciertas condiciones. +        2. Adding options according to criteria +            Options can be added to the context menu to items that meet certain conditions. - 3. Añadiendo opciones a todos los items - Se pueden añadir opciones al menu contextual para todos los items +        3. Adding options to all items +            Options can be added to the context menu for all items - 4. Se pueden deshabilitar las opciones del menu contextual añadiendo un comando 'no_context' al item.context. - Las opciones que Kodi, el skin u otro añadido añada al menu contextual no se pueden deshabilitar. +        4. You can disable the context menu options by adding a command 'no_context' to the item.context. +            The options that Kodi, the skin or another added add to the contextual menu cannot be disabled. - @param item: elemento que contiene los menu contextuales - @type item: item - @param parent_item: - @type parent_item: item +    @param item: element that contains the contextual menus +    @type item: item +    @param parent_item: +    @type parent_item: item """ context_commands = [] # num_version_xbmc = config.get_platform(True)['num_version'] - # Creamos un list con las diferentes opciones incluidas en item.context + # Create a list with the different options included in item.context if isinstance(item.context, str): context = item.context.split("|") elif isinstance(item.context, list): @@ -641,43 +650,41 @@ def set_context_commands(item, item_url, parent_item, **kwargs): else: context = [] - # Opciones segun item.context + # Options according to item.context for command in context: - # Predefinidos + # Predefined if isinstance(command, str): if command == "no_context": return [] - # Formato dict + # Dict format if isinstance(command, dict): - # Los parametros del dict, se sobreescriben al nuevo context_item en caso de sobreescribir "action" y - # "channel", los datos originales se guardan en "from_action" y "from_channel" + # The dict parameters are overwritten to the new context_item in case of overwriting "action" and + # "channel", the original data is saved in "from_action" and "from_channel" if "action" in command: command["from_action"] = item.action if "channel" in command: command["from_channel"] = item.channel - # Si no se está dentro de Alfavoritos y hay los contextos de alfavoritos, descartarlos. - # (pasa al ir a un enlace de alfavoritos, si este se clona en el canal) + # If you are not inside Alphavorites and there are the contexts for Alphavorites, discard them. + # (it happens when going to a link of alfavoritos, if this is cloned in the channel) if parent_item.channel != 'kodfavorites' and 'i_perfil' in command and 'i_enlace' in command: continue if "goto" in command: - context_commands.append((command["title"], "XBMC.Container.Refresh (%s?%s)" % - (sys.argv[0], item.clone(**command).tourl()))) + context_commands.append((command["title"], "XBMC.Container.Refresh (%s?%s)" % (sys.argv[0], item.clone(**command).tourl()))) else: - context_commands.append( - (command["title"], "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(**command).tourl()))) - # No añadir más opciones predefinidas si se está dentro de Alfavoritos + context_commands.append((command["title"], "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(**command).tourl()))) + # Do not add more predefined options if you are inside kodfavoritos if parent_item.channel == 'kodfavorites': return context_commands - # Opciones segun criterios, solo si el item no es un tag (etiqueta), ni es "Añadir a la videoteca", etc... + # Options according to criteria, only if the item is not a tag, nor is it "Add to the video library", etc... if item.action and item.action not in ["add_pelicula_to_library", "add_serie_to_library", "buscartrailer", "actualizar_titulos"]: - # Mostrar informacion: si el item tiene plot suponemos q es una serie, temporada, capitulo o pelicula + # Show information: if the item has a plot, we assume that it is a series, season, chapter or movie # if item.infoLabels['plot'] and (num_version_xbmc < 17.0 or item.contentType == 'season'): # context_commands.append((config.get_localized_string(60348), "XBMC.Action(Info)")) - # ExtendedInfo: Si está instalado el addon y se cumplen una serie de condiciones + # ExtendedInfo: If the addon is installed and a series of conditions are met if kwargs.get('has_extendedinfo') \ and config.get_setting("extended_info") == True: if item.contentType == "episode" and item.contentEpisodeNumber and item.contentSeason \ @@ -685,31 +692,22 @@ def set_context_commands(item, item_url, parent_item, **kwargs): param = "tvshow_id =%s, tvshow=%s, season=%s, episode=%s" \ % (item.infoLabels['tmdb_id'], item.contentSerieName, item.contentSeason, item.contentEpisodeNumber) - context_commands.append(("ExtendedInfo", - "XBMC.RunScript(script.extendedinfo,info=extendedepisodeinfo,%s)" % param)) + context_commands.append(("ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=extendedepisodeinfo,%s)" % param)) elif item.contentType == "season" and item.contentSeason \ and (item.infoLabels['tmdb_id'] or item.contentSerieName): param = "tvshow_id =%s,tvshow=%s, season=%s" \ % (item.infoLabels['tmdb_id'], item.contentSerieName, item.contentSeason) - context_commands.append(("ExtendedInfo", - "XBMC.RunScript(script.extendedinfo,info=seasoninfo,%s)" % param)) + context_commands.append(("ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=seasoninfo,%s)" % param)) - elif item.contentType == "tvshow" and (item.infoLabels['tmdb_id'] or item.infoLabels['tvdb_id'] or - item.infoLabels['imdb_id'] or item.contentSerieName): - param = "id =%s,tvdb_id=%s,imdb_id=%s,name=%s" \ - % (item.infoLabels['tmdb_id'], item.infoLabels['tvdb_id'], item.infoLabels['imdb_id'], - item.contentSerieName) - context_commands.append(("ExtendedInfo", - "XBMC.RunScript(script.extendedinfo,info=extendedtvinfo,%s)" % param)) + elif item.contentType == "tvshow" and (item.infoLabels['tmdb_id'] or item.infoLabels['tvdb_id'] or item.infoLabels['imdb_id'] or item.contentSerieName): + param = "id =%s,tvdb_id=%s,imdb_id=%s,name=%s" % (item.infoLabels['tmdb_id'], item.infoLabels['tvdb_id'], item.infoLabels['imdb_id'], item.contentSerieName) + context_commands.append(("ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=extendedtvinfo,%s)" % param)) - elif item.contentType == "movie" and (item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or - item.contentTitle): - param = "id =%s,imdb_id=%s,name=%s" \ - % (item.infoLabels['tmdb_id'], item.infoLabels['imdb_id'], item.contentTitle) + elif item.contentType == "movie" and (item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or item.contentTitle): + param = "id =%s,imdb_id=%s,name=%s" % (item.infoLabels['tmdb_id'], item.infoLabels['imdb_id'], item.contentTitle) - context_commands.append(("ExtendedInfo", - "XBMC.RunScript(script.extendedinfo,info=extendedinfo,%s)" % param)) + context_commands.append(("ExtendedInfo", "XBMC.RunScript(script.extendedinfo,info=extendedinfo,%s)" % param)) # InfoPlus if config.get_setting("infoplus"): #if item.infoLabels['tmdb_id'] or item.infoLabels['imdb_id'] or item.infoLabels['tvdb_id'] or \ @@ -718,33 +716,25 @@ def set_context_commands(item, item_url, parent_item, **kwargs): context_commands.append(("InfoPlus", "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=infoplus&action=start&from_channel=' + item.channel))) - # Ir al Menu Principal (channel.mainlist) - if parent_item.channel not in ["news", "channelselector", "downloads"] and item.action != "mainlist" \ - and parent_item.action != "mainlist": - context_commands.insert(0, (config.get_localized_string(60349), "XBMC.Container.Refresh (%s?%s)" % - (sys.argv[0], Item(channel=item.channel, action="mainlist").tourl()))) - context_commands.insert(1, (config.get_localized_string(70739), - "XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(action="open_browser", - url=item.url).tourl()))) + # Go to the Main Menu (channel.mainlist) + if parent_item.channel not in ["news", "channelselector", "downloads"] and item.action != "mainlist" and parent_item.action != "mainlist": + context_commands.insert(0, (config.get_localized_string(60349), "XBMC.Container.Refresh (%s?%s)" % (sys.argv[0], Item(channel=item.channel, action="mainlist").tourl()))) + context_commands.insert(1, (config.get_localized_string(70739), "XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(action="open_browser", url=item.url).tourl()))) - # Añadir a Favoritos + # Add to Favorites # if num_version_xbmc < 17.0 and \ # ((item.channel not in ["favorites", "videolibrary", "help", ""] # or item.action in ["update_videolibrary"]) and parent_item.channel != "favorites"): # context_commands.append((config.get_localized_string(30155), "XBMC.RunPlugin(%s?%s&%s)" % # (sys.argv[0], item_url, 'channel=favorites&action=addFavourite&from_channel=' + item.channel + '&from_action=' + item.action))) - # Añadir a Alfavoritos (Mis enlaces) + # Add to kodfavoritos (My links) if item.channel not in ["favorites", "videolibrary", "help", ""] and parent_item.channel != "favorites": - context_commands.append( - (config.get_localized_string(70557), "XBMC.RunPlugin(%s?%s&%s)" % - (sys.argv[0], item_url, urllib.urlencode({'channel': "kodfavourites", 'action': "addFavourite", - 'from_channel': item.channel, - 'from_action': item.action})))) - # Buscar en otros canales + context_commands.append( (config.get_localized_string(70557), "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, urllib.urlencode({'channel': "kodfavorites", 'action': "addFavourite", 'from_channel': item.channel, 'from_action': item.action})))) + # Search in other channels if item.contentType in ['movie', 'tvshow'] and item.channel != 'search' and item.action not in ['play'] and parent_item.action != 'mainlist': - # Buscar en otros canales + # Search in other channels if item.contentSerieName != '': item.wanted = item.contentSerieName else: @@ -755,88 +745,63 @@ def set_context_commands(item, item_url, parent_item, **kwargs): else: mediatype = item.contentType - context_commands.append((config.get_localized_string(60350), - "XBMC.Container.Update (%s?%s&%s)" % (sys.argv[0], - item_url, urllib.urlencode({'channel': 'search', - 'action': "from_context", - 'from_channel': item.channel, - 'contextual': True, - 'text': item.wanted})))) + context_commands.append((config.get_localized_string(60350), "XBMC.Container.Update (%s?%s&%s)" % (sys.argv[0], item_url, urllib.urlencode({'channel': 'search', 'action': "from_context", 'from_channel': item.channel, 'contextual': True, 'text': item.wanted})))) - context_commands.append( - (config.get_localized_string(70561), "XBMC.Container.Update (%s?%s&%s)" % ( - sys.argv[0], item_url, 'channel=search&action=from_context&search_type=list&page=1&list_type=%s/%s/similar' % (mediatype, item.infoLabels['tmdb_id'])))) - # Definir como Pagina de inicio + context_commands.append( (config.get_localized_string(70561), "XBMC.Container.Update (%s?%s&%s)" % (sys.argv[0], item_url, 'channel=search&action=from_context&search_type=list&page=1&list_type=%s/%s/similar' % (mediatype, item.infoLabels['tmdb_id'])))) + # Set as Home Page if config.get_setting('start_page'): if item.action not in ['episodios', 'seasons', 'findvideos', 'play']: - context_commands.insert(0, (config.get_localized_string(60351), - "XBMC.RunPlugin(%s?%s)" % ( - sys.argv[0], Item(channel='side_menu', - action="set_custom_start", - parent=item.tourl()).tourl()))) + context_commands.insert(0, (config.get_localized_string(60351), "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], Item(channel='side_menu', action="set_custom_start", parent=item.tourl()).tourl()))) if item.channel != "videolibrary": - # Añadir Serie a la videoteca + # Add Series to the video library if item.action in ["episodios", "get_episodios", "get_seasons"] and item.contentSerieName: - context_commands.append((config.get_localized_string(60352), "XBMC.RunPlugin(%s?%s&%s)" % - (sys.argv[0], item_url, 'action=add_serie_to_library&from_action=' + item.action))) - # Añadir Pelicula a videoteca + context_commands.append((config.get_localized_string(60352), "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'action=add_serie_to_library&from_action=' + item.action))) + # Add Movie to Video Library elif item.action in ["detail", "findvideos"] and item.contentType == 'movie' and item.contentTitle: - context_commands.append((config.get_localized_string(60353), "XBMC.RunPlugin(%s?%s&%s)" % - (sys.argv[0], item_url, 'action=add_pelicula_to_library&from_action=' + item.action))) + context_commands.append((config.get_localized_string(60353), "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'action=add_pelicula_to_library&from_action=' + item.action))) - if not item.local and item.channel not in ["downloads"] and item.server != 'torrent' and parent_item.action != 'mainlist' and config.get_setting('downloadenabled'): - # Descargar pelicula + if not item.local and item.channel not in ["downloads", "filmontv"] and item.server != 'torrent' and parent_item.action != 'mainlist' and config.get_setting('downloadenabled'): + # Download movie if item.contentType == "movie": - context_commands.append((config.get_localized_string(60354), "XBMC.RunPlugin(%s?%s&%s)" % - (sys.argv[0], item_url, 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action))) + context_commands.append((config.get_localized_string(60354), "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action))) elif item.contentSerieName: - # Descargar serie - if item.contentType == "tvshow": + # Descargar series + if item.contentType == "tvshow" and item.action not in ['findvideos']: if item.channel == 'videolibrary': - context_commands.append((config.get_localized_string(60003), "XBMC.RunPlugin(%s?%s&%s)" % - (sys.argv[0], item_url, - 'channel=downloads&action=save_download&unseen=true&from_channel=' + item.channel + '&from_action=' + item.action))) - context_commands.append((config.get_localized_string(60355), "XBMC.RunPlugin(%s?%s&%s)" % - (sys.argv[0], item_url, 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action))) - context_commands.append((config.get_localized_string(60357), "XBMC.RunPlugin(%s?%s&%s)" % - (sys.argv[0], item_url, 'channel=downloads&action=save_download&download=season&from_channel=' + item.channel + '&from_action=' + item.action))) - # Descargar episodio - elif item.contentType == "episode": - context_commands.append((config.get_localized_string(60356), "XBMC.RunPlugin(%s?%s&%s)" % - (sys.argv[0], item_url, 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action))) - # Descargar temporada + context_commands.append((config.get_localized_string(60003), "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&unseen=true&from_channel=' + item.channel + '&from_action=' + item.action))) + context_commands.append((config.get_localized_string(60355), "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action))) + context_commands.append((config.get_localized_string(60357), "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&download=season&from_channel=' + item.channel + '&from_action=' + item.action))) + # Download episode + elif item.contentType == "episode" or item.action in ['findvideos']: + context_commands.append((config.get_localized_string(60356), "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action))) + # Download season elif item.contentType == "season": - context_commands.append((config.get_localized_string(60357), "XBMC.RunPlugin(%s?%s&%s)" % - (sys.argv[0], item_url, 'channel=downloads&action=save_download&download=season&from_channel=' + item.channel + '&from_action=' + item.action))) + context_commands.append((config.get_localized_string(60357), "XBMC.RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&download=season&from_channel=' + item.channel + '&from_action=' + item.action))) - # # Abrir configuración + # # Open settings # if parent_item.channel not in ["setting", "news", "search"] and item.action == "play": # context_commands.append((config.get_localized_string(60358), "XBMC.Container.Update(%s?%s)" % # (sys.argv[0], Item(channel="setting", action="mainlist").tourl()))) - # Buscar Trailer - if item.action in ["findvideos", 'episodios', 'check'] or "buscar_trailer" in context: - context_commands.append( - (config.get_localized_string(60359), "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], urllib.urlencode({ - 'channel': "trailertools", 'action': "buscartrailer", 'search_title': item.fulltitle if item.fulltitle else item.contentTitle, 'contextual': True})))) + # Open settings... + if item.action in ["findvideos", 'episodios', 'check', 'new_search'] or "buscar_trailer" in context: + context_commands.append((config.get_localized_string(60359), "XBMC.RunPlugin(%s?%s)" % (sys.argv[0], urllib.urlencode({ 'channel': "trailertools", 'action': "buscartrailer", 'search_title': item.contentTitle if item.contentTitle else item.fulltitle, 'contextual': True})))) if kwargs.get('superfavourites'): - context_commands.append((config.get_localized_string(60361), - "XBMC.RunScript(special://home/addons/plugin.program.super.favourites/LaunchSFMenu.py)")) + context_commands.append((config.get_localized_string(60361), "XBMC.RunScript(special://home/addons/plugin.program.super.favourites/LaunchSFMenu.py)")) # context_commands = sorted(context_commands, key=lambda comand: comand[0]) - # Menu Rapido + # Quick Menu # context_commands.insert(0, (config.get_localized_string(60360), # "XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(channel='side_menu', # action="open_menu", # parent=parent_item.tourl()).tourl( # )))) if config.dev_mode(): - context_commands.insert(0, ("item info", - "XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(action="itemInfo", parent=item.tojson()).tourl()))) + context_commands.insert(0, ("item info", "XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(action="itemInfo", parent=item.tojson()).tourl()))) return context_commands @@ -865,32 +830,32 @@ def play_video(item, strm=False, force_direct=False, autoplay=False): default_action = config.get_setting("default_action") logger.info("default_action=%s" % default_action) - # Abre el diálogo de selección para ver las opciones disponibles + # Open the selection dialog to see the available options opciones, video_urls, seleccion, salir = get_dialogo_opciones(item, default_action, strm, autoplay) if salir: return - # se obtienen la opción predeterminada de la configuración del addon + # get default option of addon configuration seleccion = get_seleccion(default_action, opciones, seleccion, video_urls) - if seleccion < 0: # Cuadro cancelado + if seleccion < 0: # Canceled box return - logger.info("seleccion=%d" % seleccion) - logger.info("seleccion=%s" % opciones[seleccion]) + logger.info("selection=%d" % seleccion) + logger.info("selection=%s" % opciones[seleccion]) - # se ejecuta la opcion disponible, jdwonloader, descarga, favoritos, añadir a la videoteca... SI NO ES PLAY + # run the available option, jdwonloader, download, favorites, add to the video library ... IF IT IS NOT PLAY salir = set_opcion(item, seleccion, opciones, video_urls) if salir: return - # obtenemos el video seleccionado + # we get the selected video mediaurl, view, mpd = get_video_seleccionado(item, seleccion, video_urls) if mediaurl == "": return # # no certificate verification # mediaurl = mediaurl.replace('https://', 'http://') - # se obtiene la información del video. + # video information is obtained. if not item.contentThumbnail: thumb = item.thumbnail else: @@ -904,15 +869,15 @@ def play_video(item, strm=False, force_direct=False, autoplay=False): set_infolabels(xlistitem, item, True) - # si se trata de un vídeo en formato mpd, se configura el listitem para reproducirlo - # con el addon inpustreamaddon implementado en Kodi 17 + # if it is a video in mpd format, the listitem is configured to play it + # with the inpustreamaddon addon implemented in Kodi 17 if mpd: xlistitem.setProperty('inputstreamaddon', 'inputstream.adaptive') xlistitem.setProperty('inputstream.adaptive.manifest_type', 'mpd') - # se lanza el reproductor - if force_direct: # cuando viene de una ventana y no directamente de la base del addon - # Añadimos el listitem a una lista de reproducción (playlist) + # player launches + if force_direct: # when it comes from a window and not directly from the addon base + # We add the listitem to a playlist playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() playlist.add(mediaurl, xlistitem) @@ -929,18 +894,18 @@ def stop_video(): def get_seleccion(default_action, opciones, seleccion, video_urls): fixpri = False - # para conocer en que prioridad se trabaja + # to know what priority you work on priority = int(config.get_setting("resolve_priority")) - # se usara para comprobar si hay links premium o de debriders + # will be used to check for premium or debrider links check = [] - # Comprueba si resolve stop esta desactivado + # Check if resolve stop is disabled if config.get_setting("resolve_stop") == False: fixpri = True - # preguntar + # ask if default_action == 0: - # "Elige una opción" + # "Choose an option" seleccion = dialog_select(config.get_localized_string(30163), opciones) - # Ver en calidad baja + # View in low quality elif default_action == 1: resolutions = [] for url in video_urls: @@ -958,7 +923,7 @@ def get_seleccion(default_action, opciones, seleccion, video_urls): seleccion = resolutions.index(min(resolutions)) else: seleccion = 0 - # Ver en alta calidad + # See in high quality elif default_action == 2: resolutions = [] for url in video_urls: @@ -1009,11 +974,10 @@ def calcResolution(option): def show_channel_settings(**kwargs): """ - Muestra un cuadro de configuracion personalizado para cada canal y guarda los datos al cerrarlo. + It shows a customized configuration box for each channel and saves the data when closing it. + The parameters passed to it can be seen in the method that is called - Los parámetros que se le pasan se puede ver en la el método al que se llama - - @return: devuelve la ventana con los elementos + @return: returns the window with the elements @rtype: SettingsWindow """ from platformcode.xbmc_config_menu import SettingsWindow @@ -1022,11 +986,10 @@ def show_channel_settings(**kwargs): def show_video_info(*args, **kwargs): """ - Muestra una ventana con la info del vídeo. + It shows a window with the info of the video. +    The parameters passed to it can be seen in the method that is called - Los parámetros que se le pasan se puede ver en la el método al que se llama - - @return: devuelve la ventana con los elementos +    @return: returns the window with the elements @rtype: InfoWindow """ @@ -1040,13 +1003,12 @@ def show_recaptcha(key, referer): def alert_no_disponible_server(server): - # 'El vídeo ya no está en %s' , 'Prueba en otro servidor o en otro canal' - dialog_ok(config.get_localized_string(30055), (config.get_localized_string(30057) % server), - config.get_localized_string(30058)) + # 'The video is no longer in %s', 'Try another server or another channel' + dialog_ok(config.get_localized_string(30055), (config.get_localized_string(30057) % server), config.get_localized_string(30058)) def alert_unsopported_server(): - # 'Servidor no soportado o desconocido' , 'Prueba en otro servidor o en otro canal' + # 'Unsupported or unknown server ',' Test on another server or on another channel' dialog_ok(config.get_localized_string(30065), config.get_localized_string(30058)) @@ -1070,10 +1032,10 @@ def handle_wait(time_to_wait, title, text): break if cancelled: - logger.info('Espera cancelada') + logger.info('Wait canceled') return False else: - logger.info('Espera finalizada') + logger.info('Wait finished') return True @@ -1093,11 +1055,11 @@ def get_dialogo_opciones(item, default_action, strm, autoplay): if item.server == "": item.server = "directo" - # Si no es el modo normal, no muestra el diálogo porque cuelga XBMC + # If it is not the normal mode, it does not show the dialog because XBMC hangs muestra_dialogo = (config.get_setting("player_mode") == 0 and not strm) - # Extrae las URL de los vídeos, y si no puedes verlo te dice el motivo - # Permitir varias calidades para server "directo" + # Extract the URLs of the videos, and if you can't see it, it tells you the reason + # Allow multiple qualities for "direct" server if item.video_urls: video_urls, puedes, motivo = item.video_urls, True, "" @@ -1106,7 +1068,7 @@ def get_dialogo_opciones(item, default_action, strm, autoplay): item.server, item.url, item.password, muestra_dialogo) seleccion = 0 - # Si puedes ver el vídeo, presenta las opciones + # If you can see the video, present the options if puedes: for video_url in video_urls: opciones.append(config.get_localized_string(60221) + " " + video_url[0]) @@ -1114,48 +1076,45 @@ def get_dialogo_opciones(item, default_action, strm, autoplay): if item.server == "local": opciones.append(config.get_localized_string(30164)) else: - # "Descargar" + # "Download" downloadenabled = config.get_setting('downloadenabled') if downloadenabled != False and item.channel != 'videolibrary': opcion = config.get_localized_string(30153) opciones.append(opcion) if item.isFavourite: - # "Quitar de favoritos" + # "Remove from favorites" opciones.append(config.get_localized_string(30154)) else: - # "Añadir a favoritos" + # "Add to Favorites" opciones.append(config.get_localized_string(30155)) - if not strm and item.contentType == 'movie': - # "Añadir a videoteca" + if not strm and item.contentType == 'movie' and item.channel != 'videolibrary': + # "Add to video library" opciones.append(config.get_localized_string(30161)) if default_action == 3: seleccion = len(opciones) - 1 - # Busqueda de trailers en youtube + # Search for trailers on youtube if item.channel not in ["Trailer", "ecarteleratrailers"]: - # "Buscar Trailer" + # "Search Trailer" opciones.append(config.get_localized_string(30162)) - # Si no puedes ver el vídeo te informa + # If you can't see the video it informs you else: if not autoplay: if item.server != "": if "<br/>" in motivo: - ret = dialog_yesno(config.get_localized_string(60362), motivo.split("<br/>")[0], motivo.split("<br/>")[1], - item.url, nolabel='ok', yeslabel=config.get_localized_string(70739)) + ret = dialog_yesno(config.get_localized_string(60362), motivo.split("<br/>")[0], motivo.split("<br/>")[1], item.url, nolabel='ok', yeslabel=config.get_localized_string(70739)) else: ret = dialog_yesno(config.get_localized_string(60362), motivo, item.url, nolabel='ok', yeslabel=config.get_localized_string(70739)) else: - ret = dialog_yesno(config.get_localized_string(60362), config.get_localized_string(60363), - config.get_localized_string(60364), item.url, nolabel='ok', yeslabel=config.get_localized_string(70739)) + ret = dialog_yesno(config.get_localized_string(60362), config.get_localized_string(60363), config.get_localized_string(60364), item.url, nolabel='ok', yeslabel=config.get_localized_string(70739)) if ret: - xbmc.executebuiltin("XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(action="open_browser", - url=item.url).tourl())) + xbmc.executebuiltin("XBMC.Container.Update (%s?%s)" % (sys.argv[0], Item(action="open_browser", url=item.url).tourl())) if item.channel == "favorites": - # "Quitar de favoritos" + # "Remove from favorites" opciones.append(config.get_localized_string(30154)) if len(opciones) == 0: @@ -1168,10 +1127,10 @@ def set_opcion(item, seleccion, opciones, video_urls): logger.info() # logger.debug(item.tostring('\n')) salir = False - # No ha elegido nada, lo más probable porque haya dado al ESC + # You have not chosen anything, most likely because you have given the ESC if seleccion == -1: - # Para evitar el error "Uno o más elementos fallaron" al cancelar la selección desde fichero strm + # To avoid the error "One or more elements failed" when deselecting from strm file listitem = xbmcgui.ListItem(item.title) if config.get_platform(True)['num_version'] >= 16.0: @@ -1182,7 +1141,7 @@ def set_opcion(item, seleccion, opciones, video_urls): xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, listitem) - # "Descargar" + # "Download" elif opciones[seleccion] == config.get_localized_string(30153): from specials import downloads @@ -1192,25 +1151,23 @@ def set_opcion(item, seleccion, opciones, video_urls): downloads.save_download(item) salir = True - # "Quitar de favoritos" + # "Remove from favorites" elif opciones[seleccion] == config.get_localized_string(30154): from specials import favorites favorites.delFavourite(item) salir = True - # "Añadir a favoritos": + # "Add to Favorites": elif opciones[seleccion] == config.get_localized_string(30155): from specials import favorites item.from_channel = "favorites" favorites.addFavourite(item) salir = True - # "Buscar Trailer": + # "Search Trailer": elif opciones[seleccion] == config.get_localized_string(30162): config.set_setting("subtitulo", False) - xbmc.executebuiltin("XBMC.RunPlugin(%s?%s)" % - (sys.argv[0], item.clone(channel="trailertools", action="buscartrailer", - contextual=True).tourl())) + xbmc.executebuiltin("XBMC.RunPlugin(%s?%s)" % (sys.argv[0], item.clone(channel="trailertools", action="buscartrailer", contextual=True).tourl())) salir = True return salir @@ -1223,7 +1180,7 @@ def get_video_seleccionado(item, seleccion, video_urls): wait_time = 0 mpd = False - # Ha elegido uno de los vídeos + # You have chosen one of the videos if seleccion < len(video_urls): mediaurl = video_urls[seleccion][1] if len(video_urls[seleccion]) > 4: @@ -1239,7 +1196,7 @@ def get_video_seleccionado(item, seleccion, video_urls): wait_time = video_urls[seleccion][2] view = True - # Si no hay mediaurl es porque el vídeo no está :) + # If there is no mediaurl it is because the video is not there :) logger.info("mediaurl=" + mediaurl) if mediaurl == "": if item.server == "unknown": @@ -1247,7 +1204,7 @@ def get_video_seleccionado(item, seleccion, video_urls): else: alert_no_disponible_server(item.server) - # Si hay un tiempo de espera (como en megaupload), lo impone ahora + # If there is a timeout (like in megaupload), impose it now if wait_time > 0: continuar = handle_wait(wait_time, item.server, config.get_localized_string(60365)) if not continuar: @@ -1259,12 +1216,12 @@ def get_video_seleccionado(item, seleccion, video_urls): def set_player(item, xlistitem, mediaurl, view, strm): logger.info() logger.debug("item:\n" + item.tostring('\n')) - # Movido del conector "torrent" aqui + # Moved del conector "torrent" here if item.server == "torrent": play_torrent(item, xlistitem, mediaurl) return - # Si es un fichero strm no hace falta el play + # If it is a strm file, play is not necessary elif strm: xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xlistitem) if item.subtitle != "": @@ -1281,7 +1238,7 @@ def set_player(item, xlistitem, mediaurl, view, strm): elif config.get_setting("player_mode") == 0 or item.play_from == 'window' or \ (config.get_setting("player_mode") == 3 and mediaurl.startswith("rtmp")): - # Añadimos el listitem a una lista de reproducción (playlist) + # We add the listitem to a playlist playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) playlist.clear() playlist.add(mediaurl, xlistitem) @@ -1295,7 +1252,7 @@ def set_player(item, xlistitem, mediaurl, view, strm): # elif config.get_setting("player_mode") == 1 or item.isPlayable: elif config.get_setting("player_mode") == 1: logger.info("Tras setResolvedUrl") - # si es un archivo de la videoteca enviar a marcar como visto + # if it is a video library file send to mark as seen if strm or item.strm_path: from platformcode import xbmc_videolibrary @@ -1308,226 +1265,73 @@ def set_player(item, xlistitem, mediaurl, view, strm): elif config.get_setting("player_mode") == 2: xbmc.executebuiltin("PlayMedia(" + mediaurl + ")") - # TODO MIRAR DE QUITAR VIEW + # ALL LOOKING TO REMOVE VIEW if item.subtitle != "" and view: logger.info("Subtítulos externos: " + item.subtitle) xbmc.sleep(2000) xbmc_player.setSubtitles(item.subtitle) - # si es un archivo de la videoteca enviar a marcar como visto + # if it is a video library file send to mark as seen if strm or item.strm_path: from platformcode import xbmc_videolibrary xbmc_videolibrary.mark_auto_as_watched(item) def torrent_client_installed(show_tuple=False): - # Plugins externos se encuentra en servers/torrent.json nodo clients + # External plugins found in servers / torrent.json node clients from core import filetools from core import jsontools - torrent_clients = jsontools.get_node_from_file("torrent.json", "clients", filetools.join(config.get_runtime_path(),"servers")) + torrent_clients = jsontools.get_node_from_file("torrent.json", "clients", filetools.join(config.get_runtime_path(), "servers")) torrent_options = [] for client in torrent_clients: if xbmc.getCondVisibility('System.HasAddon("%s")' % client["id"]): if show_tuple: - torrent_options.append([config.get_localized_string(60366) % client["name"], client["url"]]) + torrent_options.append([client["name"], client["url"]]) else: - torrent_options.append(config.get_localized_string(60366) % client["name"]) + torrent_options.append(client["name"]) return torrent_options def play_torrent(item, xlistitem, mediaurl): logger.info() import time - import traceback - - from core import filetools - from core import httptools - from lib import generictools from servers import torrent - - # Si Libtorrent ha dado error de inicialización, no se pueden usar los clientes internos - UNRAR = config.get_setting("unrar_path", server="torrent", default="") - LIBTORRENT = config.get_setting("libtorrent_path", server="torrent", default='') - size_rar = 2 - rar_files = [] - if item.password: - size_rar = 3 - - - # Opciones disponibles para Reproducir torrents torrent_options = torrent_client_installed(show_tuple=True) - torrent_client = config.get_setting("torrent_client", server="torrent") - - # Si es Libtorrent y no está soportado, se ofrecen alternativas, si las hay... - - if len(torrent_options) > 1: + if len(torrent_options) == 0: + from specials import elementum_download + elementum_download.download() + return play_torrent(item, xlistitem, mediaurl) + elif len(torrent_options) > 1: selection = dialog_select(config.get_localized_string(70193), [opcion[0] for opcion in torrent_options]) else: selection = 0 - # Si es Torrenter o Elementum con opción de Memoria, se ofrece la posibilidad ee usar Libtorrent temporalemente - if selection >= 0 and LIBTORRENT and UNRAR and 'RAR-' in item.torrent_info and ( - "torrenter" in torrent_options[selection][0] \ - or ("elementum" in torrent_options[selection][0] and xbmcaddon.Addon(id="plugin.video.%s" % torrent_options[selection][0].replace('Plugin externo: ','')).getSetting('download_storage') == '1')): - if dialog_yesno(torrent_options[selection][0], config.get_localized_string(70777), config.get_localized_string(70778), config.get_localized_string(70779) % size_rar): - selection = 1 - else: - return - # Si es Elementum pero con opción de Memoria, se muestras los Ajustes de Elementum y se pide al usuario que cambie a "Usar Archivos" - elif selection >= 0 and not LIBTORRENT and UNRAR and 'RAR-' in item.torrent_info and "elementum" in \ - torrent_options[selection][0] \ - and xbmcaddon.Addon(id="plugin.video.%s" % torrent_options[selection][0].capitalize()) \ - .getSetting('download_storage') == '1': - if dialog_yesno(torrent_options[selection][0], config.get_localized_string(70780) % size_rar, config.get_localized_string(70781)): - __settings__ = xbmcaddon.Addon( - id="plugin.video.%s" % torrent_options[selection][0].capitalize()) - __settings__.openSettings() # Se visulizan los Ajustes de Elementum - elementum_dl = xbmcaddon.Addon( - id="plugin.video.%s" % torrent_options[selection][0].capitalize()) \ - .getSetting('download_storage') - if elementum_dl != '1': - config.set_setting("elementum_dl", "1", server="torrent") # Salvamos el cambio para restaurarlo luego - return # Se sale, porque habrá refresco y cancelaría Kodi si no - - # Descarga de torrents a local if selection >= 0: - #### Compatibilidad con Kodi 18: evita cuelgues/cancelaciones cuando el .torrent se lanza desde pantalla convencional - # if xbmc.getCondVisibility('Window.IsMedia'): - xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, xlistitem) # Preparamos el entorno para evitar error Kod1 18 - time.sleep(0.5) # Dejamos tiempo para que se ejecute - - # Nuevo método de descarga previa del .torrent. Si da error, miramos si hay alternatica local. - # Si ya es local, lo usamos - url = '' - url_stat = False - torrents_path = '' - referer = None - post = None - rar = False - size = '' - password = '' - if item.password: - password = item.password - - videolibrary_path = config.get_videolibrary_path() # Calculamos el path absoluto a partir de la Videoteca - if scrapertools.find_single_match(videolibrary_path, '(^\w+:\/\/)'): # Si es una conexión REMOTA, usamos userdata local - videolibrary_path = config.get_data_path() # Calculamos el path absoluto a partir de Userdata - if not filetools.exists(videolibrary_path): # Si no existe el path, pasamos al modo clásico - videolibrary_path = False - else: - torrents_path = filetools.join(videolibrary_path, 'temp_torrents', 'client_torrent.torrent') # path descarga temporal - if not videolibrary_path or not filetools.exists(filetools.join(videolibrary_path, 'temp_torrents')): # Si no existe la carpeta temporal, la creamos - filetools.mkdir(filetools.join(videolibrary_path, 'temp_torrents')) - - # Si hay headers, se pasar a la petición de descarga del .torrent - headers = {} - if item.headers: - headers = item.headers - - # identificamos si es una url o un path de archivo - if not item.url.startswith("\\") and not item.url.startswith("/") and not url_stat: - timeout = 10 - if item.torrent_alt: - timeout = 5 - # Si es una llamada con POST, lo preparamos - if item.referer: referer = item.referer - if item.post: post = item.post - # Descargamos el .torrent - size, url, torrent_f, rar_files = generictools.get_torrent_size(item.url, referer, post, torrents_path=torrents_path, timeout=timeout, lookup=False, headers=headers, short_pad=True) - if url: - url_stat = True - item.url = url - if "torrentin" in torrent_options[selection][0]: - item.url = 'file://' + item.url - - if not url and item.torrent_alt: # Si hay error, se busca un .torrent alternativo - if (item.torrent_alt.startswith("\\") or item.torrent_alt.startswith("/")) and videolibrary_path: - item.url = item.torrent_alt # El .torrent alternativo puede estar en una url o en local - elif not item.url.startswith("\\") and not item.url.startswith("/"): - item.url = item.torrent_alt - - # Si es un archivo .torrent local, actualizamos el path relativo a path absoluto - if (item.url.startswith("\\") or item.url.startswith("/")) and not url_stat and videolibrary_path: # .torrent alternativo local - movies = config.get_setting("folder_movies") - series = config.get_setting("folder_tvshows") - if item.contentType == 'movie': - folder = movies # películas - else: - folder = series # o series - item.url = filetools.join(config.get_videolibrary_path(), folder, item.url) # dirección del .torrent local en la Videoteca - if filetools.copy(item.url, torrents_path, silent=True): # se copia a la carpeta generíca para evitar problemas de encode - item.url = torrents_path - if "torrentin" in torrent_options[selection][0]: # Si es Torrentin, hay que añadir un prefijo - item.url = 'file://' + item.url - size, rar_files = generictools.get_torrent_size('', file_list=True, local_torr=torrents_path,short_pad=True) - - mediaurl = item.url - - if selection >= 0: + xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, xlistitem) + time.sleep(1) mediaurl = urllib.quote_plus(item.url) - # Llamada con más parámetros para completar el título - if ("quasar" in torrent_options[selection][1] or "elementum" in torrent_options[selection][1]) and item.infoLabels['tmdb_id']: - if item.contentType == 'episode' and "elementum" not in torrent_options[selection][1]: - mediaurl += "&episode=%s&library=&season=%s&show=%s&tmdb=%s&type=episode" % ( - item.infoLabels['episode'], item.infoLabels['season'], item.infoLabels['tmdb_id'], - item.infoLabels['tmdb_id']) + torr_client = torrent_options[selection][0] + + if torr_client in ['elementum'] and item.infoLabels['tmdb_id']: + if item.contentType == 'episode' and "elementum" not in torr_client: + mediaurl += "&episode=%s&library=&season=%s&show=%s&tmdb=%s&type=episode" % (item.infoLabels['episode'], item.infoLabels['season'], item.infoLabels['tmdb_id'], item.infoLabels['tmdb_id']) elif item.contentType == 'movie': mediaurl += "&library=&tmdb=%s&type=movie" % (item.infoLabels['tmdb_id']) - xbmc.executebuiltin("PlayMedia(" + torrent_options[selection][1] % mediaurl + ")") + if torr_client in ['elementum'] and item.downloadFilename: + torrent.elementum_download(item) + else: + time.sleep(3) + xbmc.executebuiltin("PlayMedia(" + torrent_options[selection][1] % mediaurl + ")") - # Si es un archivo RAR, monitorizamos el cliente Torrent hasta que haya descargado el archivo, - # y después lo extraemos, incluso con RAR's anidados y con contraseña - torr_client = torrent_options[selection][0].capitalize() - if 'RAR-' in size and torr_client in ['quasar', 'elementum'] and UNRAR: - rar_file, save_path_videos, folder_torr = torrent.wait_for_download(item, mediaurl, rar_files, torr_client) # Esperamos mientras se descarga el RAR - if rar_file and save_path_videos: # Si se ha descargado el RAR... - dp = dialog_progress_bg('KoD %s' % torr_client) - video_file, rar, video_path, erase_file_path = torrent.extract_files(rar_file, save_path_videos, password, dp, item, torr_client) # ... extraemos el vídeo del RAR - dp.close() + torrent.mark_auto_as_watched(item) - # Reproducimos el vídeo extraido, si no hay nada en reproducción - while is_playing() and rar and not xbmc.abortRequested: - time.sleep(3) # Repetimos cada intervalo - if rar and not xbmc.abortRequested: - time.sleep(1) - video_play = filetools.join(video_path, video_file) - log("##### video_play: %s" % video_play) - playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) - playlist.clear() - playlist.add(video_play, xlistitem) - xbmc_player.play(playlist) - - # selectionamos que clientes torrent soportamos para el marcado de vídeos vistos: asumimos que todos funcionan - torrent.mark_auto_as_watched(item) - - # Si se ha extraido un RAR, se pregunta para borrar los archivos después de reproducir el vídeo (plugins externos) - while is_playing() and rar and not xbmc.abortRequested: - time.sleep(3) # Repetimos cada intervalo - if rar and not xbmc.abortRequested: - if dialog_yesno('KoD %s' % torr_client, config.get_localized_string(30031)): - log("##### erase_file_path: %s" % erase_file_path) - try: - torr_data, deamon_url, index = torrent.get_tclient_data(folder_torr, torr_client) - if torr_data and deamon_url: - data = httptools.downloadpage('%sdelete/%s' % (deamon_url, index), timeout=5, alfa_s=True).data - time.sleep(1) - if filetools.isdir(erase_file_path): - filetools.rmdirtree(erase_file_path) - elif filetools.exists(erase_file_path) and filetools.isfile(erase_file_path): - filetools.remove(erase_file_path) - except: - logger.error(traceback.format_exc(1)) - elementum_dl = config.get_setting("elementum_dl", server="torrent", default='') # Si salvamos el cambio de Elementum - if elementum_dl: - config.set_setting("elementum_dl", "", server="torrent") # lo reseteamos en Alfa - xbmcaddon.Addon(id="plugin.video.%s" % torrent_options[selection][0].replace('Plugin externo: ', '')) \ - .setSetting('download_storage', elementum_dl) # y lo reseteamos en Elementum + while is_playing() and not xbmc.abortRequested: + time.sleep(3) def log(texto): - xbmc.log(texto, xbmc.LOGNOTICE) - + xbmc.log(texto, xbmc.LOGNOTICE) \ No newline at end of file diff --git a/platformcode/updater.py b/platformcode/updater.py index cf51243e..b12cad12 100644 --- a/platformcode/updater.py +++ b/platformcode/updater.py @@ -283,8 +283,8 @@ def getShaStr(str): -def updateFromZip(message='Installazione in corso...'): - dp = platformtools.dialog_progress_bg('Kodi on Demand', message) +def updateFromZip(message=config.get_localized_string(80050)): + dp = platformtools.dialog_progress_bg(config.get_localized_string(20000), message) dp.update(0) remotefilename = 'https://github.com/' + user + "/" + repo + "/archive/" + branch + ".zip" @@ -304,8 +304,7 @@ def updateFromZip(message='Installazione in corso...'): urllib.urlretrieve(remotefilename, localfilename, lambda nb, bs, fs, url=remotefilename: _pbhook(nb, bs, fs, url, dp)) except Exception as e: - platformtools.dialog_ok('Kodi on Demand', 'Non riesco a scaricare il file d\'installazione da github, questo è probabilmente dovuto ad una mancanza di connessione (o qualcosa impedisce di raggiungere github).\n' - 'Controlla bene e quando hai risolto riapri KoD.') + platformtools.dialog_ok(config.get_localized_string(20000), config.get_localized_string(80031)) logger.info('Non sono riuscito a scaricare il file zip') logger.info(e) dp.close() @@ -318,6 +317,8 @@ def updateFromZip(message='Installazione in corso...'): if os.path.isfile(localfilename): logger.info('il file esiste') + dp.update(80, config.get_localized_string(20000), config.get_localized_string(80032)) + import zipfile try: hash = fixZipGetHash(localfilename) @@ -329,7 +330,7 @@ def updateFromZip(message='Installazione in corso...'): for member in zip.infolist(): zip.extract(member, destpathname) cur_size += member.file_size - dp.update(int(80 + cur_size * 19 / size)) + dp.update(int(80 + cur_size * 15 / size)) except Exception as e: logger.info('Non sono riuscito ad estrarre il file zip') @@ -341,7 +342,7 @@ def updateFromZip(message='Installazione in corso...'): return False - dp.update(99) + dp.update(95) # puliamo tutto global addonDir @@ -356,8 +357,9 @@ def updateFromZip(message='Installazione in corso...'): remove(localfilename) dp.update(100) + xbmc.sleep(1000) dp.close() - if message != 'Installazione in corso...': + if message != config.get_localized_string(80050): xbmc.executebuiltin("UpdateLocalAddons") refreshLang() @@ -448,9 +450,9 @@ def fOpen(file, mode = 'r'): def _pbhook(numblocks, blocksize, filesize, url, dp): try: - percent = min((numblocks*blocksize*90)/filesize, 100) + percent = min((numblocks*blocksize*80)/filesize, 80) dp.update(int(percent)) except Exception as e: logger.error(e) - percent = 90 + percent = 80 dp.update(percent) diff --git a/platformcode/xbmc_config_menu.py b/platformcode/xbmc_config_menu.py index 290622c4..bfdd8ced 100644 --- a/platformcode/xbmc_config_menu.py +++ b/platformcode/xbmc_config_menu.py @@ -4,39 +4,34 @@ # ------------------------------------------------------------ from __future__ import division -#from builtins import str -import sys +import sys, os, inspect, xbmcgui, xbmc PY3 = False if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int from builtins import range from past.utils import old_div -import inspect -import os - -import xbmcgui - -from core import channeltools -from core import servertools, scrapertools -from platformcode import config, logger +from core import channeltools, servertools, scrapertools +from platformcode import config, logger, platformtools +from core.support import log, dbg, match class SettingsWindow(xbmcgui.WindowXMLDialog): - """ Clase derivada que permite utilizar cuadros de configuracion personalizados. + """ + Derived class that allows you to use custom configuration boxes. - Esta clase deriva de xbmcgui.WindowXMLDialog y permite crear un cuadro de dialogo con controles del tipo: - Radio Button (bool), Cuadro de texto (text), Lista (list) y Etiquetas informativas (label). - Tambien podemos personalizar el cuadro añadiendole un titulo (title). + This class is derived from xbmcgui.WindowXMLDialog and allows you to create a dialog box with controls of the type: + Radio Button (bool), Text Box (text), List (list) and Information Labels (label). + We can also customize the box by adding a title (title). - Metodo constructor: - SettingWindow(listado_controles, dict_values, title, callback, item) + Construction method: + SettingWindow(list_controls, dict_values, title, callback, item) Parametros: - listado_controles: (list) Lista de controles a incluir en la ventana, segun el siguiente esquema: + list_controls: (list) Lista de controles a incluir en la ventana, segun el siguiente esquema: (opcional)list_controls= [ {'id': "nameControl1", 'type': "bool", # bool, text, list, label 'label': "Control 1: tipo RadioButton", - 'color': '0xFFee66CC', # color del texto en formato ARGB hexadecimal + 'color': '0xFFee66CC', # text color in hexadecimal ARGB format 'default': True, 'enabled': True, 'visible': True @@ -46,8 +41,7 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): 'label': "Control 2: tipo Cuadro de texto", 'color': '0xFFee66CC', 'default': "Valor por defecto", - 'hidden': False, # only for type = text Indica si hay que ocultar - el texto (para passwords) + 'hidden': False, # only for type = text Indicates whether to hide the text (for passwords) 'enabled': True, 'visible': True }, @@ -55,7 +49,7 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): 'type': "list", # bool, text, list, label 'label': "Control 3: tipo Lista", 'color': '0xFFee66CC', - 'default': 0, # Indice del valor por defecto en lvalues + 'default': 0, # Default value index in lvalues 'enabled': True, 'visible': True, 'lvalues':["item1", "item2", "item3", "item4"], # only for type = list @@ -67,10 +61,9 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): 'enabled': True, 'visible': True }] - Si no se incluye el listado_controles, se intenta obtener del json del canal desde donde se hace la - llamada. + If the controls list is not included, an attempt is made to obtain the json of the channel from which the call is made. - El formato de los controles en el json es: + The format of the controls in the json is: { ... ... @@ -120,49 +113,40 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): ] } - Los campos 'label', 'default', 'enabled' y 'lvalues' pueden ser un numero precedido de '@'. En cuyo caso se - buscara el literal en el archivo string.xml del idioma seleccionado. - Los campos 'enabled' y 'visible' admiten los comparadores eq(), gt() e it() y su funcionamiento se - describe en: http://kodi.wiki/view/Add-on_settings#Different_types + The fields 'label', 'default', 'enabled' and 'lvalues' can be a number preceded by '@'. In which case + it will look for the literal in the string.xml file of the selected language. + The 'enabled' and 'visible' fields support the comparators eq (), gt () and it () and their operation is + described at: http://kodi.wiki/view/Add-on_settings#Different_types - (opcional)dict_values: (dict) Diccionario que representa el par (id: valor) de los controles de la - lista. - Si algun control de la lista no esta incluido en este diccionario se le asignara el valor por - defecto. + (opcional) dict_values: (dict) Dictionary representing the pair (id: value) of the controls in the list. + If any control in the list is not included in this dictionary, it will be assigned the default value. dict_values={"nameControl1": False, "nameControl2": "Esto es un ejemplo"} - (opcional) caption: (str) Titulo de la ventana de configuracion. Se puede localizar mediante un numero - precedido de '@' - (opcional) callback (str) Nombre de la funcion, del canal desde el que se realiza la llamada, que sera - invocada al pulsar el boton aceptar de la ventana. A esta funcion se le pasara como parametros el - objeto 'item' y el dicionario 'dict_values'. Si este parametro no existe, se busca en el canal una - funcion llamada 'cb_validate_config' y si existe se utiliza como callback. + (opcional) caption: (str) Configuration window title. It can be located by a number preceded by '@' + (opcional) callback (str) Name of the function, of the channel from which the call is made, which will be + invoked when pressing the accept button in the window. This function will be passed as parameters the + object 'item' and the 'dict_values' dictionary. If this parameter does not exist, the channel is searched for + function called 'cb_validate_config' and if it exists it is used as a callback. - Retorno: Si se especifica 'callback' o el canal incluye 'cb_validate_config' se devolvera lo que devuelva - esa funcion. Si no devolvera None + Retorno: If 'callback' is specified or the channel includes 'cb_validate_config' what that function returns will be returned. If not return none - Ejemplos de uso: - platformtools.show_channel_settings(): Así tal cual, sin pasar ningún argumento, la ventana detecta de que canal - se ha hecho la llamada, - y lee los ajustes del json y carga los controles, cuando le das a Aceptar los vuelve a guardar. + Usage examples: + platformtools.show_channel_settings(): As such, without passing any argument, the window detects which channel the call has been made, + and read the json settings and load the controls, when you click OK, save them again. - return platformtools.show_channel_settings(list_controls=list_controls, dict_values=dict_values, callback='cb', - item=item): - Así abre la ventana con los controles pasados y los valores de dict_values, si no se pasa dict_values, carga - los valores por defecto de los controles, - cuando le das a aceptar, llama a la función 'callback' del canal desde donde se ha llamado, pasando como - parámetros, el item y el dict_values + return platformtools.show_channel_settings(list_controls=list_controls, dict_values=dict_values, callback='cb', item=item): + This opens the window with the passed controls and the dict_values values, if dict_values is not passed, it loads the default values of the controls, + when you accept, it calls the 'callback' function of the channel from where it was called, passing as parameters, item and dict_values """ - def start(self, list_controls=None, dict_values=None, caption="", callback=None, item=None, - custom_button=None, channelpath=None): - logger.info() + def start(self, list_controls=None, dict_values=None, caption="", callback=None, item=None, custom_button=None, channelpath=None): + log() - # Ruta para las imagenes de la ventana + # Media Path self.mediapath = os.path.join(config.get_runtime_path(), 'resources', 'skins', 'Default', 'media') - # Capturamos los parametros + # Params self.list_controls = list_controls self.values = dict_values self.caption = caption @@ -178,45 +162,48 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): else: self.custom_button = None - # Obtenemos el canal desde donde se ha echo la llamada y cargamos los settings disponibles para ese canal + # Load Channel Settings if not channelpath: channelpath = inspect.currentframe().f_back.f_back.f_code.co_filename self.channel = os.path.basename(channelpath).replace(".py", "") self.ch_type = os.path.basename(os.path.dirname(channelpath)) - logger.info('PATH= ' + channelpath) - # Si no tenemos list_controls, hay que sacarlos del json del canal + # If list_controls does not exist, it is removed from the channel json if not self.list_controls: - # Si la ruta del canal esta en la carpeta "channels", obtenemos los controles y valores mediante chaneltools - if os.path.join(config.get_runtime_path(), "channels") or os.path.join(config.get_runtime_path(), "specials") in channelpath: + # If the channel path is in the "channels" folder, we get the controls and values using chaneltools + if os.path.join(config.get_runtime_path(), "channels") or os.path.join(config.get_runtime_path(), "specials") in channelpath: - # La llamada se hace desde un canal + # The call is made from a channel self.list_controls, default_values = channeltools.get_channel_controls_settings(self.channel) self.kwargs = {"channel": self.channel} + self.channelName = channeltools.get_channel_json(self.channel)['name'] - # Si la ruta del canal esta en la carpeta "servers", obtenemos los controles y valores mediante servertools + # If the channel path is in the "servers" folder, we get the controls and values through servertools elif os.path.join(config.get_runtime_path(), "servers") in channelpath: - # La llamada se hace desde un canal + # The call is made from a channel self.list_controls, default_values = servertools.get_server_controls_settings(self.channel) self.kwargs = {"server": self.channel} + self.channelName = servertools.get_server_json(self.channel)['name'] - # En caso contrario salimos + # Else Exit else: return None - # Si no se pasan dict_values, creamos un dict en blanco + # If dict_values are not passed, create a blank dict if self.values is None: self.values = {} - # Ponemos el titulo + # Make title if self.caption == "": - self.caption = str(config.get_localized_string(30100)) + " -- " + self.channel.capitalize() + self.caption = str(config.get_localized_string(30100)) + ' - ' + self.channelName - elif self.caption.startswith('@') and unicode(self.caption[1:]).isnumeric(): - self.caption = config.get_localized_string(int(self.caption[1:])) + matches = match(self.caption, patron=r'@(\d+)').matches + if matches: + for m in matches: + self.caption = self.caption.replace('@' + match, config.get_localized_string(int(m))) - # Muestra la ventana + # Show Window self.return_value = None self.doModal() return self.return_value @@ -225,8 +212,6 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): def set_enabled(c, val): if c["type"] == "list": c["control"].setEnabled(val) - c["downBtn"].setEnabled(val) - c["upBtn"].setEnabled(val) c["label"].setEnabled(val) else: c["control"].setEnabled(val) @@ -235,8 +220,6 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): def set_visible(c, val): if c["type"] == "list": c["control"].setVisible(val) - c["downBtn"].setVisible(val) - c["upBtn"].setVisible(val) c["label"].setVisible(val) else: c["control"].setVisible(val) @@ -255,41 +238,37 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): ok = False - # Si la condicion es True o False, no hay mas que evaluar, ese es el valor + # If the condition is True or False, there is nothing else to evaluate, that is the value if isinstance(cond, bool): return cond - # Obtenemos las condiciones - # conditions = re.compile("(!?eq|!?gt|!?lt)?\(([^,]+),[\"|']?([^)|'|\"]*)['|\"]?\)[ ]*([+||])?").findall(cond) + # Get the conditions conditions = re.compile(r'''(!?eq|!?gt|!?lt)?\s*\(\s*([^, ]+)\s*,\s*["']?([^"'\)]+)["']?\)([+|])?''').findall(cond) - # conditions = scrapertools.find_multiple_matches(cond, r"(!?eq|!?gt|!?lt)?\(([^,]+),[\"|']?([^)|'|\"]*)['|\"]?\)[ ]*([+||])?") for operator, id, value, next in conditions: - # El id tiene que ser un numero, sino, no es valido y devuelve False + # The id must be a number, otherwise it is not valid and returns False try: id = int(id) except: return False - # El control sobre el que evaluar, tiene que estar dentro del rango, sino devuelve False + # The control to evaluate on has to be within range, otherwise it returns False if index + id < 0 or index + id >= len(self.list_controls): return False else: - # Obtenemos el valor del control sobre el que se compara + # Obtain the value of the control on which it is compared c = self.list_controls[index + id] - if c["type"] == "bool": - control_value = bool(c["control"].isSelected()) - if c["type"] == "text": - control_value = c["control"].getText() - if c["type"] == "list": - control_value = c["label"].getLabel() - if c["type"] == "label": - control_value = c["control"].getLabel() + if c["type"] == "bool": control_value = bool(c["control"].isSelected()) + if c["type"] == "text": control_value = c["control"].getText() + if c["type"] == "list": control_value = c["label"].getLabel() + if c["type"] == "label": control_value = c["control"].getLabel() - if value.startswith('@') and unicode(value[1:]).isnumeric(): - value = config.get_localized_string(int(value[1:])) + matches = match(self.caption, patron=r'@(\d+)').matches + if matches: + for m in matches: + self.caption = self.caption.replace('@' + match, config.get_localized_string(int(m))) - # Operaciones lt "menor que" y gt "mayor que", requieren que las comparaciones sean numeros, sino devuelve + # Operations lt "less than" and gt "greater than" require comparisons to be numbers, otherwise it returns # False if operator in ["lt", "!lt", "gt", "!gt"]: try: @@ -297,127 +276,106 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): except ValueError: return False - # Operacion eq "igual a" + # Operation eq "equal to" if operator in ["eq", "!eq"]: - # valor int + # int try: value = int(value) except ValueError: pass - # valor bool + # bool if not isinstance(value, int) and value.lower() == "true": value = True elif not isinstance(value, int) and value.lower() == "false": value = False - # operacion "eq" "igual a" + # Operation eq "equal to" if operator == "eq": if control_value == value: ok = True else: ok = False - # operacion "!eq" "no igual a" + # Operation !eq "not equal to" if operator == "!eq": if not control_value == value: ok = True else: ok = False - # operacion "gt" "mayor que" + # operation "gt" "greater than" if operator == "gt": if control_value > value: ok = True else: ok = False - # operacion "!gt" "no mayor que" + # operation "!gt" "not greater than" if operator == "!gt": if not control_value > value: ok = True else: ok = False - # operacion "lt" "menor que" + # operation "lt" "less than" if operator == "lt": if control_value < value: ok = True else: ok = False - # operacion "!lt" "no menor que" + # operation "!lt" "not less than" if operator == "!lt": if not control_value < value: ok = True else: ok = False - # Siguiente operación, si es "|" (or) y el resultado es True, no tiene sentido seguir, es True + # Next operation, if it is "|" (or) and the result is True, there is no sense to follow, it is True if next == "|" and ok is True: break - # Siguiente operación, si es "+" (and) y el resultado es False, no tiene sentido seguir, es False + # Next operation, if it is "+" (and) and the result is False, there is no sense to follow, it is False if next == "+" and ok is False: break - # Siguiente operación, si es "+" (and) y el resultado es True, Seguira, para comprobar el siguiente valor - # Siguiente operación, si es "|" (or) y el resultado es False, Seguira, para comprobar el siguiente valor - return ok + def add_control_label(self, c): - control = xbmcgui.ControlLabel(0, -100, self.controls_width, 40, "", alignment=4, font=self.font, - textColor=c["color"]) + control = xbmcgui.ControlLabel(0, -100, self.controls_width + 20, 40, "", alignment=4, font=self.font, textColor=c["color"]) self.addControl(control) control.setVisible(False) control.setLabel(c["label"]) - - # Lo añadimos al listado c["control"] = control + def add_control_list(self, c): - control = xbmcgui.ControlButton(0, -100, self.controls_width + 20, self.height_control, - c["label"], os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'), + control = xbmcgui.ControlButton(0, -100, self.controls_width + 10, self.height_control, c["label"], + os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'), os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png'), - 10, textColor=c["color"], - font=self.font) - - label = xbmcgui.ControlLabel(0, -100, self.controls_width - 80, self.height_control, - "", font=self.font, textColor=c["color"], alignment= 1 | 4) - - upBtn = xbmcgui.ControlButton(0, -100, 15, 7, "", - focusTexture=os.path.join(self.mediapath, 'Controls', 'spinUp-Focus.png'), - noFocusTexture=os.path.join(self.mediapath, 'Controls', 'spinUp-noFocus.png')) - - downBtn = xbmcgui.ControlButton(0, -100 + 15, 15, 7, "", - focusTexture=os.path.join(self.mediapath, 'Controls', 'spinDown-Focus.png'), - noFocusTexture=os.path.join(self.mediapath, 'Controls', 'spinDown-noFocus.png')) + 10, textColor=c["color"], font=self.font) + label = xbmcgui.ControlLabel(0, -100, self.controls_width, self.height_control, "", font=self.font, textColor=c["color"], alignment= 1 | 4) self.addControl(control) self.addControl(label) - self.addControl(upBtn) - self.addControl(downBtn) control.setVisible(False) label.setVisible(False) - upBtn.setVisible(False) - downBtn.setVisible(False) label.setLabel(c["lvalues"][self.values[c["id"]]]) c["control"] = control c["label"] = label - c["downBtn"] = downBtn - c["upBtn"] = upBtn + def add_control_text(self, c): if xbmcgui.ControlEdit == ControlEdit: - control = xbmcgui.ControlEdit(0, -100, self.controls_width, self.height_control, - c["label"], os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'), - os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png'), - 0, textColor=c["color"], - font=self.font, isPassword=c["hidden"], window=self) + control = xbmcgui.ControlEdit(0, -100, self.controls_width, self.height_control, c["label"], + os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'), + os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png'), 0, + textColor=c["color"], font=self.font, isPassword=c["hidden"], window=self) else: control = xbmcgui.ControlEdit(0, -100, self.controls_width - 5, self.height_control, @@ -441,36 +399,27 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): c["control"] = control def add_control_bool(self, c): - # Versiones antiguas no admite algunas texturas + # Old versions do not support some textures if xbmcgui.__version__ in ["1.2", "2.0"]: control = xbmcgui.ControlRadioButton(0, -100, self.controls_width + 20, self.height_control, label=c["label"], font=self.font, textColor=c["color"], - focusTexture=os.path.join(self.mediapath, 'Controls', - 'MenuItemFO.png'), - noFocusTexture=os.path.join(self.mediapath, 'Controls', - 'MenuItemNF.png')) + focusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'), + noFocusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png')) else: control = xbmcgui.ControlRadioButton(0, -100, self.controls_width + 20, self.height_control, label=c["label"], font=self.font, textColor=c["color"], - focusTexture=os.path.join(self.mediapath, 'Controls', - 'MenuItemFO.png'), - noFocusTexture=os.path.join(self.mediapath, 'Controls', - 'MenuItemNF.png'), - focusOnTexture=os.path.join(self.mediapath, 'Controls', - 'radiobutton-focus.png'), - noFocusOnTexture=os.path.join(self.mediapath, 'Controls', - 'radiobutton-focus.png'), - focusOffTexture=os.path.join(self.mediapath, 'Controls', - 'radiobutton-nofocus.png'), - noFocusOffTexture=os.path.join(self.mediapath, 'Controls', - 'radiobutton-nofocus.png')) + focusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemFO.png'), + noFocusTexture=os.path.join(self.mediapath, 'Controls', 'MenuItemNF.png'), + focusOnTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-focus.png'), + noFocusOnTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-focus.png'), + focusOffTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-nofocus.png'), + noFocusOffTexture=os.path.join(self.mediapath, 'Controls', 'radiobutton-nofocus.png')) self.addControl(control) control.setVisible(False) - control.setRadioDimension(x=self.controls_width + 10 - (self.height_control - 5), y=0, - width=self.height_control - 5, height=self.height_control - 5) + control.setRadioDimension(x=self.controls_width - (self.height_control - 5), y=0, width=self.height_control - 5, height=self.height_control - 5) control.setSelected(self.values[c["id"]]) c["control"] = control @@ -482,14 +431,14 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): self.ok_enabled = False self.default_enabled = False - #### Compatibilidad con Kodi 18 #### + # Kodi 18 compatibility if config.get_platform(True)['num_version'] < 18: if xbmcgui.__version__ == "1.2": self.setCoordinateResolution(1) else: self.setCoordinateResolution(5) - # Ponemos el título + # Title self.getControl(10002).setLabel(self.caption) if self.custom_button is not None: @@ -497,95 +446,66 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): self.getControl(10006).setLabel(self.custom_button['label']) else: self.getControl(10006).setVisible(False) - self.getControl(10004).setPosition(self.getControl(10004).getPosition()[0] + 80, - self.getControl(10004).getPosition()[1]) - self.getControl(10005).setPosition(self.getControl(10005).getPosition()[0] + 80, - self.getControl(10005).getPosition()[1]) + self.getControl(10004).setPosition(self.getControl(10004).getPosition()[0] + 80, self.getControl(10004).getPosition()[1]) + self.getControl(10005).setPosition(self.getControl(10005).getPosition()[0] + 80, self.getControl(10005).getPosition()[1]) - # Obtenemos las dimensiones del area de controles + # Control Area Dimensions self.controls_width = self.getControl(10007).getWidth() - 30 self.controls_height = self.getControl(10007).getHeight() -100 self.controls_pos_x = self.getControl(10007).getPosition()[0] + self.getControl(10001).getPosition()[0] + 10 self.controls_pos_y = self.getControl(10007).getPosition()[1] + self.getControl(10001).getPosition()[1] - self.height_control = 40 - self.font = "font12" + self.height_control = 60 + self.font = "font16" - # En versiones antiguas: creamos 5 controles, de lo conrtario al hacer click al segundo control, - # automaticamente cambia el label del tercero a "Short By: Name" no se porque... + # In old versions: we create 5 controls, from the contrary when clicking the second control, + # automatically change third party label to "Short By: Name" I don't know why ... if xbmcgui.ControlEdit == ControlEdit: for x in range(5): control = xbmcgui.ControlRadioButton(-500, 0, 0, 0, "") self.addControl(control) for c in self.list_controls: - # Saltamos controles que no tengan los valores adecuados - if "type" not in c: - continue - if "label" not in c: - continue - if c["type"] != "label" and "id" not in c: - continue - if c["type"] == "list" and "lvalues" not in c: - continue - if c["type"] == "list" and not isinstance(c["lvalues"], list): - continue - if c["type"] == "list" and not len(c["lvalues"]) > 0: - continue - if c["type"] != "label" and len( - [control.get("id") for control in self.list_controls if c["id"] == control.get("id")]) > 1: - continue + # Skip controls that do not have the appropriate values + if "type" not in c: continue + if "label" not in c: continue + if c["type"] != "label" and "id" not in c: continue + if c["type"] == "list" and "lvalues" not in c: continue + if c["type"] == "list" and not isinstance(c["lvalues"], list): continue + if c["type"] == "list" and not len(c["lvalues"]) > 0: continue + if c["type"] != "label" and len([control.get("id") for control in self.list_controls if c["id"] == control.get("id")]) > 1: continue - # Translation label y lvalues - if c['label'].startswith('@') and unicode(c['label'][1:]).isnumeric(): - c['label'] = config.get_localized_string(int(c['label'][1:])) + # Translation label and lvalues + if c['label'].startswith('@') and unicode(c['label'][1:]).isnumeric(): c['label'] = config.get_localized_string(int(c['label'][1:])) if c['type'] == 'list': lvalues = [] for li in c['lvalues']: - if li.startswith('@') and unicode(li[1:]).isnumeric(): - lvalues.append(config.get_localized_string(int(li[1:]))) - else: - lvalues.append(li) + if li.startswith('@') and unicode(li[1:]).isnumeric(): lvalues.append(config.get_localized_string(int(li[1:]))) + else: lvalues.append(li) c['lvalues'] = lvalues - # Valores por defecto en caso de que el control no disponga de ellos - if c["type"] == "bool": - default = False - elif c["type"] == "list": - default = 0 - else: - # label or text - default = "" + # Default values in case the control does not have them + if c["type"] == "bool": default = False + elif c["type"] == "list": default = 0 + else: default = "" # label or text c["default"] = c.get("default", default) c["color"] = c.get("color", "0xFFFFFFFF") c["visible"] = c.get("visible", True) c["enabled"] = c.get("enabled", True) - if c["type"] == "label" and "id" not in c: - c["id"] = None + if c["type"] == "label" and "id" not in c: c["id"] = None + if c["type"] == "text": c["hidden"] = c.get("hidden", False) - if c["type"] == "text": - c["hidden"] = c.get("hidden", False) - - # Decidimos si usar el valor por defecto o el valor guardado + # Decide whether to use the default value or the saved value if c["type"] in ["bool", "text", "list"]: if c["id"] not in self.values: - if not self.callback: - self.values[c["id"]] = config.get_setting(c["id"], **self.kwargs) - else: - self.values[c["id"]] = c["default"] + if not self.callback: self.values[c["id"]] = config.get_setting(c["id"], **self.kwargs) + else: self.values[c["id"]] = c["default"] - if c["type"] == "bool": - self.add_control_bool(c) - - elif c["type"] == 'text': - self.add_control_text(c) - - elif c["type"] == 'list': - self.add_control_list(c) - - elif c["type"] == 'label': - self.add_control_label(c) + if c["type"] == "bool": self.add_control_bool(c) + elif c["type"] == 'text': self.add_control_text(c) + elif c["type"] == 'list': self.add_control_list(c) + elif c["type"] == 'label': self.add_control_label(c) self.list_controls = [c for c in self.list_controls if "control" in c] @@ -608,16 +528,11 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): if focus: if not index >= self.index or not index <= self.index + show_controls: - if index < self.index: - new_index = index - else: - new_index = index - show_controls - else: - new_index = self.index + if index < self.index: new_index = index + else: new_index = index - show_controls + else:new_index = self.index else: - - if index + show_controls >= len(self.visible_controls): index = len( - self.visible_controls) - show_controls - 1 + if index + show_controls >= len(self.visible_controls): index = len(self.visible_controls) - show_controls - 1 if index < 0: index = 0 new_index = index @@ -630,23 +545,17 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): visible_count += 1 if c["type"] != "list": - if c["type"] == "bool": - c["control"].setPosition(self.controls_pos_x, c["y"]) - else: - c["control"].setPosition(self.controls_pos_x, c["y"]) + if c["type"] == "bool": c["control"].setPosition(self.controls_pos_x, c["y"]) + else: c["control"].setPosition(self.controls_pos_x, c["y"]) else: c["control"].setPosition(self.controls_pos_x, c["y"]) - if xbmcgui.__version__ == "1.2": - c["label"].setPosition(self.controls_pos_x + self.controls_width - 30, c["y"]) - else: - c["label"].setPosition(self.controls_pos_x, c["y"]) - c["upBtn"].setPosition(self.controls_pos_x + c["control"].getWidth() - 40, c["y"] + 15) - c["downBtn"].setPosition(self.controls_pos_x + c["control"].getWidth() - 25, c["y"] + 15) + if xbmcgui.__version__ == "1.2": c["label"].setPosition(self.controls_pos_x + self.controls_width - 30, c["y"]) + else: c["label"].setPosition(self.controls_pos_x, c["y"]) self.set_visible(c, True) - # Calculamos la posicion y tamaño del ScrollBar + # Calculate the position and size of the ScrollBar hidden_controls = len(self.visible_controls) - show_controls - 1 if hidden_controls < 0: hidden_controls = 0 @@ -687,34 +596,26 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): self.default_enabled = True def onClick(self, id): - # Valores por defecto + # Default values if id == 10006: if self.custom_button is not None: if self.custom_button["close"]: self.close() - if '.' in self.callback: - package, self.callback = self.callback.rsplit('.', 1) - else: - package = '%s.%s' % (self.ch_type, self.channel) + if '.' in self.callback: package, self.callback = self.callback.rsplit('.', 1) + else: package = '%s.%s' % (self.ch_type, self.channel) - try: - cb_channel = __import__(package, None, None, [package]) - except ImportError: - logger.error('Imposible importar %s' % package) + try: cb_channel = __import__(package, None, None, [package]) + except ImportError: logger.error('Imposible importar %s' % package) else: self.return_value = getattr(cb_channel, self.custom_button['function'])(self.item, self.values) if not self.custom_button["close"]: - if isinstance(self.return_value, dict) and "label" in self.return_value: - self.getControl(10006).setLabel(self.return_value['label']) + if isinstance(self.return_value, dict) and "label" in self.return_value: self.getControl(10006).setLabel(self.return_value['label']) for c in self.list_controls: - if c["type"] == "text": - c["control"].setText(self.values[c["id"]]) - if c["type"] == "bool": - c["control"].setSelected(self.values[c["id"]]) - if c["type"] == "list": - c["label"].setLabel(c["lvalues"][self.values[c["id"]]]) + if c["type"] == "text": c["control"].setText(self.values[c["id"]]) + if c["type"] == "bool": c["control"].setSelected(self.values[c["id"]]) + if c["type"] == "list": c["label"].setLabel(c["lvalues"][self.values[c["id"]]]) self.evaluate_conditions() self.dispose_controls(self.index, force=True) @@ -736,78 +637,57 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): self.check_default() self.check_ok() - # Boton Cancelar y [X] + # Cancel button [X] if id == 10003 or id == 10005: self.close() - # Boton Aceptar + # OK button if id == 10004: self.close() - if self.callback and '.' in self.callback: - package, self.callback = self.callback.rsplit('.', 1) - else: - package = '%s.%s' % (self.ch_type, self.channel) + if self.callback and '.' in self.callback: package, self.callback = self.callback.rsplit('.', 1) + else: package = '%s.%s' % (self.ch_type, self.channel) cb_channel = None - try: - cb_channel = __import__(package, None, None, [package]) - except ImportError: - logger.error('Imposible importar %s' % package) + + try: cb_channel = __import__(package, None, None, [package]) + except ImportError:logger.error('Impossible to import %s' % package) if self.callback: - # Si existe una funcion callback la invocamos ... + # If there is a callback function we invoke it... self.return_value = getattr(cb_channel, self.callback)(self.item, self.values) else: - # si no, probamos si en el canal existe una funcion 'cb_validate_config' ... + # if not, we test if there is a 'cb_validate_config' function in the channel... try: self.return_value = getattr(cb_channel, 'cb_validate_config')(self.item, self.values) except AttributeError: - # ... si tampoco existe 'cb_validate_config'... + # if 'cb_validate_config' doesn't exist either ... for v in self.values: config.set_setting(v, self.values[v], **self.kwargs) - # Controles de ajustes, si se cambia el valor de un ajuste, cambiamos el valor guardado en el diccionario de - # valores - # Obtenemos el control sobre el que se ha echo click + # Adjustment controls, if the value of an adjustment is changed, we change the value saved in the value dictionary + # Get the control that has been clicked # control = self.getControl(id) - # Lo buscamos en el listado de controles + # We look it up in the list of controls for cont in self.list_controls: - # Si el control es un "downBtn" o "upBtn" son los botones del "list" - # en este caso cambiamos el valor del list - if cont["type"] == "list" and (cont["downBtn"].getId() == id or cont["upBtn"].getId() == id): + if cont['type'] == "list" and cont["control"].getId() == id: + select = platformtools.dialog_select(config.get_localized_string(30041), cont["lvalues"], self.values[cont["id"]]) + if select >= 0: + cont["label"].setLabel(cont["lvalues"][select]) + self.values[cont["id"]] = cont["lvalues"].index(cont["label"].getLabel()) - # Para bajar una posicion - if cont["downBtn"].getId() == id: - index = cont["lvalues"].index(cont["label"].getLabel()) - if index > 0: - cont["label"].setLabel(cont["lvalues"][index - 1]) + # If the control is a "bool", we save the new value True / False + if cont["type"] == "bool" and cont["control"].getId() == id: self.values[cont["id"]] = bool(cont["control"].isSelected()) - # Para subir una posicion - elif cont["upBtn"].getId() == id: - index = cont["lvalues"].index(cont["label"].getLabel()) - if index < len(cont["lvalues"]) - 1: - cont["label"].setLabel(cont["lvalues"][index + 1]) - - # Guardamos el nuevo valor en el diccionario de valores - self.values[cont["id"]] = cont["lvalues"].index(cont["label"].getLabel()) - - # Si esl control es un "bool", guardamos el nuevo valor True/False - if cont["type"] == "bool" and cont["control"].getId() == id: - self.values[cont["id"]] = bool(cont["control"].isSelected()) - - # Si esl control es un "text", guardamos el nuevo valor + # If the control is a "text", we save the new value if cont["type"] == "text" and cont["control"].getId() == id: - # Versiones antiguas requieren abrir el teclado manualmente + # Older versions require opening the keyboard manually if xbmcgui.ControlEdit == ControlEdit: - import xbmc - keyboard = xbmc.Keyboard(cont["control"].getText(), cont["control"].getLabel(), - cont["control"].isPassword) + keyboard = xbmc.Keyboard(cont["control"].getText(), cont["control"].getLabel(), cont["control"].isPassword) keyboard.setHiddenInput(cont["control"].isPassword) keyboard.doModal() - if keyboard.isConfirmed(): - cont["control"].setText(keyboard.getText()) + if keyboard.isConfirmed(): cont["control"].setText(keyboard.getText()) self.values[cont["id"]] = cont["control"].getText() @@ -816,70 +696,43 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): self.check_default() self.check_ok() - # Versiones antiguas requieren esta funcion + # Older versions require this feature def onFocus(self, a): pass def onAction(self, raw_action): - # Obtenemos el foco + # Get Focus focus = self.getFocusId() action = raw_action.getId() - # Accion 1: Flecha izquierda + # On Left if action == 1: - # Si el foco no está en ninguno de los tres botones inferiores, y esta en un "list" cambiamos el valor - if focus not in [10004, 10005, 10006]: - control = self.getFocus().getId() - for cont in self.list_controls: - if cont["type"] == "list" and cont["control"].getId() == control: - index = cont["lvalues"].index(cont["label"].getLabel()) - if index > 0: - cont["label"].setLabel(cont["lvalues"][index - 1]) + # if Focus is on close button + if focus == 10003: + self.dispose_controls(0, True) + self.setFocusId(3001) - # Guardamos el nuevo valor en el listado de controles - self.values[cont["id"]] = cont["lvalues"].index(cont["label"].getLabel()) - - self.evaluate_conditions() - self.dispose_controls(self.index, force=True) - self.check_default() - self.check_ok() - - # Si el foco está en alguno de los tres botones inferiores, movemos al siguiente + # if focus is on List else: - if focus == 10006: - self.setFocusId(10005) - if focus == 10005 and self.ok_enabled: + if self.ok_enabled: self.setFocusId(10004) - - # Accion 1: Flecha derecha - elif action == 2: - # Si el foco no está en ninguno de los tres botones inferiores, y esta en un "list" cambiamos el valor - if focus not in [10004, 10005, 10006]: - control = self.getFocus().getId() - for cont in self.list_controls: - if cont["type"] == "list" and cont["control"].getId() == control: - index = cont["lvalues"].index(cont["label"].getLabel()) - if index < len(cont["lvalues"]) - 1: - cont["label"].setLabel(cont["lvalues"][index + 1]) - - # Guardamos el nuevo valor en el listado de controles - self.values[cont["id"]] = cont["lvalues"].index(cont["label"].getLabel()) - - self.evaluate_conditions() - self.dispose_controls(self.index, force=True) - self.check_default() - self.check_ok() - - # Si el foco está en alguno de los tres botones inferiores, movemos al siguiente - else: - if focus == 10004: + else: self.setFocusId(10005) - if focus == 10005 and self.default_enabled: - self.setFocusId(10006) - # Accion 4: Flecha abajo + # On Right + elif action == 2: + # if Focus is on button + if focus in [10004, 10005, 10006]: + self.dispose_controls(0, True) + self.setFocusId(3001) + + # if focus is on List + else: + self.setFocusId(10003) + + # On Down elif action == 4: - # Si el foco no está en ninguno de los tres botones inferiores, bajamos el foco en los controles de ajustes + # if focus is on List if focus not in [10004, 10005, 10006]: try: focus_control = [self.visible_controls.index(c) for c in self.visible_controls if c["control"].getId() == self.getFocus().getId()][0] @@ -888,20 +741,28 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): except: focus_control = 0 - while not focus_control == len(self.visible_controls) and ( - self.visible_controls[focus_control]["type"] == "label" or not - self.visible_controls[focus_control]["active"]): + while not focus_control == len(self.visible_controls) and (self.visible_controls[focus_control]["type"] == "label" or not self.visible_controls[focus_control]["active"]): focus_control += 1 if focus_control >= len(self.visible_controls): - self.setFocusId(10005) - return + focus_control = 0 + self.setFocusId(3001) self.dispose_controls(focus_control, True) - # Accion 4: Flecha arriba + # Else navigate on main buttons + elif focus in [10004]: + self.setFocusId(10005) + elif focus in [10005]: + if self.default_enabled: self.setFocusId(10006) + elif self.ok_enabled: self.setFocusId(10004) + elif focus in [10006]: + if self.ok_enabled: self.setFocusId(10004) + else: self.setFocusId(10005) + + # On Up elif action == 3: - # Si el foco no está en ninguno de los tres botones inferiores, subimos el foco en los controles de ajustes + # if focus is on List if focus not in [10003, 10004, 10005, 10006]: try: focus_control = \ @@ -912,27 +773,31 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): self.visible_controls[focus_control]["active"]): focus_control -= 1 - if focus_control < 0: focus_control = 0 + if focus_control < 0: + focus_control = len(self.visible_controls) - 1 + except: focus_control = 0 self.dispose_controls(focus_control, True) - # Si el foco está en alguno de los tres botones inferiores, ponemos el foco en el ultimo ajuste. - else: - focus_control = len(self.visible_controls) - 1 - while not focus_control == -1 and (self.visible_controls[focus_control]["type"] == "label" or not - self.visible_controls[focus_control]["active"]): - focus_control -= 1 - if focus_control < 0: focus_control = 0 + # Else navigate on main buttons + elif focus in [10004]: + if self.default_enabled: self.setFocusId(10006) + else: self.setFocusId(10005) + elif focus in [10005]: + if self.ok_enabled: self.setFocusId(10004) + elif self.default_enabled: self.setFocusId(10006) + elif focus in [10006]: + self.setFocusId(10005) - self.setFocus(self.visible_controls[focus_control]["control"]) - # Accion 104: Scroll arriba + + # Accion 104: Scroll Down elif action == 104: self.dispose_controls(self.index - 1) - # Accion 105: Scroll abajo + # Accion 105: Scroll Up elif action == 105: self.dispose_controls(self.index + 1) @@ -941,6 +806,9 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): elif action in [10, 92]: self.close() + elif action == 501: + self.xx = int(raw_action.getAmount2()) + elif action == 504: if self.xx > raw_action.getAmount2(): @@ -953,8 +821,6 @@ class SettingsWindow(xbmcgui.WindowXMLDialog): self.dispose_controls(self.index - 1) return - elif action == 501: - self.xx = int(raw_action.getAmount2()) class ControlEdit(xbmcgui.ControlButton): diff --git a/platformcode/xbmc_info_window.py b/platformcode/xbmc_info_window.py index 07c689fc..1fb9c859 100644 --- a/platformcode/xbmc_info_window.py +++ b/platformcode/xbmc_info_window.py @@ -226,14 +226,12 @@ class InfoWindow(xbmcgui.WindowXMLDialog): self.getControl(100014).setLabel(config.get_localized_string(60384)) self.getControl(100015).setLabel(self.result.get("temporada_nombre", "N/A")) self.getControl(100016).setLabel(config.get_localized_string(60385)) - self.getControl(100017).setLabel(self.result.get("season", "N/A") + " de " + - self.result.get("seasons", "N/A")) + self.getControl(100017).setLabel(self.result.get("season", "N/A") + " de " + self.result.get("seasons", "N/A")) if self.result.get("episode"): self.getControl(100014).setLabel(config.get_localized_string(60377)) self.getControl(100015).setLabel(self.result.get("episode_title", "N/A")) self.getControl(100018).setLabel(config.get_localized_string(60386)) - self.getControl(100019).setLabel(self.result.get("episode", "N/A") + " de " + - self.result.get("episodes", "N/A")) + self.getControl(100019).setLabel(self.result.get("episode", "N/A") + " de " + self.result.get("episodes", "N/A")) self.getControl(100020).setLabel(config.get_localized_string(60387)) self.getControl(100021).setLabel(self.result.get("date", "N/A")) @@ -287,10 +285,10 @@ class InfoWindow(xbmcgui.WindowXMLDialog): logger.info("action=" + repr(action.getId())) action = action.getId() - # Obtenemos el foco + # Find Focus focus = self.getFocusId() - # Accion 1: Flecha izquierda + # Left if action == 1: if focus == ID_BUTTON_OK: @@ -298,26 +296,26 @@ class InfoWindow(xbmcgui.WindowXMLDialog): elif focus == ID_BUTTON_CANCEL: if self.indexList + 1 != len(self.listData): - # vamos al botón Siguiente + # Next self.setFocus(self.getControl(ID_BUTTON_NEXT)) elif self.indexList > 0: - # vamos al botón Anterior ya que Siguiente no está activo (estamos al final de la lista) + # Previous self.setFocus(self.getControl(ID_BUTTON_PREVIOUS)) elif focus == ID_BUTTON_NEXT: if self.indexList > 0: - # vamos al botón Anterior + # Next self.setFocus(self.getControl(ID_BUTTON_PREVIOUS)) - # Accion 2: Flecha derecha + # Right elif action == 2: if focus == ID_BUTTON_PREVIOUS: if self.indexList + 1 != len(self.listData): - # vamos al botón Siguiente + # Next self.setFocus(self.getControl(ID_BUTTON_NEXT)) else: - # vamos al botón Cancelar ya que Siguiente no está activo (estamos al final de la lista) + # Cancel self.setFocus(self.getControl(ID_BUTTON_CANCEL)) elif focus == ID_BUTTON_NEXT: @@ -326,6 +324,13 @@ class InfoWindow(xbmcgui.WindowXMLDialog): elif focus == ID_BUTTON_CANCEL: self.setFocus(self.getControl(ID_BUTTON_OK)) + # Up + elif action == 3: + self.setFocus(self.getControl(ID_BUTTON_CLOSE)) + + # Down + elif action == 4: + self.setFocus(self.getControl(ID_BUTTON_OK)) # Pulsa ESC o Atrás, simula click en boton cancelar if action in [10, 92]: self.onClick(ID_BUTTON_CANCEL) diff --git a/platformcode/xbmc_videolibrary.py b/platformcode/xbmc_videolibrary.py index baecce5c..86b2ed4a 100644 --- a/platformcode/xbmc_videolibrary.py +++ b/platformcode/xbmc_videolibrary.py @@ -13,6 +13,7 @@ import os import threading import time import re +import math import xbmc from core import filetools @@ -503,7 +504,7 @@ def update(folder_content=config.get_setting("folder_tvshows"), folder=""): #update_path = filetools.join(videolibrarypath, folder_content, folder) + "/" # Problemas de encode en "folder" update_path = filetools.join(videolibrarypath, folder_content, ' ').rstrip() - if not scrapertools.find_single_match(update_path, '(^\w+:\/\/)'): + if videolibrarypath.startswith("special:") or not scrapertools.find_single_match(update_path, '(^\w+:\/\/)'): payload["params"] = {"directory": update_path} while xbmc.getCondVisibility('Library.IsScanningVideo()'): @@ -511,8 +512,6 @@ def update(folder_content=config.get_setting("folder_tvshows"), folder=""): data = get_data(payload) - #xbmc.executebuiltin('XBMC.ReloadSkin()') - def search_library_path(): sql = 'SELECT strPath FROM path WHERE strPath LIKE "special://%/plugin.video.kod/library/" AND idParentPath ISNULL' @@ -896,127 +895,76 @@ def clean(path_list=[]): progress = platformtools.dialog_progress_bg(config.get_localized_string(20000), config.get_localized_string(80025)) progress.update(0) - for path in path_list: - - idParentPath = 0 - sql_path = '' - sql_movies_path = '' - sql_tvshows_path = '' - sql_episodes_path = '' - - path, sep = sql_format(path) - movies_folder = config.get_setting("folder_movies") - tvshows_folder = config.get_setting("folder_tvshows") - - # delete episode/movie (downloads.py move_to_libray) - if path.endswith(".strm"): - if movies_folder in path: - sql_movies_path = path - else: - sql_episodes_path = path - # delete movie - elif movies_folder in path: - if not path.endswith(sep): path += sep - - sql_movies_path = path + '%' - # delete tvshow - elif tvshows_folder in path: - if not path.endswith(sep): path += sep - - sql_tvshows_path = path + '%' - - sql_episodes_path = sql_tvshows_path - # delete video library - else: - if not path.endswith(sep): path += sep - - sql_path = path - - sql_movies_path = sql_path + movies_folder - if not sql_movies_path.endswith(sep): sql_movies_path += sep - sql_movies_path += '%' - - sql_tvshows_path = sql_path + tvshows_folder - if not sql_tvshows_path.endswith(sep): sql_tvshows_path += sep - sql_tvshows_path += '%' - - sql_episodes_path = sql_tvshows_path - - if sql_path: - # search video library path in the DB + # if the path list is empty, clean the entire video library + if not path_list: + if not config.get_setting("videolibrary_kodi"): + sql_path, sep = sql_format(config.get_setting("videolibrarypath")) + if not sql_path.endswith(sep): sql_path += sep sql = 'SELECT idPath FROM path where strPath LIKE "%s"' % sql_path nun_records, records = execute_sql_kodi(sql) - # delete video library path - if records: - idPath = records[0][0] - idParentPath = idPath - if not config.get_setting("videolibrary_kodi"): - sql = 'DELETE from path WHERE idPath=%s' % idPath - nun_records, records = execute_sql_kodi(sql) - - if sql_movies_path: - # search movies in the DB - sql = 'SELECT idMovie FROM movie where c22 LIKE "%s"' % sql_movies_path + idPath = records[0][0] + sql = 'DELETE from path WHERE idPath=%s' % idPath nun_records, records = execute_sql_kodi(sql) - # delete movies - if records: - for record in records: - idMovie = record[0] - sql = 'DELETE from movie WHERE idMovie=%s' % idMovie - nun_records, records = execute_sql_kodi(sql) - - if sql_movies_path: - # search movies path and folders in the DB - sql = 'SELECT idPath, idParentPath FROM path where strPath LIKE "%s"' % sql_movies_path + sql = 'DELETE from path WHERE idParentPath=%s' % idPath nun_records, records = execute_sql_kodi(sql) - # delete movies path and folders - if records: - for record in records: - if record[1] == idParentPath and config.get_setting("videolibrary_kodi"): - continue - idPath = record[0] - sql = 'DELETE from path WHERE idPath=%s' % idPath - nun_records, records = execute_sql_kodi(sql) - if sql_tvshows_path: - # search TV shows in the DB - sql = 'SELECT idShow FROM tvshow_view where strPath LIKE "%s"' % sql_tvshows_path - nun_records, records = execute_sql_kodi(sql) - # delete TV shows - if records: - for record in records: - idShow = record[0] - sql = 'DELETE from tvshow WHERE idShow=%s' % idShow - nun_records, records = execute_sql_kodi(sql) + from core import videolibrarytools + for path, folders, files in filetools.walk(videolibrarytools.MOVIES_PATH): + for folder in folders: + path_list.append(filetools.join(config.get_setting("videolibrarypath"), videolibrarytools.FOLDER_MOVIES, folder)) - if sql_episodes_path: - # search episodes in the DB - sql = 'SELECT idEpisode FROM episode where c18 LIKE "%s"' % sql_episodes_path - nun_records, records = execute_sql_kodi(sql) - # delete episodes - if records: - for record in records: - idEpisode = record[0] - sql = 'DELETE from episode WHERE idEpisode=%s' % idEpisode - nun_records, records = execute_sql_kodi(sql) + for path, folders, files in filetools.walk(videolibrarytools.TVSHOWS_PATH): + for folder in folders: + tvshow_nfo = filetools.join(path, folder, "tvshow.nfo") + if filetools.exists(tvshow_nfo): + path_list.append(filetools.join(config.get_setting("videolibrarypath"), videolibrarytools.FOLDER_TVSHOWS, folder)) - if sql_tvshows_path: - # search TV shows path and folders in the DB - sql = 'SELECT idPath, idParentPath FROM path where strPath LIKE "%s"' % sql_tvshows_path + if path_list: t = float(100) / len(path_list) + for i, path in enumerate(path_list): + progress.update(int(math.ceil((i + 1) * t))) + + if not path: + continue + + sql_path, sep = sql_format(path) + if filetools.isdir(path) and not sql_path.endswith(sep): sql_path += sep + + if filetools.isdir(path): + # search movie in the DB + sql = 'SELECT idMovie FROM movie where c22 LIKE "%s"' % (sql_path + '%') nun_records, records = execute_sql_kodi(sql) - # delete tvshows path and folders + # delete movie if records: - for record in records: - if record[1] == idParentPath and config.get_setting("videolibrary_kodi"): - continue - idPath = record[0] - sql = 'DELETE from path WHERE idPath=%s' % idPath - nun_records, records = execute_sql_kodi(sql) + payload = {"jsonrpc": "2.0", "method": "VideoLibrary.RemoveMovie", "id": 1, "params": {"movieid": records[0][0]}} + data = get_data(payload) + continue + # search TV show in the DB + sql = 'SELECT idShow FROM tvshow_view where strPath LIKE "%s"' % sql_path + nun_records, records = execute_sql_kodi(sql) + # delete TV show + if records: + payload = {"jsonrpc": "2.0", "method": "VideoLibrary.RemoveTVShow", "id": 1, "params": {"tvshowid": records[0][0]}} + data = get_data(payload) + elif config.get_setting("folder_movies") in sql_path: + # search movie in the DB + sql = 'SELECT idMovie FROM movie where c22 LIKE "%s"' % sql_path + nun_records, records = execute_sql_kodi(sql) + # delete movie + if records: + payload = {"jsonrpc": "2.0", "method": "VideoLibrary.RemoveMovie", "id": 1, "params": {"movieid": records[0][0]}} + data = get_data(payload) + else: + # search episode in the DB + sql = 'SELECT idEpisode FROM episode where c18 LIKE "%s"' % sql_path + nun_records, records = execute_sql_kodi(sql) + # delete episode + if records: + payload = {"jsonrpc": "2.0", "method": "VideoLibrary.RemoveEpisode", "id": 1, "params": {"episodeid": records[0][0]}} + data = get_data(payload) progress.update(100) xbmc.sleep(1000) progress.close() - xbmc.executebuiltin('XBMC.ReloadSkin()') def execute_sql_kodi(sql): @@ -1120,7 +1068,6 @@ def check_sources(new_movies_path='', new_tvshows_path=''): return False, False - def update_sources(new='', old=''): logger.info() if new == old: return @@ -1212,6 +1159,8 @@ def ask_set_content(silent=False): if set_content("movie", True, custom) and set_content("tvshow", True, custom): platformtools.dialog_ok(config.get_localized_string(80026), config.get_localized_string(70104)) config.set_setting("videolibrary_kodi", True) + from specials import videolibrary + videolibrary.update_videolibrary() update() else: platformtools.dialog_ok(config.get_localized_string(80026), config.get_localized_string(80024)) diff --git a/resources/language/English/strings.po b/resources/language/English/strings.po index e75aa764..e8eeecb9 100644 --- a/resources/language/English/strings.po +++ b/resources/language/English/strings.po @@ -23,12 +23,16 @@ msgctxt "#20001" msgid "eng" msgstr "" +msgctxt "#30000" +msgid "View" +msgstr "" + msgctxt "#30001" msgid "Check for updates" msgstr "" msgctxt "#30002" -msgid "Enable adult mode" +msgid "Enable touch view" msgstr "" msgctxt "#30003" @@ -55,6 +59,10 @@ msgctxt "#30008" msgid "High" msgstr "" +msgctxt "#30009" +msgid "Show only channels" +msgstr "" + msgctxt "#30010" msgid "Channel icons view" msgstr "" @@ -76,7 +84,7 @@ msgid "Password" msgstr "" msgctxt "#30017" -msgid "Download path*" +msgid "Download path" msgstr "" msgctxt "#30018" @@ -108,7 +116,7 @@ msgid "Contextual menu" msgstr "" msgctxt "#30025" -msgid "Show KoD settings" +msgid "" msgstr "" msgctxt "#30026" @@ -144,7 +152,7 @@ msgid "Internal Client" msgstr "" msgctxt "#30034" -msgid ": Select the video, or 'Cancel' for all" +msgid "Select the video, or 'Cancel' for all" msgstr "" msgctxt "#30035" @@ -171,6 +179,10 @@ msgctxt "#30040" msgid "Do you really want to delete the %s file?" msgstr "" +msgctxt "#30041" +msgid "Select a value" +msgstr "" + msgctxt "#30043" msgid "Force view mode" msgstr "" @@ -204,7 +216,7 @@ msgid "Unsopported Server" msgstr "" msgctxt "#30067" -msgid "Path*" +msgid "Path" msgstr "" msgctxt "#30068" @@ -280,7 +292,7 @@ msgid "Documentaries" msgstr "" msgctxt "#30126" -msgid "Adult" +msgid "" msgstr "" msgctxt "#30130" @@ -477,15 +489,15 @@ msgid "Academy Awards" msgstr "" msgctxt "#30998" -msgid "Shortcut" +msgid "Quick menu shortcut" msgstr "" msgctxt "#30999" -msgid "Assign key to open shortcut" +msgid "Assign key" msgstr "" msgctxt "#31000" -msgid "Remove key to open shortcut" +msgid "Unassign key" msgstr "" msgctxt "#50000" @@ -709,11 +721,11 @@ msgid "Mark TV show as watched" msgstr "" msgctxt "#60022" -msgid "Automatically find new episodes: Disable" +msgid "Remove from video library update" msgstr "" msgctxt "#60023" -msgid "Automatically find new episodes: Enable" +msgid "Add to video library update" msgstr "" msgctxt "#60024" @@ -725,7 +737,7 @@ msgid "Delete TV show" msgstr "" msgctxt "#60026" -msgid "Search for new episodes and update" +msgid "KoD settings" msgstr "" msgctxt "#60027" @@ -789,7 +801,7 @@ msgid "Delete TV show" msgstr "" msgctxt "#60042" -msgid "Delete links of %s" +msgid "Delete channel %s" msgstr "" msgctxt "#60043" @@ -797,7 +809,7 @@ msgid "Delete %s links of channel %s" msgstr "" msgctxt "#60044" -msgid "Do you want really to delete '%s' from video library?" +msgid "Do you want really to delete "%s" from video library?" msgstr "" msgctxt "#60045" @@ -877,7 +889,7 @@ msgid "Added episode to the video library..." msgstr "" msgctxt "#60066" -msgid "An error has occurred. It has not been possible to add the movie "%s" to the video library" +msgid "An error has occurred. The movie "%s" has not been added to the video library" msgstr "" msgctxt "#60067" @@ -889,7 +901,7 @@ msgid "An error has occurred. The TV show "%s" has not been added to the video l msgstr "" msgctxt "#60069" -msgid "An error has occurred. The TV show "%s" has not been added completely to the video library" +msgid "An error has occurred. The TV show "%s" has not been completely added to the video library" msgstr "" msgctxt "#60070" @@ -897,7 +909,7 @@ msgid "The TV show "%s" has been added to the video library" msgstr "" msgctxt "#60071" -msgid "Autoplay configuration" +msgid "AutoPlay configuration" msgstr "" msgctxt "#60072" @@ -1373,7 +1385,7 @@ msgid "Find %s possible matches" msgstr "" msgctxt "#60298" -msgid "[%s]: Select the correct TV show" +msgid "%s - Select the correct TV show" msgstr "" msgctxt "#60299" @@ -1401,7 +1413,7 @@ msgid "The unzipped %s file already exists, or you want to overwrite it.?" msgstr "" msgctxt "#60305" -msgid "Adult channels" +msgid "" msgstr "" msgctxt "#60306" @@ -1413,7 +1425,7 @@ msgid "Use 'Preferences' to change your password" msgstr "" msgctxt "#60308" -msgid "Adult channels" +msgid "" msgstr "" msgctxt "#60309" @@ -1517,7 +1529,7 @@ msgid "Configuration" msgstr "" msgctxt "#60334" -msgid "Password for adult channels" +msgid "" msgstr "" msgctxt "#60335" @@ -1557,7 +1569,7 @@ msgid "Information" msgstr "" msgctxt "#60349" -msgid "Go to the main menu" +msgid "Previous menu" msgstr "" msgctxt "#60350" @@ -1565,7 +1577,7 @@ msgid "Search in other channels" msgstr "Search in other channels" msgctxt "#60351" -msgid "Set as Homepage" +msgid "Set as main menu" msgstr "" msgctxt "#60352" @@ -1681,7 +1693,7 @@ msgid "Summary:" msgstr "" msgctxt "#60389" -msgid "Updating %s [%s]..." +msgid "Updating "%s" [%s]..." msgstr "" msgctxt "#60390" @@ -2293,7 +2305,7 @@ msgid "Download settings" msgstr "" msgctxt "#60542" -msgid "Video library settings" +msgid "Configure video library" msgstr "" msgctxt "#60544" @@ -2385,7 +2397,7 @@ msgid "Restore video library (strm, nfo and json)" msgstr "" msgctxt "#60568" -msgid "Search for new episodes and update video library" +msgid "Update video library" msgstr "" msgctxt "#60569" @@ -2489,7 +2501,7 @@ msgid " Server #%s" msgstr "" msgctxt "#60598" -msgid "Configuration of video library" +msgid "Video library configuration" msgstr "" msgctxt "#60600" @@ -2509,15 +2521,15 @@ msgid "When Kodi starts" msgstr "" msgctxt "#60604" -msgid "Once a day" +msgid "Daily" msgstr "" msgctxt "#60605" -msgid "At the start of Kodi and once a day" +msgid "When Kodi starts and daily" msgstr "" msgctxt "#60606" -msgid " Wait before updating at startup of Kodi" +msgid " Update waiting time" msgstr "" msgctxt "#60607" @@ -2541,11 +2553,11 @@ msgid "60 sec" msgstr "" msgctxt "#60613" -msgid " Begin scheduled update from" +msgid " Update time" msgstr "" msgctxt "#60614" -msgid " Search for new episodes in active TV shows" +msgid " Search for new episodes" msgstr "" msgctxt "#60615" @@ -2557,15 +2569,15 @@ msgid "Always" msgstr "" msgctxt "#60617" -msgid "According to new episodes" +msgid "Based on airing" msgstr "" msgctxt "#60618" -msgid " Search for content in" +msgid " Kodi video library update" msgstr "" msgctxt "#60619" -msgid "The folder of each TV show" +msgid "Each TV show" msgstr "" msgctxt "#60620" @@ -2573,7 +2585,7 @@ msgid "All video library" msgstr "" msgctxt "#60621" -msgid "Show links in" +msgid "Links view" msgstr "" msgctxt "#60622" @@ -2629,7 +2641,7 @@ msgid "0 seg" msgstr "" msgctxt "#60637" -msgid "Synchronizing with Trakt" +msgid " Synchronizing with Trakt" msgstr "" msgctxt "#60638" @@ -2673,7 +2685,7 @@ msgid "Never" msgstr "" msgctxt "#60650" -msgid "Video library information provider" +msgid " Video library information providers" msgstr "" msgctxt "#60651" @@ -3117,15 +3129,15 @@ msgid "Most Viewed" msgstr "" msgctxt "#70078" -msgid "Show only links of " +msgid "Show links of " msgstr "" msgctxt "#70079" -msgid "Delete ony the links of " +msgid "Delete channel " msgstr "" msgctxt "#70081" -msgid "The folder also contains local or downloaded video files. Do you want to delete them?" +msgid "The folder "%s" contains other files. Delete it anyway?" msgstr "" msgctxt "#70082" @@ -3145,7 +3157,7 @@ msgid "Delete TV show" msgstr "" msgctxt "#70086" -msgid "Delete only the links of %s" +msgid "Delete channel %s" msgstr "" msgctxt "#70087" @@ -3153,7 +3165,7 @@ msgid "Deleted %s links from canal %s" msgstr "" msgctxt "#70088" -msgid "Are you sure you want to delete '%s' from video library?" +msgid "Are you sure you want to delete "%s" from video library?" msgstr "" msgctxt "#70089" @@ -3257,7 +3269,7 @@ msgid "Only until Kodi restarts" msgstr "" msgctxt "#70115" -msgid "Request password to open adult channels" +msgid "" msgstr "" msgctxt "#70116" @@ -3269,15 +3281,15 @@ msgid "Confirm new password" msgstr "" msgctxt "#70118" -msgid "TV shows folder*" +msgid "TV shows folder" msgstr "" msgctxt "#70119" -msgid "Movies folder*" +msgid "Movies folder" msgstr "" msgctxt "#70120" -msgid "Add KoD contents to Kodi video library*" +msgid "Add KoD contents to Kodi video library" msgstr "" msgctxt "#70121" @@ -3305,8 +3317,8 @@ msgid "Customization" msgstr "" msgctxt "#70128" -msgid "Infoplus Animation" -msgstr "Animazione Infoplus" +msgid "InfoPlus animation" +msgstr "Animazione InfoPlus" msgctxt "#70129" msgid "Without animation" @@ -3397,7 +3409,7 @@ msgid "Contextual menu" msgstr "" msgctxt "#70151" -msgid "Show Infoplus" +msgid "Show InfoPlus" msgstr "" msgctxt "#70152" @@ -3405,7 +3417,7 @@ msgid "Show ExtendedInfo" msgstr "" msgctxt "#70153" -msgid "Shortcut" +msgid "" msgstr "" msgctxt "#70154" @@ -3853,11 +3865,15 @@ msgid "The data entered is not correct!" msgstr "" msgctxt "#70266" -msgid "The search for% s did not match." +msgid "The search for %s did not match" +msgstr "" + +msgctxt "#70268" +msgid "The TV show "%s" is ended or has been canceled. Would you like to remove it from the video library update?" msgstr "" msgctxt "#70269" -msgid "Search new episodes now" +msgid "Search new episodes" msgstr "" msgctxt "#70270" @@ -3929,7 +3945,7 @@ msgid "Configure search" msgstr "" msgctxt "#70287" -msgid "Configure video library" +msgid "Video library settings" msgstr "" msgctxt "#70288" @@ -5656,7 +5672,7 @@ msgid "Dear user, you seem to have problems with ADSL! We suggest you call your msgstr "" msgctxt "#70722" -msgid "Dear User, your current DNS do not allow you to reach all sites, ergo, not all Channels will work, we recommend you, to take advantage of more, to set up the DNS.\nSearch your favorite search engine for\n 1. guides on how to choose a free DNS.\n 2. set it up on your device.\nWe recommend the cloudflare DNS 1.1.1.1 and 1.0.0.1\nAlternatively the Google DNS 8.8.8.8 and 8.8.4.4.\nIf you have a VODAFONE station, enter the modem panel and disable 'Secure DNS' before proceeding.\n" +msgid "Dear User, you have disabled the DNS override and your current DNS do not allow you to reach all sites, ergo, not all Channels will work, we recommend you, to take advantage of more, to set up the DNS or re-enable the override in settings.\nSearch your favorite search engine for\n 1. guides on how to choose a free DNS.\n 2. set it up on your device.\nWe recommend the cloudflare DNS 1.1.1.1 and 1.0.0.1\nAlternatively the Google DNS 8.8.8.8 and 8.8.4.4.\nIf you have a VODAFONE station, enter the modem panel and disable 'Secure DNS' before proceeding.\n" msgstr "" msgctxt "#70723" @@ -5905,7 +5921,7 @@ msgstr "" msgctxt "#70784" msgid "Attention!" -msgstr "Attenzione!" +msgstr "" msgctxt "#70785" msgid "Install Elementum" @@ -5924,7 +5940,7 @@ msgid "Logging" msgstr "" msgctxt "#70789" -msgid "* Change by opening the settings from KoD main menu" +msgid "" msgstr "" msgctxt "#70790" @@ -5987,6 +6003,14 @@ msgctxt "#70804" msgid "Next extraction..." msgstr "" +msgctxt "#70805" +msgid "Stay in seed" +msgstr "" + +msgctxt "#70806" +msgid "Changing this parameter permanently overwrites the Elementum settings.\nDo you want to continue?" +msgstr "" + # DNS start [ settings and declaration ] msgctxt "#707401" msgid "Enable DNS check alert" @@ -6213,7 +6237,7 @@ msgid "Folder name for TV shows" msgstr "" msgctxt "#80022" -msgid "You can configure the Kodi video library later from the settings menu inside KoD" +msgid "You can configure the Kodi video library later from KoD settings" msgstr "" msgctxt "#80023" @@ -6221,7 +6245,7 @@ msgid "You will be asked to choose and configure the information providers for m msgstr "" msgctxt "#80024" -msgid "An error has occurred during the configuration of the Kodi video library. Please check the log and try again from the settings menu inside KoD" +msgid "An error has occurred during the configuration of the Kodi video library. Please check the log and try again from KoD settings" msgstr "" msgctxt "#80025" @@ -6241,7 +6265,7 @@ msgid "The selected folders are already used by the Kodi library. Please change msgstr "" msgctxt "#80029" -msgid "The selected folders are already used by the Kodi library. Please change them properly from the settings menu inside KoD" +msgid "The selected folders are already used by the Kodi library. Please change them properly from KoD settings" msgstr "" msgctxt "#80030" @@ -6253,7 +6277,7 @@ msgid "Unable to connect to github. This is probably due to a lack of connection msgstr "" msgctxt "#80032" -msgid "Installation in progress..." +msgid "Installing..." msgstr "" msgctxt "#80033" @@ -6290,4 +6314,40 @@ msgstr "" msgctxt "#80041" msgid "Latest updates:\n" +msgstr "" + +msgctxt "#80042" +msgid "Include local episodes when adding a TV shows" +msgstr "" + +msgctxt "#80043" +msgid "Attention, in order to watch local episodes you have to configure the Kodi video library from KoD settings" +msgstr "" + +msgctxt "#80044" +msgid "Do you want to include local episodes for the TV show "%s"?" +msgstr "" + +msgctxt "#80045" +msgid "The folder of the local episodes has to be different from the TV show one in the KoD video library" +msgstr "" + +msgctxt "#80046" +msgid "Select the folder containing the local episodes" +msgstr "" + +msgctxt "#80047" +msgid "The TV show "% s" includes local episodes. They will be only removed from the Kodi video library without being deleted" +msgstr "" + +msgctxt "#80048" +msgid "Add local episodes" +msgstr "" + +msgctxt "#80049" +msgid "Remove local episodes" +msgstr "" + +msgctxt "#80050" +msgid "Downloading..." msgstr "" \ No newline at end of file diff --git a/resources/language/Italian/strings.po b/resources/language/Italian/strings.po index 90e15aed..4d226744 100644 --- a/resources/language/Italian/strings.po +++ b/resources/language/Italian/strings.po @@ -23,13 +23,17 @@ msgctxt "#20001" msgid "eng" msgstr "ita" +msgctxt "#30000" +msgid "View" +msgstr "Vista" + msgctxt "#30001" msgid "Check for updates" msgstr "Verifica aggiornamenti" msgctxt "#30002" -msgid "Enable adult mode" -msgstr "Abilita modalità adulti" +msgid "Enable touch view" +msgstr "Abilita vista touch" msgctxt "#30003" msgid "Enable debug logging" @@ -55,6 +59,10 @@ msgctxt "#30008" msgid "High" msgstr "Alta" +msgctxt "#30009" +msgid "Show only channels" +msgstr "Mostra solo canali" + msgctxt "#30010" msgid "Channel icons view" msgstr "Visualizzazione icone dei canali" @@ -76,8 +84,8 @@ msgid "Password" msgstr "Password" msgctxt "#30017" -msgid "Download path*" -msgstr "Percorso download*" +msgid "Download path" +msgstr "Percorso download" msgctxt "#30018" msgid "Download list path" @@ -108,8 +116,8 @@ msgid "Contextual menu" msgstr "Menu contestuale" msgctxt "#30025" -msgid "Show KoD settings" -msgstr "Mostra impostazioni KoD" +msgid "" +msgstr "" msgctxt "#30026" msgid "Direct" @@ -144,8 +152,8 @@ msgid "Internal Client" msgstr "Client Interno" msgctxt "#30034" -msgid ": Select the video, or 'Cancel' for all" -msgstr ": Seleziona il video o 'Annulla' per tutti" +msgid "Select the video, or 'Cancel' for all" +msgstr "Seleziona il video o 'Annulla' per tutti" msgctxt "#30035" msgid "ERROR in the Client" @@ -171,6 +179,10 @@ msgctxt "#30040" msgid "Do you really want to delete the %s file?" msgstr "Vuoi veramente eliminare il file %s?" +msgctxt "#30041" +msgid "Select a value" +msgstr "Seleziona un valore" + msgctxt "#30043" msgid "Force view mode" msgstr "Forza modalità di visualizzazione" @@ -204,8 +216,8 @@ msgid "Unsopported Server" msgstr "Server non supportato" msgctxt "#30067" -msgid "Path*" -msgstr "Percorso*" +msgid "Path" +msgstr "Percorso" msgctxt "#30068" msgid "Filter by servers" @@ -280,8 +292,8 @@ msgid "Documentaries" msgstr "Documentari" msgctxt "#30126" -msgid "Adult" -msgstr "Adulti" +msgid "" +msgstr "" msgctxt "#30130" msgid "News" @@ -476,16 +488,16 @@ msgid "Academy Awards" msgstr "Premi Oscar" msgctxt "#30998" -msgid "Shortcut" -msgstr "Scorciatoia" +msgid "Quick menu shortcut" +msgstr "Scorciatoia menu rapido" msgctxt "#30999" -msgid "Assign key to open shortcut" -msgstr "Assegna tasto scorciatoia" +msgid "Assign key" +msgstr "Assegna tasto" msgctxt "#31000" -msgid "Remove key to open shortcut" -msgstr "Rimuovi tasto scorciatoia" +msgid "Unassign key" +msgstr "Disassegna tasto" msgctxt "#50000" msgid "Sagas" @@ -708,12 +720,12 @@ msgid "Mark TV show as watched" msgstr "Segna serie TV come vista" msgctxt "#60022" -msgid "Automatically find new episodes: Disable" -msgstr "Trova automaticamente nuovi episodi: Disattiva" +msgid "Remove from video library update" +msgstr "Rimuovi da aggiornamento videoteca" msgctxt "#60023" -msgid "Automatically find new episodes: Enable" -msgstr "Trova automaticamente nuovi episodi: Attiva" +msgid "Add to video library update" +msgstr "Aggiungi ad aggiornamento videoteca" msgctxt "#60024" msgid "Delete TV show/channel" @@ -724,8 +736,8 @@ msgid "Delete TV show" msgstr "Elimina serie TV" msgctxt "#60026" -msgid "Search for new episodes and update" -msgstr "Cerca nuovi episodi e aggiorna" +msgid "KoD settings" +msgstr "Impostazioni KoD" msgctxt "#60027" msgid "Season %s" @@ -788,16 +800,16 @@ msgid "Delete TV show" msgstr "Elimina serie TV" msgctxt "#60042" -msgid "Delete links of %s" -msgstr "Elimina link di %s" +msgid "Delete channel %s" +msgstr "Elimina canale %s" msgctxt "#60043" msgid "Delete %s links of channel %s" msgstr "Cancellati %s collegamenti del canale %s" msgctxt "#60044" -msgid "Do you want really to delete '%s' from video library?" -msgstr "Vuoi davvero rimuovere '%s' dalla videoteca?" +msgid "Do you want really to delete "%s" from video library?" +msgstr "Vuoi davvero rimuovere "%s" dalla videoteca?" msgctxt "#60045" msgid "Sync with Trakt started" @@ -876,8 +888,8 @@ msgid "Added episode to the video library..." msgstr "Aggiunta episodio alla videoteca..." msgctxt "#60066" -msgid "An error has occurred. It has not been possible to add the movie "%s" to the video library" -msgstr "Si è verificato un errore. Non è stato possibile aggiungere il film "%s" alla videoteca" +msgid "An error has occurred. The movie "%s" has not been added to the video library" +msgstr "Si è verificato un errore. Il film "%s" non è stato aggiunto alla videoteca" msgctxt "#60067" msgid "An error has occurred. The TV show "%s" has not been added to the video library. It has not been possible to add any episode" @@ -888,7 +900,7 @@ msgid "An error has occurred. The TV show "%s" has not been added to the video l msgstr "Si è verificato un errore. La serie TV "%s" non è stata aggiunta alla videoteca" msgctxt "#60069" -msgid "An error has occurred. The TV show "%s" has not been added completely to the video library" +msgid "An error has occurred. The TV show "%s" has not been completely added to the video library" msgstr "Si è verificato un errore. La serie TV "%s" non è stata aggiunta completamente alla videoteca" msgctxt "#60070" @@ -896,8 +908,8 @@ msgid "The TV show "%s" has been added to the video library" msgstr "La serie TV "%s" è stata aggiunta alla videoteca" msgctxt "#60071" -msgid "Autoplay configuration" -msgstr "Configurazione Autoplay" +msgid "AutoPlay configuration" +msgstr "Configurazione AutoPlay" msgctxt "#60072" msgid "It seems that links of %s are not working." @@ -1372,8 +1384,8 @@ msgid "Find %s possible matches" msgstr "Trovate %s possibili corrispondenze" msgctxt "#60298" -msgid "[%s]: Select the correct TV show" -msgstr "[%s]: Seleziona la serie TV corretta" +msgid "%s - Select the correct TV show" +msgstr "%s - Seleziona la serie TV corretta" msgctxt "#60299" msgid "Not found in the language '%s'" @@ -1400,8 +1412,8 @@ msgid "The unzipped %s file already exists, or you want to overwrite it.?" msgstr "il file %s da decomprimere esiste già, vuoi sovrascriverlo?" msgctxt "#60305" -msgid "Adult channels" -msgstr "Canali per adulti" +msgid "" +msgstr "" msgctxt "#60306" msgid "The fields 'New password' and 'Confirm new password' do not match" @@ -1412,8 +1424,8 @@ msgid "Use 'Preferences' to change your password" msgstr "Entra in 'Preferenze' per cambiare la password" msgctxt "#60308" -msgid "Adult channels" -msgstr "Canali para adulti" +msgid "" +msgstr "" msgctxt "#60309" msgid "The password is not correct." @@ -1516,8 +1528,8 @@ msgid "Configuration" msgstr "Configurazione" msgctxt "#60334" -msgid "Password for adult channels" -msgstr "Password per i canali per adulti" +msgid "" +msgstr "" msgctxt "#60335" msgid "Watch in..." @@ -1556,16 +1568,16 @@ msgid "Information" msgstr "Informazione" msgctxt "#60349" -msgid "Go to the main menu" -msgstr "Andare al menu principale" +msgid "Previous menu" +msgstr "Menu precedente" msgctxt "#60350" msgid "Search in other channels" msgstr "Cerca negli altri canali" msgctxt "#60351" -msgid "Set as Homepage" -msgstr "Impostare come Homepage" +msgid "Set as main menu" +msgstr "Imposta come menu principale" msgctxt "#60352" msgid "Add TV show to video library" @@ -1680,8 +1692,8 @@ msgid "Summary:" msgstr "Riassunto:" msgctxt "#60389" -msgid "Updating %s [%s]..." -msgstr "Aggiornamento %s [%s]..." +msgid "Updating "%s" [%s]..." +msgstr "Aggiornamento "%s" [%s]..." msgctxt "#60390" msgid "AutoPlay configuration" @@ -2292,8 +2304,8 @@ msgid "Download settings" msgstr "Impostazioni download" msgctxt "#60542" -msgid "Video library settings" -msgstr "Impostazioni videoteca" +msgid "Configure video library" +msgstr "Configura videoteca" msgctxt "#60544" msgid "More Options" @@ -2384,8 +2396,8 @@ msgid "Restore video library (strm, nfo and json)" msgstr "Ripristina videoteca (strm, nfo e json)" msgctxt "#60568" -msgid "Search for new episodes and update video library" -msgstr "Cerca nuovi episodi ed aggiorna videoteca" +msgid "Update video library" +msgstr "Aggiorna videoteca" msgctxt "#60569" msgid " - There are no default settings" @@ -2420,7 +2432,7 @@ msgid "A saving error occurred" msgstr "Si è verificato un errore al salvataggio" msgctxt "#60581" -msgid "Restoring the video library" +msgid "Restoring video library" msgstr "Ripristino videoteca" msgctxt "#60582" @@ -2488,8 +2500,8 @@ msgid " Server #%s" msgstr " Server #%s" msgctxt "#60598" -msgid "Configuration of video library" -msgstr "Configurazione della videoteca" +msgid "Video library configuration" +msgstr "Configurazione videoteca" msgctxt "#60600" msgid "TV shows" @@ -2508,16 +2520,16 @@ msgid "When Kodi starts" msgstr "All'avvio di Kodi" msgctxt "#60604" -msgid "Once a day" -msgstr "Una volta al giorno" +msgid "Daily" +msgstr "Giornaliero" msgctxt "#60605" -msgid "At the start of Kodi and once a day" -msgstr "All'avvio di Kodi e una volta al giorno" +msgid "When Kodi starts and daily" +msgstr "All'avvio di Kodi e giornaliero" msgctxt "#60606" -msgid " Wait before updating at startup of Kodi" -msgstr " Attendere prima di aggiornare all'avvio di Kodi" +msgid " Update waiting time" +msgstr " Tempo di attesa aggiornamento" msgctxt "#60607" msgid "When Kodi starts" @@ -2540,12 +2552,12 @@ msgid "60 sec" msgstr "60 sec" msgctxt "#60613" -msgid " Begin scheduled update from" -msgstr " Inizia aggiornamento programmato a partire dalle" +msgid " Update time" +msgstr " Ora aggiornamento" msgctxt "#60614" -msgid " Search for new episodes in active TV shows" -msgstr " Cerca nuovi episodi nelle serie TV attive" +msgid " Search for new episodes" +msgstr " Cerca nuovi episodi" msgctxt "#60615" msgid "Never" @@ -2556,24 +2568,24 @@ msgid "Always" msgstr "Sempre" msgctxt "#60617" -msgid "According to new episodes" -msgstr "Secondo le uscite" +msgid "Based on airing" +msgstr "In base all'uscita" msgctxt "#60618" -msgid " Search for content in" -msgstr " Esegui ricerca dei contenuti in" +msgid " Kodi video library update" +msgstr " Aggiornamento libreria di Kodi" msgctxt "#60619" -msgid "The folder of each TV show" -msgstr "La cartella di ogni serie TV" +msgid "Each TV show" +msgstr "Per serie TV" msgctxt "#60620" msgid "All video library" msgstr "Tutta la videoteca" msgctxt "#60621" -msgid "Show links in" -msgstr "Mostra collegamenti in" +msgid "Links view" +msgstr "Visualizzazione collegamenti" msgctxt "#60622" msgid "Normal window" @@ -2628,8 +2640,8 @@ msgid "0 seg" msgstr "0 sec" msgctxt "#60637" -msgid "Synchronizing with Trakt" -msgstr "Sincronizzazione con Trakt" +msgid " Synchronizing with Trakt" +msgstr " Sincronizzazione con Trakt" msgctxt "#60638" msgid " After mark as watched the episode" @@ -2672,8 +2684,8 @@ msgid "Never" msgstr "Mai" msgctxt "#60650" -msgid "Video library information provider" -msgstr "Provider informazioni videoteca" +msgid " Video library information providers" +msgstr " Provider informazioni videoteca" msgctxt "#60651" msgid " Movies" @@ -2817,11 +2829,11 @@ msgstr "OK" msgctxt "#70002" msgid "Cancel" -msgstr "Annullare" +msgstr "Annulla" msgctxt "#70003" msgid "Default" -msgstr "Default" +msgstr "Predefinito" msgctxt "#70004" msgid "Loading..." @@ -3116,16 +3128,16 @@ msgid "Most Viewed" msgstr "Più Viste" msgctxt "#70078" -msgid "Show only links of " -msgstr "Mostra solo link di " +msgid "Show links of " +msgstr "Mostra link di " msgctxt "#70079" -msgid "Delete only the links of " -msgstr "Elimina solo i link di " +msgid "Delete channel " +msgstr "Elimina canale " msgctxt "#70081" -msgid "The folder also contains local or downloaded video files. Do you want to delete them?" -msgstr "La cartella contiene anche file video locali o scaricati. Vuoi eliminarli?" +msgid "The folder "%s" contains other files. Delete it anyway?" +msgstr "La cartella "%s" contiene altri file. Eliminarla comunque?" msgctxt "#70082" msgid "Global Search" @@ -3144,16 +3156,16 @@ msgid "Delete TV show" msgstr "Elimina serie TV" msgctxt "#70086" -msgid "Delete only the links of %s" -msgstr "Elimina solo i link di %s" +msgid "Delete channel %s" +msgstr "Elimina canale %s" msgctxt "#70087" msgid "Deleted %s links from canal %s" msgstr "Eliminati %s link del canale %s" msgctxt "#70088" -msgid "Are you sure you want to delete '%s' from video library?" -msgstr "Vuoi davvero eliminare '%s' dalla videoteca?" +msgid "Are you sure you want to delete "%s" from video library?" +msgstr "Vuoi davvero eliminare "%s" dalla videoteca?" msgctxt "#70089" msgid "Show only links of %s" @@ -3256,8 +3268,8 @@ msgid "Only until Kodi restarts" msgstr "Fino al riavvio di Kodi" msgctxt "#70115" -msgid "Request password to open adult channels" -msgstr "Richiedi password per aprire canali per adulti" +msgid "" +msgstr "" msgctxt "#70116" msgid "New password" @@ -3268,16 +3280,16 @@ msgid "Confirm new password" msgstr "Conferma nuova password" msgctxt "#70118" -msgid "TV shows folder*" -msgstr "Cartella serie TV*" +msgid "TV shows folder" +msgstr "Cartella serie TV" msgctxt "#70119" -msgid "Movies folder*" -msgstr "Cartella film*" +msgid "Movies folder" +msgstr "Cartella film" msgctxt "#70120" -msgid "Add KoD contents to Kodi video library*" -msgstr "Aggiungi la videoteca di KoD alla libreria di Kodi*" +msgid "Add KoD contents to Kodi video library" +msgstr "Aggiungi la videoteca di KoD alla libreria di Kodi" msgctxt "#70121" msgid "Activate" @@ -3304,8 +3316,8 @@ msgid "Customization" msgstr "Personalizzazione" msgctxt "#70128" -msgid "Infoplus Animation" -msgstr "Animazione Infoplus" +msgid "InfoPlus animation" +msgstr "Animazione InfoPlus" msgctxt "#70129" msgid "Without animation" @@ -3396,16 +3408,16 @@ msgid "Contextual menu" msgstr "Menu contestuale" msgctxt "#70151" -msgid "Show Infoplus" -msgstr "Mostra Infoplus" +msgid "Show InfoPlus" +msgstr "Mostra InfoPlus" msgctxt "#70152" msgid "Show ExtendedInfo" msgstr "Mostra ExtendedInfo" msgctxt "#70153" -msgid "Shortcut" -msgstr "Scorciatoia" +msgid "" +msgstr "" msgctxt "#70154" msgid "TMDB search" @@ -3852,12 +3864,16 @@ msgid "The data entered is not correct!" msgstr "I dati introdotti non sono corretti!" msgctxt "#70266" -msgid "The search for% s did not match." -msgstr "La ricerca di %s non ha dato risultati." +msgid "The search for %s did not match" +msgstr "La ricerca di %s non ha dato risultati" + +msgctxt "#70268" +msgid "The TV show "%s" is ended or has been canceled. Would you like to remove it from the video library update?" +msgstr "La serie TV "%s" è terminata o è stata cancellata. Vuoi rimuoverla dall'aggiornamento della videoteca?" msgctxt "#70269" -msgid "Search new episodes now" -msgstr "Cerca nuovi episodi adesso" +msgid "Search new episodes" +msgstr "Cerca nuovi episodi" msgctxt "#70270" msgid "Movies video library" @@ -3928,8 +3944,8 @@ msgid "Configure search" msgstr "Configura ricerca" msgctxt "#70287" -msgid "Configure video library" -msgstr "Configura videoteca" +msgid "Video library settings" +msgstr "Impostazioni videoteca" msgctxt "#70288" msgid "Configure downloads" @@ -5656,8 +5672,8 @@ msgid "Dear user, you seem to have problems with ADSL! We suggest you call your msgstr "Gentile Utente, sembra tu abbia problemi con l'ADSL! Controlla quanto meno che il modem/router sia acceso e/o il tuo dispositivo connesso.\nKoD NON TROVERA NIENTE finchè non risolverai il problema." msgctxt "#70722" -msgid "Dear User, your current DNS do not allow you to reach all sites, ergo, not all Channels will work, we recommend you, to take advantage of more, to set up the DNS.\nSearch your favorite search engine for\n 1. guides on how to choose a free DNS.\n 2. set it up on your device.\nWe recommend the cloudflare DNS 1.1.1.1 and 1.0.0.1\nAlternatively the Google DNS 8.8.8.8 and 8.8.4.4.\nIf you have a VODAFONE station, enter the modem panel and disable 'Secure DNS' before proceeding.\n" -msgstr "Gentile Utente, i tuoi DNS attuali non ti permettono di raggiungere tutti i siti, ergo, non tutti i Canali funzioneranno, ti consigliamo, per usufruirne di un maggior numero, di impostare i DNS.\nCerca sul tuo motore di ricerca preferito guide su come\n1. scegliere un DNS libero.\n2. impostarlo sul tuo dispositivo.\nNoi ti consigliamo i DNS di cloudflare 1.1.1.1 e 1.0.0.1\nIn alternativa i DNS di Google 8.8.8.8 e 8.8.4.4.\nSe hai una VODAFONE station, entra nel pannello del modem e disattiva la voce 'DNS sicuro' prima di procedere. E Ricordati 'Applica' in fondo alla pagina per salvare le impostazioni...\n" +msgid "Dear User, you have disabled the DNS override and your current DNS do not allow you to reach all sites, ergo, not all Channels will work, we recommend you, to take advantage of more, to set up the DNS or re-enable the override in settings.\nSearch your favorite search engine for\n 1. guides on how to choose a free DNS.\n 2. set it up on your device.\nWe recommend the cloudflare DNS 1.1.1.1 and 1.0.0.1\nAlternatively the Google DNS 8.8.8.8 and 8.8.4.4.\nIf you have a VODAFONE station, enter the modem panel and disable 'Secure DNS' before proceeding.\n" +msgstr "Gentile Utente, hai disattivato l'override DNS ed i tuoi DNS attuali non ti permettono di raggiungere tutti i siti, ergo, non tutti i Canali funzioneranno, ti consigliamo, per usufruirne di un maggior numero, di impostare i DNS oppure di riattivare l'override dalle impostazioni.\nCerca sul tuo motore di ricerca preferito guide su come\n1. scegliere un DNS libero.\n2. impostarlo sul tuo dispositivo.\nNoi ti consigliamo i DNS di cloudflare 1.1.1.1 e 1.0.0.1\nIn alternativa i DNS di Google 8.8.8.8 e 8.8.4.4.\nSe hai una VODAFONE station, entra nel pannello del modem e disattiva la voce 'DNS sicuro' prima di procedere. E Ricordati 'Applica' in fondo alla pagina per salvare le impostazioni...\n" msgctxt "#70723" msgid "links in the folder" @@ -5924,8 +5940,8 @@ msgid "Logging" msgstr "Logging" msgctxt "#70789" -msgid "* Change by opening the settings from KoD main menu" -msgstr "* Cambia aprendo le impostazioni dal menu principale di KoD" +msgid "" +msgstr "" msgctxt "#70790" msgid "RAR download in progress" @@ -5987,6 +6003,14 @@ msgctxt "#70804" msgid "Next extraction..." msgstr "Estrazione successiva..." +msgctxt "#70805" +msgid "Stay in seed" +msgstr "Resta in seed" + +msgctxt "#70806" +msgid "Changing this parameter permanently overwrites the Elementum settings.\nDo you want to continue?" +msgstr "Modificando questo parametro vengono sovrascritte permanentemente le impostazioni di Elementum.\nVuoi continuare?" + # DNS start [ settings and declaration ] msgctxt "#707401" msgid "Enable DNS check alert" @@ -6213,16 +6237,16 @@ msgid "Folder name for TV shows" msgstr "Nome della cartella per le serie TV" msgctxt "#80022" -msgid "You can configure the Kodi video library later from the settings menu inside KoD" -msgstr "Potrai configurare la libreria di Kodi in seguito dal menu impostazioni all'interno di KoD" +msgid "You can configure the Kodi video library later from KoD settings" +msgstr "Potrai configurare la libreria di Kodi in seguito dalle impostazioni di KoD" msgctxt "#80023" msgid "You will be asked to choose and configure the information providers for movies and TV shows" msgstr "Ti verrà chiesto di scegliere e configurare i provider delle informazioni per film e serie TV" msgctxt "#80024" -msgid "An error has occurred during the configuration of the Kodi video library. Please check the log and try again from the settings menu inside KoD" -msgstr "Si è verificato un errore durante la configurazione della libreria di Kodi. Si prega di controllare il log e riprovare dal menu impostazioni all'interno di KoD" +msgid "An error has occurred during the configuration of the Kodi video library. Please check the log and try again from KoD settings" +msgstr "Si è verificato un errore durante la configurazione della libreria di Kodi. Si prega di controllare il log e riprovare dalle impostazioni di KoD" msgctxt "#80025" msgid "Cleaning database..." @@ -6241,8 +6265,8 @@ msgid "The selected folders are already used by the Kodi library. Please change msgstr "Le cartelle selezionate sono già utilizzate dalla libreria di Kodi. Si prega di cambiarle opportunamente" msgctxt "#80029" -msgid "The selected folders are already used by the Kodi library. Please change them properly from the settings menu inside KoD" -msgstr "Le cartelle selezionate sono già utilizzate dalla libreria di Kodi. Si prega di cambiarle opportunamente dal menu impostazioni all'interno di KoD" +msgid "The selected folders are already used by the Kodi library. Please change them properly from KoD settings" +msgstr "Le cartelle selezionate sono già utilizzate dalla libreria di Kodi. Si prega di cambiarle opportunamente dalle impostazioni di KoD" msgctxt "#80030" msgid "The default path and folders will be used. You will be asked to choose and configure the information providers for movies and TV shows" @@ -6253,8 +6277,8 @@ msgid "Unable to connect to github. This is probably due to a lack of connection msgstr "Impossibile connettersi a github. Questo è probabilmente dovuto ad una mancanza di connessione oppure github è attualmente offline. Per favore verifica e riprova" msgctxt "#80032" -msgid "Installation in progress..." -msgstr "Installazione in corso..." +msgid "Installing..." +msgstr "Installazione..." msgctxt "#80033" msgid "Choose the version of KoD to install" @@ -6290,4 +6314,40 @@ msgstr "Add-on aggiornato al commit %s" msgctxt "#80041" msgid "Latest updates:\n" -msgstr "Ultimi aggiornamenti:\n" \ No newline at end of file +msgstr "Ultimi aggiornamenti:\n" + +msgctxt "#80042" +msgid "Include local episodes when adding a TV shows" +msgstr "Includere episodi in locale all'aggiunta di una serie TV" + +msgctxt "#80043" +msgid "Attention, in order to watch local episodes you have to configure the Kodi video library from KoD settings" +msgstr "Attenzione, per guardare gli episodi in locale devi configurare la libreria di Kodi dalle impostazioni di KoD" + +msgctxt "#80044" +msgid "Do you want to include local episodes for the TV show "%s"?" +msgstr "Vuoi includere degli episodi in locale per la serie TV "%s"?" + +msgctxt "#80045" +msgid "The folder of the local episodes has to be different from the TV show one in the KoD video library" +msgstr "La cartella degli episodi in locale deve essere diversa da quella della serie TV nella videoteca di KoD" + +msgctxt "#80046" +msgid "Select the folder containing the local episodes" +msgstr "Seleziona la cartella contenente gli episodi in locale" + +msgctxt "#80047" +msgid "The TV show "% s" includes local episodes. They will be only removed from the Kodi video library without being deleted" +msgstr "La serie TV "%s" include degli episodi in locale. Verranno solo rimossi dalla libreria di Kodi senza essere cancellati" + +msgctxt "#80048" +msgid "Add local episodes" +msgstr "Aggiungi episodi in locale" + +msgctxt "#80049" +msgid "Remove local episodes" +msgstr "Rimuovi episodi in locale" + +msgctxt "#80050" +msgid "Downloading..." +msgstr "Download in corso..." \ No newline at end of file diff --git a/resources/settings.xml b/resources/settings.xml index 3ef50d2c..68732e9c 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -6,10 +6,11 @@ <setting id="autostart" type="action" label="70706" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAiYXV0b3N0YXJ0IiwNCiAgICAiY2hhbm5lbCI6ICJzZXR0aW5nIg0KfQ==)" default="Off"/> <setting label="70579" type="lsep"/> <setting id="addon_update_enabled" type="bool" label="70581" default="true"/> - <setting id="addon_update_message" type="bool" label="70582" default="true"/> - <setting id="addon_update_timer" type="slider" option="int" range="1,1,24" label="707416" default="1"/> + <setting id="addon_update_message" type="bool" label="70582" visible="eq(-1,true)" default="true"/> + <setting id="addon_update_timer" type="slider" option="int" range="1,1,24" label="707416" visible="eq(-2,true)" default="1"/> <setting label="70787" type="lsep"/> <setting id="resolver_dns" type="bool" label="707408" default="true" enable="true" visible="true"/> + <setting id="checkdns" type="bool" default="true" visible="false"/> <setting label="70788" type="lsep"/> <setting id="debug" type="bool" label="30003" default="false"/> </category> @@ -32,7 +33,6 @@ <setting id="folder_tvshows" type="text" label="70118" default="Serie TV"/> <setting id="folder_movies" type="text" label="70119" default="Film"/> <setting id="videolibrary_kodi" type="bool" label="70120" default="false"/> - <setting id="settings_kod" type="action" label="70789" action=""/> <setting label="59997" type="lsep"/> <setting id="videolibrary_max_quality" type="bool" label="70729" default="false" visible="true"/> <setting id="next_ep" type="select" label="70746" lvalues="70752|70747|70748" default="0"/> @@ -41,11 +41,11 @@ <setting id="trakt_sync" type="bool" label="70109" default="false"/> <setting label="30030" type="lsep"/> <setting id="vidolibrary_preferences" type="action" label="60542" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAiY2hhbm5lbF9jb25maWciLA0KICAgICJjaGFubmVsIjogInZpZGVvbGlicmFyeSINCn0==)"/> + <setting id="vidolibrary_update" type="action" label="60568" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAidXBkYXRlX3ZpZGVvbGlicmFyeSIsDQogICAgImNoYW5uZWwiOiAidmlkZW9saWJyYXJ5Ig0KfQ==)"/> <setting id="vidolibrary_export" type="action" label="80000" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAiZXhwb3J0X3ZpZGVvbGlicmFyeSIsDQogICAgImNoYW5uZWwiOiAiYmFja3VwIg0KfQ==)"/> <setting id="vidolibrary_import" type="action" label="80001" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAiaW1wb3J0X3ZpZGVvbGlicmFyeSIsDQogICAgImNoYW5uZWwiOiAiYmFja3VwIg0KfQ==)"/> <setting id="vidolibrary_delete" type="action" label="80036" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAiZGVsZXRlX3ZpZGVvbGlicmFyeSIsDQogICAgImNoYW5uZWwiOiAidmlkZW9saWJyYXJ5Ig0KfQ==)"/> <setting id="vidolibrary_restore" type="action" label="60567" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAicmVzdG9yZV90b29scyIsDQogICAgImNoYW5uZWwiOiAic2V0dGluZyINCn0=)"/> - <setting id="vidolibrary_update" type="action" label="60568" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAidXBkYXRlX3ZpZGVvbGlicmFyeSIsDQogICAgImNoYW5uZWwiOiAidmlkZW9saWJyYXJ5Ig0KfQ==)"/> </category> <!-- Channels --> @@ -68,8 +68,9 @@ <setting id="servers_config" type="action" label="60538" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAic2VydmVyc19tZW51IiwNCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiDQp9==)"/> <setting id="debriders_config" type="action" label="60552" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAic2VydmVyc19tZW51IiwNCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiLA0KCSJ0eXBlIjogImRlYnJpZGVycyINCn0==)"/> <setting label="70578" type="lsep"/> - <setting id="torrent_config" type="action" label="70253" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiJzZXR0aW5nX3RvcnJlbnQiLA0KICAgICJjaGFubmVsIjoic2V0dGluZyINCn0=)"/> - <setting id="quasar_install" type="action" label="70785" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiJkb3dubG9hZCIsDQogICAgImNoYW5uZWwiOiJxdWFzYXJfZG93bmxvYWQiDQp9)"/> + <!-- <setting id="torrent_config" type="action" label="70253" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiJzZXR0aW5nX3RvcnJlbnQiLA0KICAgICJjaGFubmVsIjoic2V0dGluZyINCn0=)"/> --> + <setting id="elementum_on_seed" type="bool" label="70805" default="false"/> + <setting id="elementum_install" type="action" label="70785" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiJkb3dubG9hZCIsDQogICAgImNoYW5uZWwiOiJlbGVtZW50dW1fZG93bmxvYWQiDQp9)"/> </category> <!-- Search --> @@ -94,15 +95,14 @@ <category label="30153"> <setting id="downloadenabled" type="bool" label="70689" default="false"/> <setting id="downloadpath" type="folder" label="30017" visible="eq(-1,true)" default="special://profile/addon_data/plugin.video.kod/downloads/" option="writeable"/> - <setting id="settings_kod1" type="action" label="70789" action="" visible="eq(-2,true)"/> - <setting id="downloadlistpath" type="folder" label="30018" visible="eq(-3,true)" default="special://profile/addon_data/plugin.video.kod/downloads/list/" option="writeable"/> <!-- <setting id="library_add" type="bool" label="70230" default="false"/> <setting id="library_move" type="bool" label="70231" default="false" visible="eq(-1,true)" subsetting="true"/> --> - <setting id="library_move" type="bool" label="70231" visible="eq(-4,true)" default="true"/> - <setting id="browser" type="bool" label="70232" visible="eq(-5,true)" default="true"/> - <setting id="server_speed" type="bool" label="70242" visible="eq(-6,true)" default="true"/> - <setting id="quality" type="select" label="70240" lvalues="70241|70763|70764|70765" visible="eq(-7,true)" default="0"/> - <setting id="download_adv" type="action" label="30030" visible="eq(-8,true)" action="RunPlugin(plugin://plugin.video.kod/?ew0KCSJhY3Rpb24iOiJjaGFubmVsX2NvbmZpZyIsDQoJImNvbmZpZyI6ImRvd25sb2FkcyIsDQogICAgImNoYW5uZWwiOiJzZXR0aW5nIg0KfQ==)"/> + <setting id="downloadlistpath" type="folder" label="30018" visible="eq(-2,true)" default="special://profile/addon_data/plugin.video.kod/downloads/list/" option="writeable"/> + <setting id="library_move" type="bool" label="70231" visible="eq(-3,true)" default="true"/> + <setting id="browser" type="bool" label="70232" visible="eq(-4,true)" default="true"/> + <setting id="server_speed" type="bool" label="70242" visible="eq(-5,true)" default="true"/> + <setting id="quality" type="select" label="70240" lvalues="70241|70763|70764|70765" visible="eq(-6,true)" default="0"/> + <setting id="download_adv" type="action" label="30030" visible="eq(-7,true)" action="RunPlugin(plugin://plugin.video.kod/?ew0KCSJhY3Rpb24iOiJjaGFubmVsX2NvbmZpZyIsDQoJImNvbmZpZyI6ImRvd25sb2FkcyIsDQogICAgImNoYW5uZWwiOiJzZXR0aW5nIg0KfQ==)"/> </category> <!-- News --> @@ -126,26 +126,27 @@ <setting id="enable_link_menu" label="70527" type="bool" default="true"/> <setting id="enable_fav_menu" label="30102" type="bool" default="true"/> <setting id="enable_library_menu" label="30131" type="bool" default="true"/> - <!-- View Mode--> - <setting label="70754" type="lsep"/> + <setting label="30000" type="lsep"/> + <setting id="touch_view" label='30002' type="bool" default="false"/> + <!-- View Mode (hidden)--> <setting id="skin_name" label='Skin Name' type="text" default="skin.estuary" visible="false"/> - <setting id="view_mode_addon" type="action" label="70009" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiJ2aWV3X21vZGUiLA0KICAgICJjaGFubmVsIjoic2hvcnRjdXRzIiwNCgkidHlwZSI6ImFkZG9uIg0KfQ==)" default= "Default, 0"/> - <setting id="view_mode_channel" type="action" label="30118" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiJ2aWV3X21vZGUiLA0KICAgICJjaGFubmVsIjoic2hvcnRjdXRzIiwNCgkidHlwZSI6ImNoYW5uZWwiDQp9)" default= "Default, 0"/> - <setting id="view_mode_movie" type="action" label="30122" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiJ2aWV3X21vZGUiLA0KICAgICJjaGFubmVsIjoic2hvcnRjdXRzIiwNCgkidHlwZSI6Im1vdmllIg0KfQ==)" default= "Default, 0"/> - <setting id="view_mode_tvshow" type="action" label="30123" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiJ2aWV3X21vZGUiLA0KICAgICJjaGFubmVsIjoic2hvcnRjdXRzIiwNCgkidHlwZSI6InR2c2hvdyINCn0=)" default= "Default, 0"/> - <setting id="view_mode_season" type="action" label="30140" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiJ2aWV3X21vZGUiLA0KICAgICJjaGFubmVsIjoic2hvcnRjdXRzIiwNCgkidHlwZSI6InNlYXNvbiINCn0=)" default= "Default, 0"/> - <setting id="view_mode_episode" type="action" label="70362" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiJ2aWV3X21vZGUiLA0KICAgICJjaGFubmVsIjoic2hvcnRjdXRzIiwNCgkidHlwZSI6ImVwaXNvZGUiDQp9)" default= "Default, 0"/> - <setting id="view_mode_server" type="action" label="70145" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiJ2aWV3X21vZGUiLA0KICAgICJjaGFubmVsIjoic2hvcnRjdXRzIiwNCgkidHlwZSI6InNlcnZlciINCn0=)" default= "Default, 0"/> + <setting id="view_mode_addon" type="action" label="70009" default= "Default, 0" visible="false"/> + <setting id="view_mode_channel" type="action" label="30118" default= "Default, 0" visible="false"/> + <setting id="view_mode_movie" type="action" label="30122" default= "Default, 0" visible="false"/> + <setting id="view_mode_tvshow" type="action" label="30123" default= "Default, 0" visible="false"/> + <setting id="view_mode_season" type="action" label="30140" default= "Default, 0" visible="false"/> + <setting id="view_mode_episode" type="action" label="70362" default= "Default, 0" visible="false"/> + <setting id="view_mode_server" type="action" label="70145" default= "Default, 0" visible="false"/> <!-- Contextual --> <setting label="30024" type="lsep"/> <setting id="quick_menu" type="bool" label="60360" default="true"/> <setting id="side_menu" type="bool" label="70737" default="false"/> - <setting id="kod_menu" type="bool" label="30025" default="true"/> + <setting id="kod_menu" type="bool" label="60026" default="true"/> <setting id="infoplus" type="bool" label="70151" default="false"/> <setting id="infoplus_set" type="bool" label="70128" visible="eq(-1,true)" default="false" subsetting="true"/> <setting id="extended_info" type="bool" label="70152" default="false"/> <!-- Shortcut --> - <setting label="70153" type="lsep"/> + <setting label="30998" type="lsep"/> <setting id="shortcut_key" type="action" label="30999" action="RunPlugin(plugin://plugin.video.kod/?ew0KICAgICJhY3Rpb24iOiAia2V5bWFwIg0KfQ==)"/> <setting id="delete_key" type="action" label="31000" action="RunPlugin(plugin://plugin.video.kod/?ewogICAgImFjdGlvbiI6ICJkZWxldGVfa2V5Igp9==)"/> <!-- Custom Start --> @@ -158,18 +159,9 @@ <!-- Others --> <setting label="70149" type="lsep"/> <setting id="icon_set" type="select" label="70108" values="default|light|dark|alfa|mike" default="default"/> + <setting id="only_channel_icons" type="bool" label="30009" default="false"/> <setting id="enable_custom_theme" type="bool" label="70564" default="false"/> <setting id="custom_theme" type="folder" label="70565" default="" visible="eq(-1,true)"/> <setting id="video_thumbnail_type" type="select" label="70131" lvalues="70132|70133" default="1"/> </category> - - <!-- Adult --> - <category label="60305"> - <setting id="adult_aux_intro_password" type="text" label="70113" option="hidden" default=""/> - <setting id="adult_mode" type="select" lvalues="60602|60616|70114" label="30002" enable="!eq(-1,)" default="0"/> - <setting id="adult_request_password" type="bool" label="70115" enable="!eq(-1,0)+!eq(-2,)" default="true"/> - <setting id="adult_aux_new_password1" type="text" label="70116" option="hidden" enable="!eq(-3,)" default=""/> - <setting id="adult_aux_new_password2" type="text" label="70117" option="hidden" enable="!eq(-1,)" default=""/> - </category> - </settings> diff --git a/resources/skins/Default/720p/ChannelSettings.xml b/resources/skins/Default/720p/ChannelSettings.xml index 82c3fb67..e1e5c565 100644 --- a/resources/skins/Default/720p/ChannelSettings.xml +++ b/resources/skins/Default/720p/ChannelSettings.xml @@ -2,113 +2,128 @@ <window> <allowoverlays>false</allowoverlays> <animation type="WindowOpen" reversible="false"> - <effect type="zoom" start="80" end="100" center="640,225" delay="160" tween="back" time="240" /> + <effect type="slide" start="0,200" end="0,0" center="640,225" delay="160" tween="cubic" time="200" /> <effect type="fade" delay="160" end="100" time="240" /> </animation> <animation type="WindowClose" reversible="false"> - <effect type="zoom" start="100" end="80" center="640,225" easing="in" tween="back" time="240" /> + <effect type="slide" start="0,0" end="0,200" center="640,225" easing="in" tween="cubic" time="200" /> <effect type="fade" start="100" end="0" time="240" /> </animation> <controls> + <!-- Background --> <control type="group" id="10001"> - <posx>240</posx> - <posy>110</posy> - <width>800</width> - <height>500</height> + <left>0</left> + <top>0</top> + <width>100%</width> + <height>100%</height> <control type="image"> - <width>800</width> - <height>500</height> - <texture>Shortcut/dialog-bg-solid.png</texture> + <width>100%</width> + <height>100%</height> + <texture colordiffuse="FF232323">Shortcut/white.png</texture> </control> + <!-- Divider --> + <control type="image"> + <top>80</top> + <right>0</right> + <width>100%</width> + <height>1</height> + <texture colordiffuse="33FFFFFF">Shortcut/white.png</texture> + </control> + <!-- Header --> <control type="label" id="10002"> - <posy>15</posy> - <posx>50</posx> - <height>34</height> - <width>725</width> - <font>font12_title</font> + <top>20</top> + <left>70</left> + <height>40</height> + <width>80%</width> + <font>font30_title</font> <textcolor>FFFFFFFF</textcolor> - <align>center</align> + <align>left</align> <aligny>center</aligny> <label>$ADDON[plugin.video.kod 70000]</label> </control> + <!-- CLOSE BUTTON --> <control type="button" id="10003"> - <posx>745</posx> - <posy>25</posy> - <width>20</width> - <height>20</height> - <texturefocus>Controls/DialogCloseButton-focus.png</texturefocus> - <texturenofocus>Controls/DialogCloseButton.png</texturenofocus> + <right>30</right> + <top>25</top> + <width>30</width> + <height>30</height> + <texturefocus colordiffuse="FFFFFFFF">Controls/DialogCloseButton-focus.png</texturefocus> + <texturenofocus colordiffuse="55FFFFFF">Controls/DialogCloseButton-focus.png</texturenofocus> </control> + <!-- OK --> <control type="button" id="10004"> - <posx>40</posx> - <posy>410</posy> + <left>60</left> + <top>120</top> <width>200</width> - <height>50</height> + <height>60</height> <textwidth>110</textwidth> <textcolor>FFFFFFFF</textcolor> - <texturefocus>Controls/KeyboardKey.png</texturefocus> - <texturenofocus>Controls/KeyboardKeyNF.png</texturenofocus> + <texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus> + <texturenofocus colordiffuse="FF191919">Shortcut/white.png</texturenofocus> <align>center</align> - <aligny>center</aligny> + <aligny>center</aligny> <label>$ADDON[plugin.video.kod 70001]</label> </control> + <!-- CANCEL --> <control type="button" id="10005"> - <posx>300</posx> - <posy>410</posy> + <left>60</left> + <top>190</top> <width>200</width> - <height>50</height> + <height>60</height> <textwidth>110</textwidth> <textcolor>FFFFFFFF</textcolor> - <texturefocus>Controls/KeyboardKey.png</texturefocus> - <texturenofocus>Controls/KeyboardKeyNF.png</texturenofocus> + <texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus> + <texturenofocus colordiffuse="FF191919">Shortcut/white.png</texturenofocus> <align>center</align> - <aligny>center</aligny> + <aligny>center</aligny> <label>$ADDON[plugin.video.kod 70002]</label> </control> + <!-- DEFAULT --> <control type="button" id="10006"> - <posx>560</posx> - <posy>410</posy> + <left>60</left> + <top>260</top> <width>200</width> - <height>50</height> + <height>60</height> <textwidth>110</textwidth> <textcolor>FFFFFFFF</textcolor> - <texturefocus>Controls/KeyboardKey.png</texturefocus> - <texturenofocus>Controls/KeyboardKeyNF.png</texturenofocus> + <texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus> + <texturenofocus colordiffuse="FF191919">Shortcut/white.png</texturenofocus> <align>center</align> <aligny>center</aligny> <label>$ADDON[plugin.video.kod 70003]</label> </control> - <control type="group" id="10007"> - <posy>80</posy> - <posx>20</posx> - <width>745</width> - <height>387</height> + <!-- Parameters --> + <control type="group" id="10007"> + <top>120</top> + <left>300</left> + <width>900</width> + <height>680</height> <control type="label" id="100010"> - <posy>30</posy> - <posx>0</posx> - <width>745</width> - <height>300</height> - <font>font16</font> + <top>0</top> + <left>0</left> + <width>900</width> + <height>680</height> + <font>font20</font> <textcolor>FFFFFFFF</textcolor> <align>center</align> <aligny>center</aligny> <label>$ADDON[plugin.video.kod 70004]</label> </control> </control> + <!-- Scrollbar --> <control type="image" id="10008"> - <posy>80</posy> - <posx>780</posx> + <top>120</top> + <right>0</right> <width>10</width> - <height>300</height> - <textcolor>FFFFFFFF</textcolor> - <texture>Controls/ScrollBack.png</texture> + <height>540</height> + <texture border="2" colordiffuse="FF232323">Shortcut/white.png</texture> </control> <control type="image" id="10009"> - <posy>80</posy> - <posx>780</posx> + <top>120</top> + <right>0</right> <width>10</width> - <height>300</height> - <texture>Controls/ScrollBar.png</texture> + <height>540</height> + <texture border="2" colordiffuse="33FFFFFF">Shortcut/white.png</texture> </control> </control> </controls> diff --git a/resources/skins/Default/720p/DarkShortCutMenu.xml b/resources/skins/Default/720p/DarkShortCutMenu.xml index fb98c257..9ba71b24 100644 --- a/resources/skins/Default/720p/DarkShortCutMenu.xml +++ b/resources/skins/Default/720p/DarkShortCutMenu.xml @@ -7,12 +7,10 @@ </coordinates> <defaultcontrol always="true">32500</defaultcontrol> <animation type="WindowOpen" reversible="false"> - <effect type="zoom" start="80" end="100" center="440,110" delay="160" tween="back" time="240" /> - <effect type="fade" delay="160" end="100" time="240" /> + <effect type="fade" delay="160" end="100" time="220" /> </animation> <animation type="WindowClose" reversible="false"> - <effect type="zoom" start="100" end="80" center="440,110" easing="in" tween="back" time="240" /> - <effect type="fade" start="100" end="0" time="240" /> + <effect type="fade" delay="160" start="100" end="0" time="200" /> </animation> <controls> <control type="button"> @@ -24,14 +22,22 @@ <texturenofocus colordiffuse="88FFFFFF">Shortcut/white.png</texturenofocus> <onclick>Action(close)</onclick> </control> - <control type="image"> - <left>0</left> - <top>0</top> - <width>880</width> - <height>220</height> - <texture border="2" colordiffuse="FFEEEEEE">Shortcut/white.png</texture> - </control> <control type="group"> + <animation type="WindowOpen" reversible="false"> + <effect type="slide" start="0,100" end="0,0" center="640,225" delay="160" tween="cubic" time="200" /> + <effect type="fade" delay="160" end="100" time="220" /> + </animation> + <animation type="WindowClose" reversible="false"> + <effect type="slide" start="0,0" end="0,-100" center="640,225" delay="160" tween="cubic" time="200" /> + <effect type="fade" delay="160" start="100" end="0" time="200" /> + </animation> + <control type="image"> + <left>0</left> + <top>0</top> + <width>880</width> + <height>220</height> + <texture border="2" colordiffuse="FFEEEEEE">Shortcut/white.png</texture> + </control> <control type="group"> <control type="image"> <left>-21</left> @@ -53,7 +59,6 @@ <animation effect="slide" start="0,0" end="10,0" time="0" condition="true">Conditional</animation> <animation effect="slide" end="120,0" time="0" condition="!Control.IsVisible(5)">Conditional</animation> <itemlayout height="220" width="220"> - <!-- <top>2</top> --> <control type="image"> <top>0</top> <left>0</left> @@ -69,11 +74,9 @@ <texture colordiffuse="60FFFFFF">Shortcut/black.png</texture> </control> <control type="image"> - <left>35</left> - <top>35</top> - <width>150</width> - <height>150</height> - <texture>$INFO[ListItem.Property(thumb)]</texture> + <width>220</width> + <height>220</height> + <texture>$INFO[ListItem.Property(thumbnail)]</texture> <aspectratio>keep</aspectratio> <align>center</align> </control> @@ -97,8 +100,9 @@ <animation effect="fade" start="100" end="0" time="0">Focus</animation> </control> <control type="image"> + <top>1</top> <width>220</width> - <height>220</height> + <height>218</height> <texture colordiffuse="FF0082C2">Shortcut/button-fo.png</texture> <animation effect="fade" start="100" end="0" time="0">Unfocus</animation> </control> @@ -118,24 +122,32 @@ <texture colordiffuse="60FFFFFF">Shortcut/black.png</texture> </control> <control type="image"> - <left>35</left> - <top>35</top> - <width>150</width> - <height>150</height> - <texture>$INFO[ListItem.Property(thumb)]</texture> + <width>220</width> + <height>220</height> + <texture>$INFO[ListItem.Property(thumbnail)]</texture> <aspectratio>keep</aspectratio> <align>center</align> </control> <control type="textbox"> <left>0</left> - <top>146</top> + <top>160</top> <width>220</width> <height>74</height> <font>font12</font> + <textcolor>FF232323</textcolor> <label>$INFO[ListItem.Label]</label> <align>center</align> <aligny>center</aligny> </control> + <control type="image"> + <left>100</left> + <top>5</top> + <width>20</width> + <height>20</height> + <texture colordiffuse="FF232323">$INFO[ListItem.Property(sub)]</texture> + <aspectratio>keep</aspectratio> + <align>center</align> + </control> </control> </focusedlayout> </control> @@ -151,10 +163,8 @@ <textureslidernibfocus>-</textureslidernibfocus> <showonepage>false</showonepage> <orientation>horizontal</orientation> - <onleft>32500</onleft> - <onright>32500</onright> <ondown>32500</ondown> - <onup>32500</onup> + <!-- <onup>32500</onup> --> <animation effect="slide" end="120,0" time="0" condition="!Control.IsVisible(5)">Conditional</animation> </control> </control> diff --git a/resources/skins/Default/720p/InfoWindow.xml b/resources/skins/Default/720p/InfoWindow.xml index 6998dad6..5c10d776 100644 --- a/resources/skins/Default/720p/InfoWindow.xml +++ b/resources/skins/Default/720p/InfoWindow.xml @@ -1,98 +1,113 @@ <?xml version="1.0" encoding="utf-8"?> <window> - <allowoverlays>false</allowoverlays> + <allowoverlays>false</allowoverlays> + <animation type="WindowOpen" reversible="false"> + <effect type="slide" start="0,200" end="0,0" center="640,225" delay="160" tween="cubic" time="200" /> + <effect type="fade" delay="160" end="100" time="240" /> + </animation> + <animation type="WindowClose" reversible="false"> + <effect type="slide" start="0,0" end="0,200" center="640,225" easing="in" tween="cubic" time="200" /> + <effect type="fade" start="100" end="0" time="240" /> + </animation> <controls> <control type="group" id="10001"> - <posx>50</posx> - <posy>28</posy> - <width>1179</width> - <height>663</height> + <left>0</left> + <top>0</top> + <width>100%</width> + <height>100%</height> <control type="image"> - <width>1179</width> - <height>663</height> - <texture>Shortcut/dialog-bg-solid.png</texture> + <width>100%</width> + <height>100%</height> + <texture colordiffuse="FF232323">Shortcut/white.png</texture> </control> - <!-- <control type="image"> - <height>40</height> - <width>800</width> - <texture>Windows/dialogheader.png</texture> - </control> --> + <!-- FANART --> + <control type="image" id="10004"> + <left>0</left> + <top>0</top> + <width>100%</width> + <height>100%</height> + <texture></texture> + <colordiffuse>33FFFFFF</colordiffuse> + </control> + <!-- Header --> <control type="label" id="10002"> - <posy>15</posy> - <posx>0</posx> + <top>20</top> + <left>0</left> <height>34</height> - <width>1179</width> - <font>font12_title</font> - <textcolor>0xFFFFFFFF</textcolor> - <!-- <shadowcolor>black</shadowcolor> --> + <width>100%</width> + <font>font30_title</font> + <textcolor>FFFFFFFF</textcolor> <align>center</align> <aligny>center</aligny> <label>$ADDON[plugin.video.kod 70000]</label> </control> + <!-- Close --> <control type="button" id="10003"> - <posx>1120</posx> - <posy>25</posy> - <width>20</width> - <height>20</height> - <texturefocus>Controls/DialogCloseButton-focus.png</texturefocus> - <texturenofocus>Controls/DialogCloseButton.png</texturenofocus> + <right>30</right> + <top>25</top> + <width>30</width> + <height>30</height> + <texturefocus colordiffuse="FFFFFFFF">Controls/DialogCloseButton-focus.png</texturefocus> + <texturenofocus colordiffuse="55FFFFFF">Controls/DialogCloseButton-focus.png</texturenofocus> </control> - <control type="image" id="10004"> <!-- FANART --> - <posx>0</posx> - <posy>0</posy> - <width>1179</width> - <height>663</height> + <!-- LOCANDINA --> + <control type="image" id="10005"> + <right>30</right> + <top>110</top> + <width>349</width> + <height>500</height> <texture></texture> - <colordiffuse>33FFFFFF</colordiffuse> + <animation type="WindowOpen" reversible="false"> + <effect type="slide" start="200,0" end="0,0" delay="300" tween="cubic" time="200" /> + <effect type="fade" delay="300" end="100" time="240" /> + </animation> + <animation type="WindowClose" reversible="false"> + <effect type="slide" start="0,0" end="200,0" easing="in" tween="cubic" time="200" /> + <effect type="fade" start="100" end="0" time="240" /> + </animation> </control> - <control type="image" id="10005"> <!-- LOCANDINA --> - <posx>809</posx> - <posy>110</posy> - <width>310</width> - <height>444</height> - <texture></texture> - </control> - <control type="label" id="10006"> <!-- Serie --> - <posy>100</posy> - <posx>60</posx> + <!-- Serie --> + <control type="label" id="10006"> + <top>100</top> + <left>60</left> <height>40</height> <width>100</width> <font>font10</font> - <textcolor>0xFFFFFFFF</textcolor> + <textcolor>FFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="10007"> - <posy>100</posy> - <posx>200</posx> + <top>100</top> + <left>200</left> <height>40</height> <width>365</width> <font>font10</font> <scrollsuffix> | </scrollsuffix> <scroll>true</scroll> - <textcolor>0xFFFFFFFF</textcolor> + <textcolor>FFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="10008"> <!-- Lingua Originale --> - <posy>120</posy> - <posx>60</posx> + <top>125</top> + <left>60</left> <height>40</height> <width>100</width> <font>font10</font> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="10009"> - <posy>120</posy> - <posx>200</posx> + <top>125</top> + <left>200</left> <height>40</height> <width>365</width> <font>font10</font> @@ -100,25 +115,25 @@ <scroll>true</scroll> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="100010"> <!-- Punteggio --> - <posy>140</posy> - <posx>60</posx> + <top>150</top> + <left>60</left> <height>40</height> <width>100</width> <font>font10</font> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="100011"> - <posy>140</posy> - <posx>200</posx> + <top>150</top> + <left>200</left> <height>40</height> <width>365</width> <font>font10</font> @@ -126,25 +141,25 @@ <scroll>true</scroll> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="100012"> <!-- Generi --> - <posy>160</posy> - <posx>60</posx> + <top>175</top> + <left>60</left> <height>40</height> <width>100</width> <font>font10</font> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="100013"> - <posy>160</posy> - <posx>200</posx> + <top>175</top> + <left>200</left> <height>40</height> <width>365</width> <font>font10</font> @@ -152,25 +167,25 @@ <scroll>true</scroll> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="100014"> - <posy>180</posy> - <posx>60</posx> + <top>200</top> + <left>60</left> <height>40</height> <width>100</width> <font>font10</font> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="100015"> - <posy>180</posy> - <posx>200</posx> + <top>200</top> + <left>200</left> <height>40</height> <width>365</width> <font>font10</font> @@ -178,25 +193,25 @@ <scroll>true</scroll> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="100016"> - <posy>200</posy> - <posx>60</posx> + <top>225</top> + <left>60</left> <height>40</height> <width>100</width> <font>font10</font> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="100017"> - <posy>200</posy> - <posx>200</posx> + <top>225</top> + <left>200</left> <height>40</height> <width>365</width> <font>font10</font> @@ -204,25 +219,25 @@ <scroll>true</scroll> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="100018"> - <posy>220</posy> - <posx>60</posx> + <top>250</top> + <left>60</left> <height>40</height> <width>100</width> <font>font10</font> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="100019"> - <posy>220</posy> - <posx>200</posx> + <top>250</top> + <left>200</left> <height>40</height> <width>365</width> <font>font10</font> @@ -230,25 +245,25 @@ <scroll>true</scroll> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="100020"> - <posy>240</posy> - <posx>60</posx> + <top>275</top> + <left>60</left> <height>40</height> <width>100</width> <font>font10</font> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="100021"> - <posy>240</posy> - <posx>200</posx> + <top>275</top> + <left>200</left> <height>40</height> <width>365</width> <font>font10</font> @@ -256,25 +271,25 @@ <scroll>true</scroll> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="label" id="100022"> <!-- Trama --> - <posy>260</posy> - <posx>60</posx> + <top>300</top> + <left>60</left> <height>40</height> <width>505</width> <font>font10</font> <textcolor>0xFFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> - <align>posx</align> - <aligny>posy</aligny> + <align>left</align> + <aligny>top</aligny> <label></label> </control> <control type="textbox" id="100023"> - <posy>260</posy> - <posx>200</posx> + <top>300</top> + <left>200</left> <height>294</height> <width>500</width> <font>font10</font> @@ -283,71 +298,71 @@ <wrapmultiline>true</wrapmultiline> <autoscroll delay="2000" time="1500" repeat="2000">true</autoscroll> <align>justify</align> - <aligny>posy</aligny> + <aligny>top</aligny> <label></label> </control> <control type="group" id="10024"> - <posy>600</posy> - <posx>40</posx> + <bottom>60</bottom> + <left>40</left> <width>760</width> <height>30</height> <control type="button" id="10025"> - <posy>0</posy> - <posx>0</posx> + <top>0</top> + <left>0</left> <width>200</width> <height>50</height> <textwidth>110</textwidth> - <texturefocus>Controls/KeyboardKey.png</texturefocus> - <texturenofocus>Controls/KeyboardKeyNF.png</texturenofocus> + <texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus> + <texturenofocus colordiffuse="000081C2">Shortcut/white.png</texturenofocus> <align>center</align> <aligny>center</aligny> <label>$ADDON[plugin.video.kod 70005]</label> </control> <control type="button" id="10026"> - <posy>0</posy> - <posx>210</posx> + <top>0</top> + <left>210</left> <width>200</width> <height>50</height> <textwidth>110</textwidth> - <texturefocus>Controls/KeyboardKey.png</texturefocus> - <texturenofocus>Controls/KeyboardKeyNF.png</texturenofocus> + <texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus> + <texturenofocus colordiffuse="000081C2">Shortcut/white.png</texturenofocus> <align>center</align> <aligny>center</aligny> <label>$ADDON[plugin.video.kod 70006]</label> </control> <control type="button" id="10027"> - <posy>0</posy> - <posx>420</posx> + <top>0</top> + <left>420</left> <width>200</width> <height>50</height> <textwidth>110</textwidth> - <texturefocus>Controls/KeyboardKey.png</texturefocus> - <texturenofocus>Controls/KeyboardKeyNF.png</texturenofocus> + <texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus> + <texturenofocus colordiffuse="000081C2">Shortcut/white.png</texturenofocus> <align>center</align> <aligny>center</aligny> <label>$ADDON[plugin.video.kod 70002]</label> </control> <control type="button" id="10028"> - <posy>0</posy> - <posx>640</posx> + <top>0</top> + <left>640</left> <width>200</width> <height>50</height> <textwidth>110</textwidth> - <texturefocus>Controls/KeyboardKey.png</texturefocus> - <texturenofocus>Controls/KeyboardKeyNF.png</texturenofocus> + <texturefocus colordiffuse="FF0081C2">Shortcut/white.png</texturefocus> + <texturenofocus colordiffuse="000081C2">Shortcut/white.png</texturenofocus> <align>center</align> <aligny>center</aligny> <label>$ADDON[plugin.video.kod 70007]</label> </control> <control type="label" id="100029"> - <posy>10</posy> - <posx>1080</posx> + <top>10</top> + <left>1080</left> <height>30</height> <width>110</width> <font>font10</font> - <textcolor>0xFFFFFFFF</textcolor> + <textcolor>FFFFFFFF</textcolor> <shadowcolor>black</shadowcolor> <align>right</align> <aligny>center</aligny> diff --git a/resources/skins/Default/720p/ShortCutMenu.xml b/resources/skins/Default/720p/ShortCutMenu.xml index ced2cc5e..d36e2ab4 100644 --- a/resources/skins/Default/720p/ShortCutMenu.xml +++ b/resources/skins/Default/720p/ShortCutMenu.xml @@ -7,12 +7,10 @@ </coordinates> <defaultcontrol always="true">32500</defaultcontrol> <animation type="WindowOpen" reversible="false"> - <effect type="zoom" start="80" end="100" center="440,110" delay="160" tween="back" time="240" /> - <effect type="fade" delay="160" end="100" time="240" /> + <effect type="fade" delay="160" end="100" time="220" /> </animation> <animation type="WindowClose" reversible="false"> - <effect type="zoom" start="100" end="80" center="440,110" easing="in" tween="back" time="240" /> - <effect type="fade" start="100" end="0" time="240" /> + <effect type="fade" delay="160" start="100" end="0" time="200" /> </animation> <controls> <control type="button"> @@ -24,14 +22,22 @@ <texturenofocus colordiffuse="88232323">Shortcut/white.png</texturenofocus> <onclick>Action(close)</onclick> </control> - <control type="image"> - <left>0</left> - <top>0</top> - <width>880</width> - <height>220</height> - <texture border="2" colordiffuse="FF232323">Shortcut/white.png</texture> - </control> <control type="group"> + <animation type="WindowOpen" reversible="false"> + <effect type="slide" start="0,100" end="0,0" center="640,225" delay="160" tween="cubic" time="200" /> + <effect type="fade" delay="160" end="100" time="220" /> + </animation> + <animation type="WindowClose" reversible="false"> + <effect type="slide" start="0,0" end="0,-100" center="640,225" delay="160" tween="cubic" time="200" /> + <effect type="fade" delay="160" start="100" end="0" time="200" /> + </animation> + <control type="image"> + <left>0</left> + <top>0</top> + <width>880</width> + <height>220</height> + <texture border="2" colordiffuse="FF232323">Shortcut/white.png</texture> + </control> <control type="group"> <control type="image"> <left>-21</left> @@ -53,7 +59,6 @@ <animation effect="slide" start="0,0" end="10,0" time="0" condition="true">Conditional</animation> <animation effect="slide" end="120,0" time="0" condition="!Control.IsVisible(5)">Conditional</animation> <itemlayout height="220" width="220"> - <!-- <top>2</top> --> <control type="image"> <top>0</top> <left>0</left> @@ -71,7 +76,7 @@ <control type="image"> <width>220</width> <height>220</height> - <texture>$INFO[ListItem.Property(thumb)]</texture> + <texture>$INFO[ListItem.Property(thumbnail)]</texture> <aspectratio>keep</aspectratio> <align>center</align> </control> @@ -119,7 +124,7 @@ <control type="image"> <width>220</width> <height>220</height> - <texture>$INFO[ListItem.Property(thumb)]</texture> + <texture>$INFO[ListItem.Property(thumbnail)]</texture> <aspectratio>keep</aspectratio> <align>center</align> </control> @@ -134,6 +139,15 @@ <align>center</align> <aligny>center</aligny> </control> + <control type="image"> + <left>100</left> + <top>5</top> + <width>20</width> + <height>20</height> + <texture>$INFO[ListItem.Property(sub)]</texture> + <aspectratio>keep</aspectratio> + <align>center</align> + </control> </control> </focusedlayout> </control> @@ -149,10 +163,8 @@ <textureslidernibfocus>-</textureslidernibfocus> <showonepage>false</showonepage> <orientation>horizontal</orientation> - <!-- <onleft>32500</onleft> - <onright>32500</onright> --> <ondown>32500</ondown> - <onup>32500</onup> + <!-- <onup>32500</onup> --> <animation effect="slide" end="120,0" time="0" condition="!Control.IsVisible(5)">Conditional</animation> </control> </control> diff --git a/resources/views/skin.ace2.json b/resources/views/skin.ace2.json deleted file mode 100644 index 088ebcac..00000000 --- a/resources/views/skin.ace2.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "all":{ - "Right List": 50, - "Frame": 51, - "Wall": 56, - "Tech": 68, - "Sets Plus": 74 - }, - "movie":{ - "Right List": 50, - "Frame": 51, - "Wall": 56, - "Tech": 68, - "Sets Plus": 74 - }, - "tvshow":{ - "Right List": 50, - "Frame": 51, - "Wall": 56, - "Tech": 68, - "Sets Plus": 74 - }, - "season":{ - "Right List": 50, - "Frame": 51, - "Wall": 56, - "Tech": 68, - "Sets Plus": 74 - }, - "episode":{ - "Right List": 50, - "Frame": 51, - "Wall": 56, - "Tech": 68, - "Sets Plus": 74 - }, - "addon":{ - "Right List": 50, - "Frame": 51, - "Wall": 56, - "Tech": 68, - "Sets Plus": 74 - } -} \ No newline at end of file diff --git a/resources/views/skin.aeon.nox.silvo.json b/resources/views/skin.aeon.nox.silvo.json deleted file mode 100644 index 3e777a57..00000000 --- a/resources/views/skin.aeon.nox.silvo.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "all":{ - "List": 50, - "RightList": 506, - "FanartList": 602, - "LowList": 501, - "BigList": 507, - "Logo": 59, - "Showcase": 53, - "Shift": 57, - "Posters": 56, - "MyFlix": 509, - "TriPanel": 55, - "Icons": 500, - "Small Icons": 499, - "Wall": 503, - "Fullscreen Wall": 609, - "infoWall": 51, - "BannerWall": 58, - "BannerPlex": 601, - "Landscape": 52, - "BigFan": 591, - "Gallery": 504, - "Panel": 505, - "Episode": 502 - }, - "movie":{ - "List": 50, - "RightList": 506, - "FanartList": 602, - "LowList": 501, - "BigList": 507, - "Logo": 59, - "Showcase": 53, - "Shift": 57, - "Posters": 56, - "MyFlix": 509, - "TriPanel": 55, - "Icons": 500, - "Small Icons": 499, - "Wall": 503, - "Fullscreen Wall": 609, - "infoWall": 51, - "BannerWall": 58, - "BannerPlex": 601, - "Landscape": 52, - "BigFan": 591, - "Gallery": 504, - "Panel": 505 - }, - "tvshow":{ - "List": 50, - "RightList": 506, - "FanartList": 602, - "LowList": 501, - "BigList": 507, - "Logo": 59, - "Showcase": 53, - "Shift": 57, - "Posters": 56, - "MyFlix": 509, - "TriPanel": 55, - "Icons": 500, - "Small Icons": 499, - "Wall": 503, - "Fullscreen Wall": 609, - "infoWall": 51, - "BannerWall": 58, - "BannerPlex": 601, - "Landscape": 52, - "BigFan": 591, - "Gallery": 504, - "Panel": 505, - "Episode": 502 - }, - "season":{ - "List": 50, - "RightList": 506, - "FanartList": 602, - "LowList": 501, - "Showcase": 53, - "Shift": 57, - "Posters": 56, - "TriPanel": 55, - "Icons": 500, - "Small Icons": 499, - "Wall": 503, - "BigFan": 591 - }, - "episode":{ - "List": 50, - "RightList": 506, - "FanartList": 602, - "LowList": 501, - "BigList": 507, - "Episode": 502, - "MyFlix": 509, - "TriPanel": 55, - "Icons": 500, - "Landscape": 52, - "Panel": 505 - }, - "addon":{ - "List": 50, - "Shift": 57, - "Icons": 500, - "Wall": 503 - } -} \ No newline at end of file diff --git a/resources/views/skin.aeon.tajo.json b/resources/views/skin.aeon.tajo.json deleted file mode 100644 index ad06eaaf..00000000 --- a/resources/views/skin.aeon.tajo.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "all":{ - "List": 50, - "MultiSort": 589, - "MultiWall": 587, - "Shelf 3D": 595, - "List 3D": 596, - "Fanart 3D": 593, - "Triple 3D": 590, - "Wall 3D": 586, - "Banner 3D": 594, - "MultiWall 3D": 587 - }, - "movie":{ - "List": 50, - "MultiSort": 589, - "MultiWall": 587, - "Shelf 3D": 595, - "List 3D": 596, - "Fanart 3D": 593, - "Triple 3D": 590, - "Wall 3D": 586, - "Banner 3D": 594, - "MultiWall 3D": 587 - }, - "tvshow":{ - "List": 50, - "MultiWall": 587, - "Shelf 3D": 595, - "List 3D": 596, - "Fanart 3D": 593, - "Triple 3D": 590, - "Wall 3D": 586, - "Banner 3D": 594, - "MultiWall 3D": 587 - }, - "season":{ - "List": 50, - "Shelf 3D": 595, - "List 3D": 596, - "Wall 3D": 586 - }, - "episode":{ - "List": 50, - "List 3D": 596 - }, - "addon":{ - "List": 50 - } -} \ No newline at end of file diff --git a/resources/views/skin.aeonmq8.json b/resources/views/skin.aeonmq8.json deleted file mode 100644 index e0ce9573..00000000 --- a/resources/views/skin.aeonmq8.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "all":{ - "Right List": 51, - "Banner": 52, - "Banner Info": 53, - "Poster": 54, - "Low List": 55, - "Wall": 56, - "Glass List": 57, - "Coverflow": 58, - "Wide": 59, - "Showart": 60, - "Multiplex": 61, - "Panel": 62, - "Shelf": 63, - "Sets": 65, - "Showcase": 66, - "Wall 3D": 67, - "Posterlite": 80, - "Poster List": 70, - "Total Art": 71 - }, - "movie":{ - "Right List": 51, - "Banner": 52, - "Banner Info": 53, - "Poster": 54, - "Low List": 55, - "Wall": 56, - "Glass List": 57, - "Coverflow": 58, - "Wide": 59, - "Showart": 60, - "Multiplex": 61, - "Panel": 62, - "Shelf": 63, - "Sets": 65, - "Showcase": 66, - "Wall 3D": 67, - "Posterlite": 80, - "Poster List": 70, - "Total Art": 71 - }, - "tvshow":{ - "Right List": 51, - "Banner": 52, - "Banner Info": 53, - "Poster": 54, - "Low List": 55, - "Wall": 56, - "Glass List": 57, - "Coverflow": 58, - "Wide": 59, - "Showart": 60, - "Multiplex": 61, - "Panel": 62, - "Shelf": 63, - "Showcase": 66, - "Wall 3D": 67, - "Posterlite": 80 - }, - "season":{ - "Right List": 51, - "Banner": 52, - "Banner Info": 53, - "Poster": 54, - "Low List": 55, - "Wall": 56, - "Glass List": 57, - "Coverflow": 58, - "Wide": 59, - "Showart": 60, - "Multiplex": 61, - "Panel": 62, - "Shelf": 63, - "Showcase": 66, - "Wall 3D": 67, - "Posterlite": 80 - }, - "episode":{ - "Right List": 51, - "Poster": 54, - "Low List": 55, - "Wall": 56, - "Glass List": 57, - "Wide": 59, - "Showart": 60, - "Multiplex": 61, - "Panel": 62, - "Wall 3D": 67, - "Posterlite": 80 - }, - "addon":{ - "Right List": 51 - } -} \ No newline at end of file diff --git a/resources/views/skin.amber.json b/resources/views/skin.amber.json deleted file mode 100644 index dafb4913..00000000 --- a/resources/views/skin.amber.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "all":{ - "List": 50, - "Low List": 54, - "Big List": 52, - "Tall List": 501, - "Panel": 51, - "Big Panel": 55, - "Icons": 53, - "Fanart": 56 - }, - "movie":{ - "List": 50, - "Low List": 54, - "Big List": 52, - "Tall List": 501, - "Panel": 51, - "Big Panel": 55, - "Icons": 53, - "Fanart": 56 - }, - "tvshow":{ - "List": 50, - "Low List": 54, - "Big List": 52, - "Tall List": 501, - "Panel": 51, - "Big Panel": 55, - "Icons": 53, - "Fanart": 56 - }, - "season":{ - "List": 50, - "Low List": 54, - "Big List": 52, - "Tall List": 501, - "Panel": 51, - "Big Panel": 55, - "Icons": 53, - "Fanart": 56 - }, - "episode":{ - "List": 50, - "Low List": 54, - "Big List": 52, - "Tall List": 501, - "Panel": 51, - "Big Panel": 55, - "Icons": 53, - "Fanart": 56 - }, - "addon":{ - "List": 50, - "Low List": 54, - "Big List": 52, - "Tall List": 501, - "Panel": 51, - "Big Panel": 55, - "Icons": 53, - "Fanart": 56 - } -} \ No newline at end of file diff --git a/resources/views/skin.apptv.json b/resources/views/skin.apptv.json deleted file mode 100644 index a7e8373a..00000000 --- a/resources/views/skin.apptv.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "all":{ - "List": 50, - "Icons": 52, - "Banner": 53, - "Wrap": 54, - "Coverflow": 57, - "Wall": 58 - }, - "movie":{ - "List": 50, - "Icons": 52, - "Wrap": 54, - "Coverflow": 57, - "Wall": 58 - }, - "tvshow":{ - "List": 50, - "Icons": 52, - "Banner": 53, - "Wrap": 54, - "Coverflow": 57, - "Wall": 58 - }, - "season":{ - "List": 50, - "Icons": 52, - "Wrap": 54, - "Coverflow": 57, - "Wall": 58 - }, - "episode":{ - "List": 50, - "Icons": 52, - "Wrap": 54, - "Coverflow": 57 - }, - "addon":{ - "List": 50, - "Icons": 52, - "Wrap": 54, - "Coverflow": 57, - "Wall": 58 - } -} \ No newline at end of file diff --git a/resources/views/skin.arctic.zephyr.2.json b/resources/views/skin.arctic.zephyr.2.json deleted file mode 100644 index 4c3e2e13..00000000 --- a/resources/views/skin.arctic.zephyr.2.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "all":{ - "List": 50, - "MediaInfo": 501, - "MediaInfo 2": 502, - "Tri-Panel": 504, - "Banner List": 503, - "Poster Wall": 51, - "Landscape Wall": 511, - "Info Wall": 514, - "Info Wall 2": 516, - "Landscape Wall Small": 515, - "Poster Showcase": 52, - "Landscape Showcase": 521, - "Poster": 53, - "Lovefilm": 523, - "Seasons Info": 522, - "Seasons Info 2": 524, - "Square Wall": 510, - "Icon Wall": 512 - }, - "movie":{ - "List": 50, - "MediaInfo": 501, - "MediaInfo 2": 502, - "Tri-Panel": 504, - "Banner List": 503, - "Poster Wall": 51, - "Landscape Wall": 511, - "Info Wall": 514, - "Info Wall 2": 516, - "Landscape Wall Small": 515, - "Poster Showcase": 52, - "Landscape Showcase": 521, - "Poster": 53, - "Lovefilm": 523 - }, - "tvshow":{ - "List": 50, - "MediaInfo": 501, - "MediaInfo 2": 502, - "Tri-Panel": 504, - "Banner List": 503, - "Poster Wall": 51, - "Landscape Wall": 511, - "Info Wall": 514, - "Info Wall 2": 516, - "Landscape Wall Small": 515, - "Poster Showcase": 52, - "Landscape Showcase": 521, - "Poster": 53, - "Lovefilm": 523 - }, - "season":{ - "List": 50, - "Banner List": 503, - "Poster Wall": 51, - "Info Wall": 514, - "Info Wall 2": 516, - "Poster Showcase": 52, - "Seasons Info": 522, - "Seasons Info 2": 524, - "Poster": 53 - }, - "episode":{ - "List": 50, - "MediaInfo": 501, - "MediaInfo 2": 502, - "Tri-Panel": 504, - "Banner List": 503, - "Landscape Wall": 511, - "Info Wall 2": 516, - "Landscape Wall Small": 515, - "Landscape Showcase": 521 - }, - "addon":{ - "List": 50, - "Square Wall": 510, - "Icon Wall": 512 - } -} \ No newline at end of file diff --git a/resources/views/skin.aura.json b/resources/views/skin.aura.json deleted file mode 100644 index b106fe37..00000000 --- a/resources/views/skin.aura.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "all":{ - "List": 50, - "Poster Wall": 51, - "Landscape Wall": 52, - "Square Wall": 53, - "Banner Wall": 54, - "Showcase": 55, - "Landscape Showcase": 56, - "Square Showcase": 57, - "Big Posters": 58, - "Lovefilm": 59, - "Media Info": 500, - "info List": 501, - "Episode List": 502, - "Square Wall Large": 503 - }, - "movie":{ - "List": 50, - "Poster Wall": 51, - "Landscape Wall": 52, - "Showcase": 55, - "Landscape Showcase": 56, - "Square Showcase": 57, - "Big Posters": 58, - "Lovefilm": 59, - "Media Info": 500, - "info List": 501, - "Episode List": 502 - }, - "tvshow":{ - "List": 50, - "Poster Wall": 51, - "Landscape Wall": 52, - "Banner Wall": 54, - "Showcase": 55, - "Landscape Showcase": 56, - "Square Showcase": 57, - "Big Posters": 58, - "Lovefilm": 59, - "Media Info": 500, - "info List": 501, - "Episode List": 502 - }, - "season":{ - "List": 50, - "Poster Wall": 51, - "Landscape Wall": 52, - "Banner Wall": 54, - "Showcase": 55, - "Landscape Showcase": 56, - "Square Showcase": 57, - "Big Posters": 58, - "Lovefilm": 59, - "Media Info": 500, - "info List": 501, - "Episode List": 502 - }, - "episode":{ - "List": 50, - "Poster Wall": 51, - "Landscape Wall": 52, - "Banner Wall": 54, - "Showcase": 55, - "Landscape Showcase": 56, - "Square Showcase": 57, - "Big Posters": 58, - "Lovefilm": 59, - "Media Info": 500, - "info List": 501, - "Episode List": 502 - }, - "addon":{ - "List": 50, - "Square Wall": 53, - "Square Wall Large": 503 - } -} \ No newline at end of file diff --git a/resources/views/skin.bello.7.json b/resources/views/skin.bello.7.json deleted file mode 100644 index 992a8ffc..00000000 --- a/resources/views/skin.bello.7.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "all":{ - "List": 50, - "Bello": 66, - "Slide": 51, - "Gallery": 52, - "Tiles": 562, - "Thumbnails": 560, - "Posters": 561, - "Posters 2": 64, - "Banner List": 57, - "3D Wall": 53, - "Wall": 54, - "List Wall": 58, - "VideoWall": 580, - "Showtime": 65, - "Netflix": 59 - }, - "movie":{ - "List": 50, - "Bello": 66, - "Slide": 51, - "Gallery": 52, - "Tiles": 562, - "Thumbnails": 560, - "Posters": 561, - "Posters 2": 64, - "Banner List": 57, - "3D Wall": 53, - "Wall": 54, - "List Wall": 58, - "VideoWall": 580, - "Showtime": 65, - "Netflix": 59 - }, - "tvshow":{ - "List": 50, - "Bello": 66, - "Slide": 51, - "Gallery": 52, - "Tiles": 562, - "Thumbnails": 560, - "Posters 2": 64, - "Banner List": 57, - "3D Wall": 53, - "Wall": 54, - "List Wall": 58, - "VideoWall": 580, - "Showtime": 65, - "Netflix": 59 - }, - "season":{ - "List": 50, - "Bello": 66, - "Slide": 51, - "Gallery": 52, - "Tiles": 562, - "Thumbnails": 560, - "Banner List": 57, - "Netflix": 59 - }, - "episode":{ - "List": 50, - "Bello": 66, - "Gallery": 52, - "Tiles": 562, - "Thumbnails": 560, - "Banner List": 57, - "Netflix": 59 - }, - "addon":{ - "List": 50, - "Bello": 66, - "Thumbnails": 560 - } -} \ No newline at end of file diff --git a/resources/views/skin.blackglassnova.json b/resources/views/skin.blackglassnova.json deleted file mode 100644 index d59b9ed2..00000000 --- a/resources/views/skin.blackglassnova.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "all":{ - "List": 50, - "Large List": 52, - "Low List": 54, - "Banner List": 56, - "Panel": 51, - "Big Panel": 55, - "Icons": 53, - "Poster Showcase": 59, - "Card List": 5050 - }, - "movie":{ - "List": 50, - "Large List": 52, - "Low List": 54, - "Banner List": 56, - "Panel": 51, - "Big Panel": 55, - "Icons": 53, - "Poster Showcase": 59, - "Card List": 5050 - }, - "tvshow":{ - "List": 50, - "Large List": 52, - "Low List": 54, - "Banner List": 56, - "Panel": 51, - "Big Panel": 55, - "Icons": 53, - "Poster Showcase": 59, - "Card List": 5050 - }, - "season":{ - "List": 50, - "Large List": 52, - "Low List": 54, - "Banner List": 56, - "Panel": 51, - "Big Panel": 55, - "Icons": 53, - "Poster Showcase": 59, - "Card List": 5050 - }, - "episode":{ - "List": 50, - "Large List": 52, - "Low List": 54, - "Banner List": 56, - "Panel": 51, - "Big Panel": 55, - "Icons": 53, - "Poster Showcase": 59, - "Card List": 5050 - }, - "addon":{ - "List": 50, - "Large List": 52, - "Low List": 54, - "Panel": 51, - "Big Panel": 55, - "Icons": 53, - "Fanart": 58, - "Card List": 5050 - } -} diff --git a/resources/views/skin.box.json b/resources/views/skin.box.json deleted file mode 100644 index e602ab5c..00000000 --- a/resources/views/skin.box.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "all":{ - "List": 50, - "Thumbs": 52, - "Fanart": 527, - "Poster": 532, - "Banner": 50, - "Banner List": 536, - "Fanart Logo": 539, - "List Info": 5231, - "Thumb Info": 533 - }, - "movie":{ - "List": 50, - "Thumbs": 52, - "Fanart": 527, - "Poster": 532, - "Fanart Logo": 539, - "List Info": 5231, - "Thumb Info": 533 - }, - "tvshow":{ - "List": 50, - "Thumbs": 52, - "Fanart": 527, - "Poster": 532, - "Banner": 50, - "Banner List": 536, - "Fanart Logo": 539, - "List Info": 5231, - "Thumb Info": 533 - }, - "season":{ - "List": 50, - "Poster": 532 - }, - "episode":{ - "List": 50, - "Thumbs": 52, - "List Info": 5231, - "Thumb Info": 533 - }, - "addon":{ - "List": 50 - } -} \ No newline at end of file diff --git a/resources/views/skin.confluence.json b/resources/views/skin.confluence.json deleted file mode 100644 index f0348dd8..00000000 --- a/resources/views/skin.confluence.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "all":{ - "List": 50, - "Big List": 55, - "Thumbnail": 500, - "Poster Wrap": 501, - "Fanart": 508, - "Media Info": 503, - "Media Info 2": 504, - "Media Info 3": 504, - "Wide": 505 - }, - "movie":{ - "List": 50, - "Big List": 55, - "Thumbnail": 500, - "Poster Wrap": 501, - "Fanart": 508, - "Media Info": 503, - "Media Info 2": 504, - "Media Info 3": 504 - }, - "tvshow":{ - "List": 50, - "Big List": 55, - "Thumbnail": 500, - "Poster Wrap": 501, - "Fanart": 508, - "Media Info": 503, - "Media Info 2": 504, - "Media Info 3": 504, - "Wide": 505 - }, - "season":{ - "List": 50, - "Big List": 55, - "Thumbnail": 500, - "Poster Wrap": 501, - "Media Info 2": 504, - "Media Info 3": 504 - }, - "episode":{ - "List": 50, - "Big List": 55, - "Thumbnail": 500, - "Media Info": 503, - "Media Info 2": 504, - "Media Info 3": 504 - }, - "addon":{ - "List": 50, - "Big List": 55, - "Thumbnail": 500 - } -} \ No newline at end of file diff --git a/resources/views/skin.eminence.2.json b/resources/views/skin.eminence.2.json deleted file mode 100644 index f2a5267e..00000000 --- a/resources/views/skin.eminence.2.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "all":{ - "Plain List": 552, - "Poster List": 550, - "Big List": 510, - "Media Info": 51, - "Media Info 2": 57, - "Media Info 3": 577, - "Info List": 53, - "Info List 2": 553, - "Fanart List": 54, - "Gallery": 58, - "Big Icons": 52, - "Mediun Icons": 525, - "Showcase": 535, - "Icons": 500, - "Info Icons": 59, - "Wide": 55, - "Fanart": 56 - }, - "movie":{ - "Plain List": 552, - "Poster List": 550, - "Big List": 510, - "Media Info": 51, - "Media Info 2": 57, - "Media Info 3": 577, - "Info List": 53, - "Info List 2": 553, - "Fanart List": 54, - "Gallery": 58, - "Big Icons": 52, - "Mediun Icons": 525, - "Showcase": 535, - "Icons": 500, - "Info Icons": 59, - "Wide": 55, - "Fanart": 56 - }, - "tvshow":{ - "Plain List": 552, - "Poster List": 550, - "Big List": 510, - "Media Info": 51, - "Media Info 2": 57, - "Media Info 3": 577, - "Info List": 53, - "Info List 2": 553, - "Fanart List": 54, - "Gallery": 58, - "Big Icons": 52, - "Mediun Icons": 525, - "Showcase": 535, - "Icons": 500, - "Info Icons": 59, - "Wide": 55, - "Fanart": 56 - }, - "season":{ - "Plain List": 552, - "Poster List": 550, - "Media Info": 51, - "Media Info 2": 57, - "Info List": 53, - "Fanart List": 54, - "Gallery": 58, - "Big Icons": 52, - "Mediun Icons": 525, - "Showcase": 535, - "Icons": 500, - "Info Icons": 59 - }, - "episode":{ - "Plain List": 552, - "Poster List": 550, - "Media Info": 51, - "Media Info 2": 57, - "Info List": 53, - "Info List 2": 553, - "Fanart List": 54, - "Gallery": 58, - "Icons": 500, - "Fanart": 56 - }, - "addon":{ - "Plain List": 552, - "Poster List": 550, - "Big List": 510, - "Icons": 500, - "Info Icons": 59 - } -} \ No newline at end of file diff --git a/resources/views/skin.estuary.json b/resources/views/skin.estuary.json deleted file mode 100644 index f329efb6..00000000 --- a/resources/views/skin.estuary.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "all":{ - "List": 50, - "Poster": 51, - "Shift": 53, - "InfoWall": 54, - "WideList": 55, - "Wall": 500, - "Banner": 501, - "Fanart": 502 - }, - "movie":{ - "List": 50, - "Poster": 51, - "Shift": 53, - "InfoWall": 54, - "WideList": 55, - "Wall": 500, - "Fanart": 502 - }, - "tvshow":{ - "List": 50, - "Poster": 51, - "Shift": 53, - "InfoWall": 54, - "WideList": 55, - "Wall": 500, - "Banner": 501, - "Fanart": 502 - }, - "season":{ - "List": 50, - "Poster": 51, - "Shift": 53, - "InfoWall": 54, - "WideList": 55, - "Wall": 500, - "Fanart": 502 - }, - "episode":{ - "List": 50, - "Poster": 51, - "Shift": 53, - "InfoWall": 54, - "WideList": 55, - "Wall": 500, - "Banner": 501, - "Fanart": 502 - }, - "addon":{ - "WideList": 55, - "Wall": 500 - } -} \ No newline at end of file diff --git a/resources/views/skin.phenomenal.json b/resources/views/skin.phenomenal.json deleted file mode 100644 index a59df640..00000000 --- a/resources/views/skin.phenomenal.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "all":{ - "Fanart": 50, - "Poster": 51, - "Thumb": 52, - "Showcase": 53, - "Wide List": 54, - "Icons": 55, - "Pictures": 56, - "Banner List": 57 - }, - "movie":{ - "Fanart": 50, - "Poster": 51, - "Thumb": 52, - "Showcase": 53, - "Wide List": 54, - "Icons": 55, - "Pictures": 56, - "Banner List": 57 - }, - "tvshow":{ - "Fanart": 50, - "Poster": 51, - "Thumb": 52, - "Showcase": 53, - "Wide List": 54, - "Icons": 55, - "Pictures": 56, - "Banner List": 57 - }, - "season":{ - "Fanart": 50, - "Poster": 51, - "Thumb": 52, - "Showcase": 53, - "Wide List": 54, - "Icons": 55, - "Pictures": 56, - "Banner List": 57 - }, - "episode":{ - "Fanart": 50, - "Poster": 51, - "Thumb": 52, - "Showcase": 53, - "Wide List": 54, - "Icons": 55, - "Pictures": 56, - "Banner List": 57 - }, - "addon":{ - "Fanart": 50, - "Poster": 51, - "Thumb": 52, - "Showcase": 53, - "Wide List": 54, - "Icons": 55, - "Pictures": 56, - "Banner List": 57 - } -} \ No newline at end of file diff --git a/resources/views/skin.quartz.json b/resources/views/skin.quartz.json deleted file mode 100644 index 8b352603..00000000 --- a/resources/views/skin.quartz.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "all":{ - "List": 50, - "Big List": 51, - "Media Info": 52, - "Media Info 2": 54, - "Icons": 53, - "Big Icons": 501, - "Panel": 501, - "Wide": 55, - "Fanart 1": 57, - "Fanart 2": 59, - "Fanart 3": 500 - }, - "movie":{ - "List": 50, - "Big List": 51, - "Media Info": 52, - "Media Info 2": 54, - "Icons": 53, - "Big Icons": 501, - "Panel": 501, - "Fanart 1": 57, - "Fanart 2": 59, - "Fanart 3": 500 - }, - "tvshow":{ - "List": 50, - "Big List": 51, - "Media Info": 52, - "Media Info 2": 54, - "Icons": 53, - "Big Icons": 501, - "Panel": 501, - "Wide": 55, - "Fanart 1": 57, - "Fanart 2": 59, - "Fanart 3": 500 - }, - "season":{ - "List": 50, - "Big List": 51, - "Media Info": 52, - "Media Info 2": 54, - "Icons": 53, - "Big Icons": 501, - "Panel": 501, - "Fanart 1": 57, - "Fanart 2": 59, - "Fanart 3": 500 - }, - "episode":{ - "List": 50, - "Big List": 51, - "Media Info": 52, - "Media Info 2": 54, - "Icons": 53, - "Panel": 501, - "Fanart 3": 500 - }, - "addon":{ - "List": 50, - "Big List": 51, - "Icons": 53 - } -} \ No newline at end of file diff --git a/resources/views/skin.rapier.json b/resources/views/skin.rapier.json deleted file mode 100644 index edcd77b6..00000000 --- a/resources/views/skin.rapier.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "all":{ - - }, - "movie":{ - "Icon": 50, - "List": 52, - "List Info": 58, - "List Info 2": 66, - "List Info 3": 95, - "Thumbs Info": 97, - "Wrap Info": 53, - "3D Wrap": 588, - "Fanart": 583, - "Wall": 69 - }, - "tvshow":{ - "Icon": 50, - "List": 52, - "List Info": 61, - "List Info 2": 65, - "List Info 3": 589, - "Thumbs Info": 100, - "Wrap Info": 577, - "3D Wrap": 588, - "Fanart": 583, - "Wall": 586 - }, - "season":{ - "Icon": 50, - "List": 52, - "List Info": 61, - "List Info 2": 65, - "List Info 3": 589, - "Wall": 586, - "Extended": 585 - }, - "episode":{ - "Icon": 50, - "List": 52, - "List Info": 73, - "List Info 2": 68, - "List Info 3": 94 - }, - "addon":{ - "Icon": 50, - "List": 52, - "List Info": 91, - "Wrap Info": 93 - } -} \ No newline at end of file diff --git a/resources/views/skin.revolve.json b/resources/views/skin.revolve.json deleted file mode 100644 index b6343245..00000000 --- a/resources/views/skin.revolve.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "all":{ - "Circle List": 52, - "Thumbnails List": 55, - "Drop List": 51, - "Landscape List": 53, - "Revolve List": 54, - "Panels List": 56, - "Gallery List": 57, - "Rotate List": 58, - "Banners List": 59 - }, - "movie":{ - "Circle List": 52, - "Thumbnails List": 55, - "Drop List": 51, - "Landscape List": 53, - "Revolve List": 54, - "Panels List": 56, - "Gallery List": 57, - "Rotate List": 58, - "Banners List": 59 - }, - "tvshow":{ - "Circle List": 52, - "Thumbnails List": 55, - "Drop List": 51, - "Landscape List": 53, - "Revolve List": 54, - "Panels List": 56, - "Gallery List": 57, - "Rotate List": 58, - "Banners List": 59 - }, - "season":{ - "Circle List": 52, - "Thumbnails List": 55, - "Drop List": 51, - "Landscape List": 53, - "Revolve List": 54, - "Panels List": 56, - "Gallery List": 57, - "Rotate List": 58, - "Banners List": 59 - }, - "episode":{ - "Circle List": 52, - "Thumbnails List": 55, - "Drop List": 51, - "Landscape List": 53, - "Revolve List": 54, - "Panels List": 56, - "Gallery List": 57, - "Rotate List": 58, - "Banners List": 59 - }, - "addon":{ - "Circle List": 52, - "Thumbnails List": 55, - "Drop List": 51, - "Landscape List": 53, - "Revolve List": 54, - "Panels List": 56, - "Gallery List": 57, - "Rotate List": 58, - "Banners List": 59 - } -} \ No newline at end of file diff --git a/resources/views/skin.unity.json b/resources/views/skin.unity.json deleted file mode 100644 index 9f17aa28..00000000 --- a/resources/views/skin.unity.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "all":{ - "List": 50, - "Big List": 51, - "Thumbnail": 500, - "Poster Wrap": 501, - "Fanart": 508, - "Media Info": 505, - "Media Info 2": 504, - "Media Info 3": 503, - "Media Info 4": 515, - "Wide": 505, - "Info": 550, - "Info 2": 551 - }, - "movie":{ - "List": 50, - "Big List": 51, - "Thumbnail": 500, - "Poster Wrap": 501, - "Fanart": 508, - "Media Info": 505, - "Media Info 2": 504, - "Media Info 3": 503 - }, - "tvshow":{ - "List": 50, - "Big List": 51, - "Thumbnail": 500, - "Poster Wrap": 501, - "Fanart": 508, - "Media Info": 505, - "Media Info 2": 504, - "Media Info 3": 503, - "Wide": 505 - }, - "season":{ - "List": 50, - "Big List": 51, - "Thumbnail": 500, - "Poster Wrap": 501, - "Media Info": 505, - "Media Info 2": 504, - "Media Info 3": 503 - }, - "episode":{ - "List": 50, - "Big List": 51, - "Thumbnail": 500, - "Media Info": 505, - "Media Info 2": 504, - "Media Info 3": 503 - }, - "addon":{ - "List": 50, - "Big List": 51, - "Thumbnail": 500, - "Info": 550, - "Info 2": 551 - } -} \ No newline at end of file diff --git a/servers/torrent.py b/servers/torrent.py index 7e6413f6..416419e0 100755 --- a/servers/torrent.py +++ b/servers/torrent.py @@ -1,76 +1,35 @@ # -*- coding: utf-8 -*- -import sys +import re, os, sys, time, requests, xbmc, xbmcaddon -# from builtins import str -from builtins import range +from core import filetools, jsontools +from core.support import dbg, log, match +from platformcode import config, platformtools +from torrentool.api import Torrent +from lib.guessit import guessit -PY3 = False -VFS = True -if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int; VFS = False - -if PY3: - #from future import standard_library - #standard_library.install_aliases() - import urllib.parse as urllib # Es muy lento en PY2. En PY3 es nativo +if sys.version_info[0] >= 3: + import urllib.parse as urllib else: import urllib -import time -import os -import traceback -import re +monitor = filetools.join(config.get_data_path(), 'elementum_monitor.json') +extensions_list = ['.aaf', '.3gp', '.asf', '.avi', '.flv', '.mpeg', '.m1v', '.m2v', '.m4v', '.mkv', '.mov', '.mpg', '.mpe', '.mp4', '.ogg', '.wmv'] -try: - import xbmc - import xbmcgui - import xbmcaddon -except: - pass - -from core import filetools -from core import httptools -from core import scrapertools -from core import jsontools -from platformcode import logger -from platformcode import config -from platformcode import platformtools - -trackers = [ - "udp://tracker.openbittorrent.com:80/announce", - "http://tracker.torrentbay.to:6969/announce", - "http://tracker.pow7.com/announce", - "udp://tracker.ccc.de:80/announce", - "udp://open.demonii.com:1337", - - "http://9.rarbg.com:2710/announce", - "http://bt.careland.com.cn:6969/announce", - "http://explodie.org:6969/announce", - "http://mgtracker.org:2710/announce", - "http://tracker.best-torrents.net:6969/announce", - "http://tracker.tfile.me/announce", - "http://tracker1.wasabii.com.tw:6969/announce", - "udp://9.rarbg.com:2710/announce", - "udp://9.rarbg.me:2710/announce", - "udp://coppersurfer.tk:6969/announce", - - "http://www.spanishtracker.com:2710/announce", - "http://www.todotorrents.com:2710/announce", - ] # Returns an array of possible video url's from the page_url -def get_video_url(page_url, premium=False, user="", password="", video_password=""): +def get_video_url(page_url, premium=False, user='', password='', video_password=''): torrent_options = platformtools.torrent_client_installed(show_tuple=True) if len(torrent_options) == 0: from specials import elementum_download elementum_download.download() - logger.info("server=torrent, the url is the good") + log('server=torrent, the url is the good') - if page_url.startswith("magnet:"): - video_urls = [["magnet: [torrent]", page_url]] + if page_url.startswith('magnet:'): + video_urls = [['magnet: [torrent]', page_url]] else: - video_urls = [[".torrent [torrent]", page_url]] + video_urls = [['.torrent [torrent]', page_url]] return video_urls @@ -82,1275 +41,246 @@ class XBMCPlayer(xbmc.Player): xbmc_player = XBMCPlayer() - -def caching_torrents(url, referer=None, post=None, torrents_path=None, timeout=10, \ - lookup=False, data_torrent=False, headers={}, proxy_retries=1): - if torrents_path != None: - logger.info("path = " + torrents_path) - else: - logger.info() - if referer and post: - logger.info('REFERER: ' + referer) - - torrent_file = '' - t_hash = '' - if referer: - headers.update({'Content-Type': 'application/x-www-form-urlencoded', 'Referer': referer}) #Necesario para el Post del .Torrent - - """ - Descarga en el path recibido el .torrent de la url recibida, y pasa el decode - Devuelve el path real del .torrent, o el path vacío si la operación no ha tenido éxito - """ - - videolibrary_path = config.get_videolibrary_path() #Calculamos el path absoluto a partir de la Videoteca - if torrents_path == None: - if not videolibrary_path: - torrents_path = '' - if data_torrent: - return (torrents_path, torrent_file) - return torrents_path #Si hay un error, devolvemos el "path" vacío - torrents_path = filetools.join(videolibrary_path, 'temp_torrents_Alfa', 'cliente_torrent_Alfa.torrent') #path de descarga temporal - if '.torrent' not in torrents_path: - torrents_path += '.torrent' #path para dejar el .torrent - #torrents_path_encode = filetools.encode(torrents_path) #encode utf-8 del path - torrents_path_encode = torrents_path - - #if url.endswith(".rar") or url.startswith("magnet:"): #No es un archivo .torrent - if url.endswith(".rar"): #No es un archivo .torrent - logger.error('No es un archivo Torrent: ' + url) - torrents_path = '' - if data_torrent: - return (torrents_path, torrent_file) - return torrents_path #Si hay un error, devolvemos el "path" vacío - - try: - #Descargamos el .torrent - if url.startswith("magnet:"): - if config.get_setting("magnet2torrent", server="torrent", default=False): - torrent_file = magnet2torrent(url, headers=headers) #Convierte el Magnet en un archivo Torrent - else: - if data_torrent: - return (url, torrent_file) - return url - if not torrent_file: - logger.error('No es un archivo Magnet: ' + url) - torrents_path = '' - if data_torrent: - return (torrents_path, torrent_file) - return torrents_path #Si hay un error, devolvemos el "path" vacío - else: - if lookup: - proxy_retries = 0 - if post: #Descarga con POST - response = httptools.downloadpage(url, headers=headers, post=post, \ - follow_redirects=False, timeout=timeout, proxy_retries=proxy_retries) - else: #Descarga sin post - response = httptools.downloadpage(url, headers=headers, timeout=timeout, \ - proxy_retries=proxy_retries) - if not response.sucess: - logger.error('Archivo .torrent no encontrado: ' + url) - torrents_path = '' - if data_torrent: - return (torrents_path, torrent_file) - return torrents_path #Si hay un error, devolvemos el "path" vacío - torrent_file = response.data - torrent_file_uncoded = response.data - if PY3 and isinstance(torrent_file, bytes): - torrent_file = "".join(chr(x) for x in bytes(torrent_file_uncoded)) - - #Si es un archivo .ZIP tratamos de extraer el contenido - if torrent_file.startswith("PK"): - logger.info("it's a zip archive: " + url) - - torrents_path_zip = filetools.join(videolibrary_path, 'temp_torrents_zip') #Carpeta de trabajo - torrents_path_zip = filetools.encode(torrents_path_zip) - torrents_path_zip_file = filetools.join(torrents_path_zip, 'temp_torrents_zip.zip') #Nombre del .zip - - import time - filetools.rmdirtree(torrents_path_zip) #Borramos la carpeta temporal - time.sleep(1) #Hay que esperar, porque si no da error - filetools.mkdir(torrents_path_zip) #La creamos de nuevo - - if filetools.write(torrents_path_zip_file, torrent_file_uncoded, vfs=VFS): #Salvamos el .zip - torrent_file = '' #Borramos el contenido en memoria - try: #Extraemos el .zip - from core import ziptools - unzipper = ziptools.ziptools() - unzipper.extract(torrents_path_zip_file, torrents_path_zip) - except: - import xbmc - xbmc.executebuiltin('XBMC.Extract("%s", "%s")' % (torrents_path_zip_file, torrents_path_zip)) - time.sleep(1) - - for root, folders, files in filetools.walk(torrents_path_zip): #Recorremos la carpeta para leer el .torrent - for file in files: - if file.endswith(".torrent"): - input_file = filetools.join(root, file) #nombre del .torrent - torrent_file = filetools.read(input_file, vfs=VFS) #leemos el .torrent - torrent_file_uncoded = torrent_file - if PY3 and isinstance(torrent_file, bytes): - torrent_file = "".join(chr(x) for x in bytes(torrent_file_uncoded)) - - filetools.rmdirtree(torrents_path_zip) #Borramos la carpeta temporal - - #Si no es un archivo .torrent (RAR, HTML,..., vacío) damos error - if not scrapertools.find_single_match(torrent_file, '^d\d+:.*?\d+:'): - logger.error('No es un archivo Torrent: ' + url) - torrents_path = '' - if data_torrent: - return (torrents_path, torrent_file) - return torrents_path #Si hay un error, devolvemos el "path" vacío - - #Calculamos el Hash del Torrent y modificamos el path - import bencode, hashlib - - decodedDict = bencode.bdecode(torrent_file_uncoded) - if not PY3: - t_hash = hashlib.sha1(bencode.bencode(decodedDict[b"info"])).hexdigest() - else: - t_hash = hashlib.sha1(bencode.bencode(decodedDict["info"])).hexdigest() - - if t_hash: - torrents_path = filetools.join(filetools.dirname(torrents_path), t_hash + '.torrent') - torrents_path_encode = filetools.join(filetools.dirname(torrents_path_encode), t_hash + '.torrent') - - #Salvamos el .torrent - if not lookup: - if not filetools.write(torrents_path_encode, torrent_file_uncoded, vfs=VFS): - logger.error('ERROR: Archivo .torrent no escrito: ' + torrents_path_encode) - torrents_path = '' #Si hay un error, devolvemos el "path" vacío - torrent_file = '' #... y el buffer del .torrent - if data_torrent: - return (torrents_path, torrent_file) - return torrents_path - except: - torrents_path = '' #Si hay un error, devolvemos el "path" vacío - torrent_file = '' #... y el buffer del .torrent - logger.error('Error en el proceso de descarga del .torrent: ' + url + ' / ' + torrents_path_encode) - logger.error(traceback.format_exc()) - - #logger.debug(torrents_path) - if data_torrent: - return (torrents_path, torrent_file) - return torrents_path - - -def magnet2torrent(magnet, headers={}): - logger.info() - - torrent_file = '' - info = '' - post = '' - LIBTORRENT_PATH = config.get_setting("libtorrent_path", server="torrent", default="") - LIBTORRENT_MAGNET_PATH = filetools.join(config.get_setting("downloadpath"), 'magnet') - MAGNET2TORRENT = config.get_setting("magnet2torrent", server="torrent", default=False) - btih = scrapertools.find_single_match(magnet, 'urn:btih:([\w\d]+)\&').upper() - - if magnet.startswith('magnet') and MAGNET2TORRENT: - - # Tratamos de convertir el magnet on-line (opción más rápida, pero no se puede convertir más de un magnet a la vez) - url_list = [ - ('https://itorrents.org/torrent/', 6, '', '.torrent') - ] # Lista de servicios on-line testeados - for url, timeout, id, sufix in url_list: - if id: - post = '%s=%s' % (id, magnet) - else: - url = '%s%s%s' % (url, btih, sufix) - response = httptools.downloadpage(url, timeout=timeout, headers=headers, post=post) - if not response.sucess: - continue - if not scrapertools.find_single_match(response.data, '^d\d+:.*?\d+:') and not response.data.startswith("PK"): - continue - torrent_file = response.data - break - - #Usamos Libtorrent para la conversión del magnet como alternativa (es lento) - if not torrent_file: - lt, e, e1, e2 = import_libtorrent(LIBTORRENT_PATH) # Importamos Libtorrent - if lt: - ses = lt.session() # Si se ha importado bien, activamos Libtorrent - ses.add_dht_router("router.bittorrent.com",6881) - ses.add_dht_router("router.utorrent.com",6881) - ses.add_dht_router("dht.transmissionbt.com",6881) - if ses: - filetools.mkdir(LIBTORRENT_MAGNET_PATH) # Creamos la carpeta temporal - params = { - 'save_path': LIBTORRENT_MAGNET_PATH, - 'trackers': trackers, - 'storage_mode': lt.storage_mode_t.storage_mode_allocate - } # Creamos los parámetros de la sesión - - h = lt.add_magnet_uri(ses, magnet, params) # Abrimos la sesión - i = 0 - while not h.has_metadata() and not xbmc.abortRequested: # Esperamos mientras Libtorrent abre la sesión - h.force_dht_announce() - time.sleep(1) - i += 1 - logger.error(i) - if i > 5: - LIBTORRENT_PATH = '' # No puede convertir el magnet - break - - if LIBTORRENT_PATH: - info = h.get_torrent_info() # Obtiene la información del .torrent - torrent_file = lt.bencode(lt.create_torrent(info).generate()) # Obtiene los datos del .torrent - ses.remove_torrent(h) # Desactiva Libtorrent - filetools.rmdirtree(LIBTORRENT_MAGNET_PATH) # Elimina la carpeta temporal - - return torrent_file - - -def verify_url_torrent(url, timeout=5): - """ - Verifica si el archivo .torrent al que apunta la url está disponible, descargándolo en un area temporal - Entrada: url - Salida: True o False dependiendo del resultado de la operación - """ - - if not url or url == 'javascript:;': #Si la url viene vacía... - return False #... volvemos con error - torrents_path = caching_torrents(url, timeout=timeout, lookup=True) #Descargamos el .torrent - if torrents_path: #Si ha tenido éxito... - return True - else: - return False - - -# Reproductor Cliente Torrent propio (libtorrent) -def bt_client(mediaurl, xlistitem, rar_files, subtitle=None, password=None, item=None): - logger.info() - - # Importamos el cliente - from btserver import Client - - played = False - debug = False - - try: - save_path_videos = '' - save_path_videos = filetools.join(config.get_setting("bt_download_path", server="torrent", \ - default=config.get_setting("downloadpath")), 'BT-torrents') - except: - pass - if not config.get_setting("bt_download_path", server="torrent") and save_path_videos: - config.set_setting("bt_download_path", filetools.join(config.get_data_path(), 'downloads'), server="torrent") - if not save_path_videos: - save_path_videos = filetools.join(config.get_data_path(), 'downloads', 'BT-torrents') - config.set_setting("bt_download_path", filetools.join(config.get_data_path(), 'downloads'), server="torrent") - - UNRAR = config.get_setting("unrar_path", server="torrent", default="") - BACKGROUND = config.get_setting("mct_background_download", server="torrent", default=True) - RAR = config.get_setting("mct_rar_unpack", server="torrent", default=True) - try: - BUFFER = int(config.get_setting("bt_buffer", server="torrent", default="50")) - except: - BUFFER = 50 - DOWNLOAD_LIMIT = config.get_setting("mct_download_limit", server="torrent", default="") - if DOWNLOAD_LIMIT: - try: - DOWNLOAD_LIMIT = int(DOWNLOAD_LIMIT) - except: - DOWNLOAD_LIMIT = 0 - else: - DOWNLOAD_LIMIT = 0 - UPLOAD_LIMIT = 100 - - torr_client = 'BT' - rar_file = '' - rar_names = [] - rar = False - rar_res = False - bkg_user = False - video_names = [] - video_file = '' - video_path = '' - videourl = '' - msg_header = 'KoD %s Client Torrent' % torr_client - extensions_list = ['.aaf', '.3gp', '.asf', '.avi', '.flv', '.mpeg', - '.m1v', '.m2v', '.m4v', '.mkv', '.mov', '.mpg', - '.mpe', '.mp4', '.ogg', '.rar', '.wmv', '.zip'] - - for entry in rar_files: - for file, path in list(entry.items()): - if file == 'path' and '.rar' in str(path): - for file_r in path: - rar_names += [file_r] - rar = True - if RAR and BACKGROUND: - bkg_user = True - elif file == 'path' and not '.rar' in str(path): - for file_r in path: - if os.path.splitext(file_r)[1] in extensions_list: - video_names += [file_r] - elif file == '__name': - video_path = path - video_file = path - if rar: rar_file = '%s/%s' % (video_path, rar_names[0]) - erase_file_path = filetools.join(save_path_videos, video_path) - video_path = erase_file_path - if video_names: video_file = video_names[0] - if not video_file and mediaurl.startswith('magnet'): - video_file = urllib.unquote_plus(scrapertools.find_single_match(mediaurl, '(?:\&|&)dn=([^\&]+)\&')) - erase_file_path = filetools.join(save_path_videos, video_file) - - if rar and RAR and not UNRAR: - if not platformtools.dialog_yesno(msg_header, config.get_localized_string(70791)): - return - - # Iniciamos el cliente: - c = Client(url=mediaurl, is_playing_fnc=xbmc_player.isPlaying, wait_time=None, auto_shutdown=False, timeout=10, - temp_path=save_path_videos, print_status=debug, auto_delete=False) - - activo = True - finalizado = False - dp_cerrado = True - - # Mostramos el progreso - if rar and RAR and BACKGROUND: # Si se descarga un RAR... - progreso = platformtools.dialog_progress_bg(msg_header) - platformtools.dialog_notification(config.get_localized_string(70790), config.get_localized_string(70769), time=10000) - else: - progreso = platformtools.dialog_progress('%s Torrent Client' % torr_client, '') - dp_cerrado = False - - # Mientras el progreso no sea cancelado ni el cliente cerrado - try: - while not c.closed and not xbmc.abortRequested: - # Obtenemos el estado del torrent - s = c.status - if debug: - # Montamos las tres lineas con la info del torrent - txt = '%.2f%% de %.1fMB %s | %.1f kB/s' % \ - (s.progress_file, s.file_size, s.str_state, s._download_rate) - txt2 = 'S: %d(%d) P: %d(%d) | DHT:%s (%d) | Trakers: %d | Pi: %d(%d)' % \ - (s.num_seeds, s.num_complete, s.num_peers, s.num_incomplete, s.dht_state, s.dht_nodes, - s.trackers, s.pieces_sum, s.pieces_len) - txt3 = 'Origen Peers TRK: %d DHT: %d PEX: %d LSD %d ' % \ - (s.trk_peers, s.dht_peers, s.pex_peers, s.lsd_peers) - else: - txt = '%.2f%% de %.1fMB %s | %.1f kB/s' % \ - (s.progress_file, s.file_size, s.str_state, s._download_rate) - txt2 = 'S: %d(%d) P: %d(%d) | DHT:%s (%d) | Trakers: %d | Pi: %d(%d)' % \ - (s.num_seeds, s.num_complete, s.num_peers, s.num_incomplete, s.dht_state, s.dht_nodes, - s.trackers, s.pieces_sum, s.pieces_len) - txt3 = video_file - - if rar and RAR and BACKGROUND or bkg_user: - progreso.update(s.buffer, txt, txt2) - else: - progreso.update(s.buffer, txt, txt2, txt3) - time.sleep(1) - - if (not bkg_user and progreso.iscanceled()) and (not (rar and RAR and BACKGROUND) and progreso.iscanceled()): - - if not dp_cerrado: - progreso.close() - dp_cerrado = True - if 'Finalizado' in s.str_state or 'Seeding' in s.str_state: - """ - if not rar and platformtools.dialog_yesno(msg_header, config.get_localized_string(70198)): - played = False - dp_cerrado = False - progreso = platformtools.dialog_progress(msg_header, '') - progreso.update(s.buffer, txt, txt2, txt3) - else: - """ - dp_cerrado = False - progreso = platformtools.dialog_progress(msg_header, '') - break - - else: - if not platformtools.dialog_yesno(msg_header, config.get_localized_string(30031), config.get_localized_string(30032)): - dp_cerrado = False - progreso = platformtools.dialog_progress(msg_header, '') - break - - else: - bkg_user = True - if not dp_cerrado: progreso.close() - dp_cerrado = False - progreso = platformtools.dialog_progress_bg(msg_header) - progreso.update(s.buffer, txt, txt2) - if not c.closed: - c.set_speed_limits(DOWNLOAD_LIMIT, UPLOAD_LIMIT) # Bajamos la velocidad en background - - # Si el buffer se ha llenado y la reproduccion no ha sido iniciada, se inicia - if ((s.pieces_sum >= BUFFER or 'Finalizado' in s.str_state or 'Seeding' in s.str_state) and not rar and not bkg_user) or \ - (s.pieces_sum >= s.pieces_len - 3 and s.pieces_len > 0 and ('Finalizado' in s.str_state or 'Seeding' \ - in s.str_state) and (rar or bkg_user)) and not played: - - if rar and RAR and UNRAR: - c.stop() - activo = False - finalizado = True - bkg_user = False - dp_cerrado = False - video_file, rar_res, video_path, erase_file_path = extract_files(rar_file, \ - save_path_videos, password, progreso, item, torr_client) # ... extraemos el vídeo del RAR - if rar_res and not xbmc.abortRequested: - time.sleep(1) - else: - break - elif (rar and not UNRAR) or (rar and not RAR): - break - elif bkg_user: - finalizado = True - break - - # Cerramos el progreso - if not dp_cerrado: - progreso.close() - dp_cerrado = True - - # Reproducimos el vídeo extraido, si no hay nada en reproducción - if not c.closed: - c.set_speed_limits(DOWNLOAD_LIMIT, UPLOAD_LIMIT) # Bajamos la velocidad en background - bkg_auto = True - while xbmc_player.isPlaying() and not xbmc.abortRequested: - time.sleep(3) - - # Obtenemos el playlist del torrent - #videourl = c.get_play_list() - if not rar_res: # Es un Magnet ? - video_file = filetools.join(save_path_videos, s.file_name) - if erase_file_path == save_path_videos: - erase_file_path = video_file - videourl = video_file - else: - videourl = filetools.join(video_path, video_file) - - # Iniciamos el reproductor - playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) - playlist.clear() - playlist.add(videourl, xlistitem) - # xbmc_player = xbmc_player - log("##### videourl: %s" % videourl) - xbmc_player.play(playlist) - - # Marcamos como reproducido para que no se vuelva a iniciar - played = True - - mark_auto_as_watched(item) - - # Y esperamos a que el reproductor se cierre - bkg_auto = True - dp_cerrado = True - while xbmc_player.isPlaying() and not xbmc.abortRequested: - time.sleep(1) - - if xbmc.getCondVisibility('Player.Playing'): - if not dp_cerrado: - dp_cerrado = True - progreso.close() - - if xbmc.getCondVisibility('Player.Paused') and not rar_res: - if not c.closed: s = c.status - txt = '%.2f%% de %.1fMB %s | %.1f kB/s' % \ - (s.progress_file, s.file_size, s.str_state, s._download_rate) - txt2 = 'S: %d(%d) P: %d(%d) | DHT:%s (%d) | Trakers: %d | Pi: %d(%d)' % \ - (s.num_seeds, s.num_complete, s.num_peers, s.num_incomplete, s.dht_state, s.dht_nodes, - s.trackers, s.pieces_sum, s.pieces_len) - txt3 = video_file[:99] - if dp_cerrado: - dp_cerrado = False - progreso = xbmcgui.DialogProgressBG() - progreso.create(msg_header) - progreso.update(s.buffer, msg_header, '[CR][CR]' + txt + '[CR]' + txt2) - - if not dp_cerrado: - dp_cerrado = True - progreso.close() - - # Miramos si se ha completado la descarga para borrar o no los archivos - if activo: - s = c.status - if s.pieces_sum == s.pieces_len: - finalizado = True - break - - if not platformtools.dialog_yesno(msg_header, config.get_localized_string(30031), config.get_localized_string(30032)): - progreso = platformtools.dialog_progress(msg_header, '') - dp_cerrado = False - break - else: - bkg_user = True - played = False - if not dp_cerrado: progreso.close() - progreso = platformtools.dialog_progress_bg(msg_header) - progreso.update(s.buffer, txt, txt2) - dp_cerrado = False - continue - - # Cuando este cerrado, Volvemos a mostrar el dialogo - if not (rar and bkg_user): - progreso = platformtools.dialog_progress(msg_header, '') - progreso.update(s.buffer, txt, txt2, txt3) - dp_cerrado = False - - break - except: - logger.error(traceback.format_exc(1)) - return - - if not dp_cerrado: - if rar or bkg_user: - progreso.update(100, config.get_localized_string(70200), " ") - else: - progreso.update(100, config.get_localized_string(70200), " ", " ") - - # Detenemos el cliente - if activo and not c.closed: - c.stop() - activo = False - - # Cerramos el progreso - if not dp_cerrado: - progreso.close() - dp_cerrado = True - - # Y borramos los archivos de descarga restantes - time.sleep(1) - if filetools.exists(erase_file_path) and not bkg_user: - if finalizado and not platformtools.dialog_yesno(msg_header, config.get_localized_string(70792)): - return - log("##### erase_file_path: %s" % erase_file_path) - for x in range(10): - if filetools.isdir(erase_file_path): - if erase_file_path != save_path_videos: - filetools.rmdirtree(erase_file_path) - else: - break - else: - filetools.remove(erase_file_path) - time.sleep(5) - if not filetools.exists(erase_file_path): - break - - -def call_torrent_via_web(mediaurl, torr_client): - # Usado para llamar a los clientes externos de Torrents para automatizar la descarga de archivos que contienen .RAR - logger.info() - - post = '' - ELEMENTUMD_HOST = "http://localhost:65220" - if torr_client == 'elementum': - try: - ADDON = xbmcaddon.Addon("plugin.video.elementum") - except: - ADDON = False - if ADDON: - ELEMENTUMD_HOST = "http://" + ADDON.getSetting("remote_host") + ":" + ADDON.getSetting("remote_port") - - local_host = {"quasar": ["http://localhost:65251/torrents/", "add?uri"], \ - "elementum": ["%s/torrents/" % ELEMENTUMD_HOST, "add"]} - - if torr_client == "quasar": - uri = '%s%s=%s' % (local_host[torr_client][0], local_host[torr_client][1], mediaurl) - elif torr_client == "elementum": - uri = '%s%s' % (local_host[torr_client][0], local_host[torr_client][1]) - post = 'uri=%s&file=null&all=1' % mediaurl - - if post: - response = httptools.downloadpage(uri, post=post, timeout=5, alfa_s=True, ignore_response_code=True) - else: - response = httptools.downloadpage(uri, timeout=5, alfa_s=True, ignore_response_code=True) - - return response.sucess - - def mark_auto_as_watched(item): - time_limit = time.time() + 150 #Marcamos el timepo máx. de buffering - while not platformtools.is_playing() and time.time() < time_limit: #Esperamos mientra buffera - time.sleep(5) #Repetimos cada intervalo - #logger.debug(str(time_limit)) + time_limit = time.time() + 150 + while not platformtools.is_playing() and time.time() < time_limit: + time.sleep(5) if item.subtitle: time.sleep(5) xbmc_player.setSubtitles(item.subtitle) - #subt = xbmcgui.ListItem(path=item.url, thumbnailImage=item.thumbnail) - #subt.setSubtitles([item.subtitle]) - if item.strm_path and platformtools.is_playing(): #Sólo si es de Videoteca + if item.strm_path and platformtools.is_playing(): from platformcode import xbmc_videolibrary - xbmc_videolibrary.mark_auto_as_watched(item) #Marcamos como visto al terminar - #logger.debug("Llamado el marcado") + xbmc_videolibrary.mark_auto_as_watched(item) -def wait_for_download(item, mediaurl, rar_files, torr_client, password='', size='', rar_control={}): - logger.info() - - from subprocess import Popen, PIPE, STDOUT - - # Analizamos los archivos dentro del .torrent - rar = False - rar_names = [] - rar_names_abs = [] - folder = '' - if rar_control: - for x, entry in enumerate(rar_control['rar_files']): - if '__name' in entry: - folder = rar_control['rar_files'][x]['__name'] - break - rar_names = [rar_control['rar_names'][0]] +def setting(): + if xbmc.getCondVisibility('System.HasAddon("plugin.video.elementum")') == 1: + elementum_setting = xbmcaddon.Addon(id='plugin.video.elementum') + elementum_host = 'http://127.0.0.1:' + elementum_setting.getSetting('remote_port') + '/torrents/' + TorrentPath = xbmc.translatePath(elementum_setting.getSetting('torrents_path')) else: - for entry in rar_files: - for file, path in list(entry.items()): - if file == 'path' and '.rar' in str(path): - for file_r in path: - rar_names += [file_r] - rar = True - elif file == '__name': - folder = path + elementum_setting = '' + elementum_host = '' + TorrentPath = '' + return elementum_setting, elementum_host, TorrentPath - if not folder: # Si no se detecta el folder... - return ('', '', '') # ... no podemos hacer nada - if not rar_names: - return ('', '', folder) - rar_file = '%s/%s' % (folder, rar_names[0]) - log("##### rar_file: %s" % rar_file) - if len(rar_names) > 1: - log("##### rar_names: %s" % str(rar_names)) +def elementum_download(item): + elementum_setting, elementum_host, TorrentPath = setting() - # Localizamos el path de descarga del .torrent - save_path_videos = '' - __settings__ = xbmcaddon.Addon(id="plugin.video.%s" % torr_client) # Apunta settings del cliente torrent - if torr_client == 'torrenter': - save_path_videos = str(xbmc.translatePath(__settings__.getSetting('storage'))) - if not save_path_videos: - save_path_videos = str(filetools.join(xbmc.translatePath("special://home/"), \ - "cache", "xbmcup", "plugin.video.torrenter", "Torrenter")) - else: - save_path_videos = str(xbmc.translatePath(__settings__.getSetting('download_path'))) - if __settings__.getSetting('download_storage') == '1': # Descarga en memoria? - return ('', '', folder) # volvemos - if not save_path_videos: # No hay path de descarga? - return ('', '', folder) # Volvemos - log("##### save_path_videos: %s" % save_path_videos) + if elementum_setting: + set_elementum(True) + time.sleep(3) + TorrentName = match(item.url, patron=r'btih(?::|%3A)([^&%]+)', string=True).match + post = 'uri=%s&file=null&all=1' % urllib.quote_plus(item.url) + match(elementum_host + 'add', post=post, timeout=5, alfa_s=True, ignore_response_code=True) + while not filetools.isfile(filetools.join(elementum_setting.getSetting('torrents_path'), TorrentName + '.torrent')): + time.sleep(1) - # Si es nueva descarga, ponemos un archivo de control para reiniciar el UNRar si ha habido cancelación de Kodi - # Si ya existe el archivo (llamada), se reinicia el proceso de UNRar donde se quedó - if rar_control: - if 'downloading' not in rar_control['status']: - log("##### Torrent DESCARGADO Anteriormente: %s" % str(folder)) - return (rar_file, save_path_videos, folder) - else: - rar_control = { - 'torr_client': torr_client, - 'rar_files': rar_files, - 'rar_names': rar_names, - 'size': size, - 'password': password, - 'download_path': filetools.join(save_path_videos, folder), - 'status': 'downloading', - 'error': 0, - 'error_msg': '', - 'item': item.tourl(), - 'mediaurl': mediaurl - } + monitor_update(TorrentPath, TorrentName) - if torr_client == 'quasar': # Quasar no copia en .torrent - ret = filetools.copy(item.url, filetools.join(save_path_videos, 'torrents', \ - filetools.basename(item.url)), silent=True) - # Esperamos mientras el .torrent se descarga. Verificamos si el .RAR está descargado al completo - platformtools.dialog_notification(config.get_localized_string(70803), "", time=10000) +def elementum_monitor(): + path = xbmc.translatePath(config.get_setting('downloadlistpath')) + elementum_setting, elementum_host, TorrentPath = setting() + active_torrent = filetools.listdir(TorrentPath) - # Plan A: usar el monitor del cliente torrent para ver el status de la descarga - loop = 3600 # Loop de 10 horas hasta crear archivo - wait_time = 10 - time.sleep(wait_time) - fast = False - ret = filetools.write(filetools.join(rar_control['download_path'], '_rar_control.json'), jsontools.dump(rar_control)) - - for x in range(loop): - if xbmc.abortRequested: - return ('', '', folder) - torr_data, deamon_url, index = get_tclient_data(folder, torr_client) - if not torr_data or not deamon_url: - if len(filetools.listdir(rar_control['download_path'], silent=True)) <= 1: - filetools.remove(filetools.join(rar_control['download_path'], '_rar_control.json'), silent=True) - filetools.rmdir(rar_control['download_path'], silent=True) - return ('', '', folder) # Volvemos - if (torr_client in ['quasar'] or torr_client in ['elementum']) and not \ - torr_data['label'].startswith('0.00%') and not fast: - platformtools.dialog_notification(config.get_localized_string(60200), config.get_localized_string(70769), time=10000) - fast = True - if not torr_data['label'].startswith('100.00%'): - log("##### Downloading: %s, ID: %s" % (scrapertools.find_single_match(torr_data['label'], '(^.*?\%)'), index)) - time.sleep(wait_time) - continue - - update_rar_control(rar_control['download_path'], status='downloaded') - log("##### Torrent FINALIZED: %s" % str(folder)) - return (rar_file, save_path_videos, folder) - - # Plan B: monitorizar con UnRAR si los archivos se han desacargado por completo - unrar_path = config.get_setting("unrar_path", server="torrent", default="") - if not unrar_path: # Si Unrar no está instalado... - return ('', '', folder) # ... no podemos hacer nada - - cmd = [] - for rar_name in rar_names: # Preparamos por si es un archivo multiparte - cmd.append(['%s' % unrar_path, 'l', '%s' % filetools.join(save_path_videos, folder, rar_name)]) - - creationflags = '' - if xbmc.getCondVisibility("system.platform.Windows"): - creationflags = 0x08000000 - loop = 30 # Loop inicial de 5 minutos hasta crear archivo - wait_time = 10 - loop_change = 0 - loop_error = 6 - part_name = '' - y = 0 - returncode = '' - fast = False - while rar and not xbmc.abortRequested: - for x in range(loop): # Loop corto (5 min.) o largo (10 h.) - if xbmc.abortRequested: - return ('', '', folder) - if not rar or loop_change > 0: - loop = loop_change # Paso de loop corto a largo - loop_change = 0 - break - try: - responses = [] - for z, command in enumerate(cmd): # Se prueba por cada parte - if xbmc.getCondVisibility("system.platform.Windows"): - data_rar = Popen(command, bufsize=0, stdout=PIPE, stdin=PIPE, \ - stderr=STDOUT, creationflags=creationflags) - else: - data_rar = Popen(command, bufsize=0, stdout=PIPE, stdin=PIPE, \ - stderr=STDOUT) - out_, error_ = data_rar.communicate() - responses.append([z, str(data_rar.returncode), out_, error_]) # Se guarda la respuesta de cada parte - except: - logger.error(traceback.format_exc(1)) # Error de incompatibilidad de UnRAR - rar = False - break - else: - dl_files = 0 - for z, returncode, out__, error__ in responses: # Analizamos las respuestas - if returncode == '0': # Ya se ha descargado... parte ... - dl_files += 1 - part_name = scrapertools.find_single_match(str(out__), '(\.part\d+.rar)') - log("##### Torrent downloading: %s, %s" % (part_name, str(returncode))) - if dl_files == len(cmd): # ... o todo - fast = True - rar = False - break # ... o sólo una parte - elif returncode == '10': # archivo no existe - if loop != 30: # Si el archivo es borrado durante el proceso ... - rar = False - break #... abortamos - elif returncode == '6': # En proceso de descarga - y += 1 - #if loop == 30 and y == len(responses): # Si es la primera vez en proceso ... - if loop == 30 and y == 1: # Si es la primera vez en proceso ... - if torr_client in ['quasar']: - platformtools.dialog_notification(config.get_localized_string(60200), config.get_localized_string(70769), time=10000) - loop_change = 3600 # ... pasamos a un loop de 10 horas - elif loop <= 6: # Recuerado el error desconocido - loop_change = 3600 # ... pasamos a un loop de 10 horas - loop_error = 6 # Restauramos loop_error por si acaso - break - elif returncode == '1': # Ha alcanzado el fin de archivo ??? pasamos - part_name = scrapertools.find_single_match(str(out__), '(\.part\d+.rar)') - log("##### Torrent downloading: %s, %s" % (part_name, str(returncode))) - else: # No entendemos el error - loop_change = loop_error # ... pasamos a un loop de 1 minutos para reintentar - loop_error += -1 - break #... abortamos - - if str(returncode) in ['0', '6', '10']: - log("##### Torrent downloading: %s" % str(returncode)) - else: - log("##### Torrent downloading: %s, %s" % (str(out__), str(returncode))) - if not rar or fast: - fast = False - break - time.sleep(wait_time) # Esperamos un poco y volvemos a empezar + if elementum_setting: + # check if command file exist + if filetools.isfile(monitor): + json = jsontools.load(open(monitor, "r").read()) + Monitor = json['monitor'] + # else create it else: - rar = False + Monitor = jsontools.load('{"monitor":{},"settings":{}}') + json = jsontools.dump(Monitor) + filetools.write(monitor, json, silent=True) + + if len(Monitor) > 0: + try: + data = requests.get(elementum_host + '/list').json() + except: + data = '' + if data: + for it in data: + progress = round(it['progress'], 2) + status = it['status'] + name = it['id'] + if name in Monitor: + jsontools.update_node(progress, Monitor[name]['file'], 'downloadProgress', path, silent=True) + jsontools.update_node(4, Monitor[name]['file'], 'downloadStatus', path, silent=True) + if status in ['Paused']: + jsontools.update_node(0, Monitor[name]['file'], 'downloadStatus', path, silent=True) + if status in ['Seeding', 'Finished'] and not config.get_setting('elementum_on_seed'): + monitor_update(TorrentPath, name, remove=True) + dlJson = jsontools.load(open(filetools.join(path, Monitor[name]['file']), "r").read()) + jsontools.update_node(dlJson['downloadSize'], Monitor[name]['file'], 'downloadCompleted', path, silent=True) + jsontools.update_node(2, Monitor[name]['file'], 'downloadStatus', path, silent=True) + requests.get(elementum_host + 'pause/' + name) + filetools.remove(filetools.join(TorrentPath, name + '.torrent')) + filetools.remove(filetools.join(TorrentPath, name + '.fastresume')) + # time.sleep(1) + # rename(Monitor[name]['file']) + + +def monitor_update(TorrentPath, value, remove=False): + elementum_setting, elementum_host, TorrentPath = setting() + json = jsontools.load(open(monitor, "r").read()) + Monitor = json['monitor'] + info = Torrent.from_file(filetools.join(TorrentPath, value + '.torrent')) + path = xbmc.translatePath(config.get_setting('downloadlistpath')) + + if not value in Monitor: + Monitor[value]={} + Monitor[value]['name'] = info.name + Monitor[value]['size'] = info.total_size + File = find_file(value) + Monitor[value]['file'] = File + json = jsontools.dump(json) + filetools.write(monitor, json, silent=True) + + backupFilename = jsontools.load(open(filetools.join(path, File), "r").read())['downloadFilename'] + jsontools.update_node(value, File, 'TorrentName', path, silent=True) + jsontools.update_node(info.total_size, File, 'downloadSize', path, silent=True) + jsontools.update_node(backupFilename, File, 'backupFilename', path, silent=True) + jsontools.update_node(info.name, File, 'downloadFilename', path, silent=True) + + elif remove: + Monitor.pop(value) + jsontools.dump(json) + filetools.write(monitor, jsontools.dump(json), silent=True) + + if len(Monitor) == 0: set_elementum() + + +def set_elementum(SET=False): + elementum_setting, elementum_host, TorrentPath = setting() + json = jsontools.load(open(monitor, "r").read()) + backup_setting = json['settings'] + write = False + if SET: + if elementum_setting.getSetting('logger_silent') == False or not 'logger_silent' in backup_setting: + elementum_setting.setSetting('logger_silent', 'true') + backup_setting['logger_silent'] = 'false' + + if elementum_setting.getSetting('download_storage') != 0 or not 'download_storage' in backup_setting: + backup_setting['download_storage'] = elementum_setting.getSetting('download_storage') # Backup Setting + elementum_setting.setSetting('download_storage', '0') # Set Setting + + if elementum_setting.getSetting('download_path') != config.get_setting('downloadpath') or not 'download_path' in backup_setting: + backup_setting['download_path'] = elementum_setting.getSetting('download_path') # Backup Setting + elementum_setting.setSetting('download_path', config.get_setting('downloadpath')) # Set Setting + write = True + + elif backup_setting: + elementum_setting.setSetting('logger_silent', backup_setting['logger_silent']) + elementum_setting.setSetting('download_storage', backup_setting['download_storage']) + elementum_setting.setSetting('download_path', backup_setting['download_path']) + json['settings'] = {} + write = True + if write: + json = jsontools.dump(json) + filetools.write(monitor, json, silent=True) + time.sleep(1) + + +def find_file(hash): + path = xbmc.translatePath(config.get_setting('downloadlistpath')) + files = filetools.listdir(path) + for f in files: + filepath = filetools.join(path, f) + json = jsontools.load(filetools.read(filepath)) + if ('downloadServer' in json and 'url' in json['downloadServer'] and hash in json['downloadServer']['url']) or ('url' in json and hash in json['url']): break + return filetools.split(filepath)[-1] - if str(returncode) == '0': - log("##### Torrent FINALIZED: %s" % str(returncode)) + +def elementum_actions(parameter, TorrentHash): + elementum_setting, elementum_host, TorrentPath = setting() + if elementum_setting: + if parameter == 'delete': monitor_update(TorrentPath, TorrentHash, remove=True) + requests.get('%s/%s/%s' %(elementum_host, parameter, TorrentHash)) + + +def process_filename(filename, Title, ext=True): + extension = os.path.splitext(filename)[-1] + parsedTitle = guessit(filename) + t = parsedTitle.get('title', '') + episode = '' + s = ' - ' + if parsedTitle.get('episode') and parsedTitle.get('season'): + if type(parsedTitle.get('season')) == list: + episode += str(parsedTitle.get('season')[0]) + '-' + str(parsedTitle.get('season')[-1]) + else: + episode += str(parsedTitle.get('season')) + + if type(parsedTitle.get('episode')) == list: + episode += 'x' + str(parsedTitle.get('episode')[0]).zfill(2) + '-' + str(parsedTitle.get('episode')[-1]).zfill(2) + else: + episode += 'x' + str(parsedTitle.get('episode')).zfill(2) + elif parsedTitle.get('season') and type(parsedTitle.get('season')) == list: + episode += s + config.get_localized_string(30140) + " " +str(parsedTitle.get('season')[0]) + '-' + str(parsedTitle.get('season')[-1]) + elif parsedTitle.get('season'): + episode += s + config.get_localized_string(60027) % str(parsedTitle.get('season')) + if parsedTitle.get('episode_title'): + episode += s + parsedTitle.get('episode_title') + title = (t if t else Title) + s + episode + (extension if ext else '') + return title + + +def rename(File): + jsonPath = xbmc.translatePath(config.get_setting('downloadlistpath')) + json = jsontools.load(open(filetools.join(jsonPath, File), "r").read()) + filePath = filetools.join(xbmc.translatePath(config.get_setting('downloadpath')), json['downloadFilename']) + + if json['infoLabels']['mediatype'] == 'movie': + if filetools.isdir(filePath): + extension = '' + files = filetools.listdir(filePath) + oldName = json['downloadFilename'] + newName = json['backupFilename'] + for f in files: + ext = os.path.splitext(f)[-1] + if ext in extensions_list: extension = ext + filetools.rename(filetools.join(filePath, f), f.replace(oldName, newName)) + filetools.rename(filePath, newName) + jsontools.update_node(filetools.join(newName, newName + extension), File, 'downloadFilename', jsonPath) + + else: + oldName = json['downloadFilename'] + newName = json['backupFilename'] + os.path.splitext(oldName)[-1] + filetools.rename(filePath, newName) + jsontools.update_node(newName, File, 'downloadFilename', jsonPath) else: - rar_file = '' - logger.error('##### Torrent NO DESCARGADO: %s, %s' % (str(out__), str(returncode))) + sep = '/' if filePath.lower().startswith("smb://") else os.sep + FolderName = json['backupFilename'].split(sep)[0] + Title = re.sub(r'(\s*\[[^\]]+\])', '', FolderName) + if filetools.isdir(filePath): + files = filetools.listdir(filePath) + file_dict = {} + for f in files: + title = process_filename(f, Title, ext=False) + ext = os.path.splitext(f)[-1] + name = os.path.splitext(f)[0] + if title not in file_dict and ext in extensions_list: + file_dict[title] = name - return (rar_file, save_path_videos, folder) + for title, name in file_dict.items(): + for f in files: + if name in f: + filetools.rename(filetools.join(filePath, f), f.replace(name, title)) - -def get_tclient_data(folder, torr_client): - - # Monitoriza el estado de descarga del torrent en Quasar y Elementum - ELEMENTUMD_HOST = "http://localhost:65220" - if torr_client == 'elementum': - try: - ADDON = xbmcaddon.Addon("plugin.video.elementum") - except: - ADDON = False - if ADDON: - ELEMENTUMD_HOST = "http://" + ADDON.getSetting("remote_host") + ":" + ADDON.getSetting("remote_port") - - local_host = {"quasar": "http://localhost:65251/torrents/", "elementum": "%s/torrents/" % ELEMENTUMD_HOST} - torr = '' - torr_id = '' - x = 0 - y = '' - - try: - data = httptools.downloadpage(local_host[torr_client], timeout=5, alfa_s=True).data - if not data: - return '', local_host[torr_client], 0 - - data = jsontools.load(data) - data = data['items'] - for x, torr in enumerate(data): - if not folder in torr['label']: - continue - if "elementum" in torr_client: - torr_id = scrapertools.find_single_match(str(torr), 'torrents\/move\/(.*?)\)') - break + filetools.rename(filePath, FolderName) + jsontools.update_node(FolderName, File, 'downloadFilename', jsonPath) else: - return '', local_host[torr_client], 0 - except: - log(traceback.format_exc(1)) - return '', local_host[torr_client], 0 - - if torr_id: - y = torr_id - else: - y = x - return torr, local_host[torr_client], y - - -def extract_files(rar_file, save_path_videos, password, dp, item=None, \ - torr_client=None, rar_control={}, size='RAR', mediaurl=''): - logger.info() - - from platformcode import custom_code - - if not rar_control: - rar_control = { - 'torr_client': torr_client, - 'rar_files': [{"__name": "%s" % rar_file.split("/")[0]}], - 'rar_names': [filetools.basename(rar_file)], - 'size': size, - 'password': password, - 'download_path': save_path_videos, - 'status': 'downloaded', - 'error': 0, - 'error_msg': '', - 'item': item.tourl(), - 'mediaurl': mediaurl - } - ret = filetools.write(filetools.join(rar_control['download_path'], '_rar_control.json'), jsontools.dump(rar_control)) - - #reload(sys) - #sys.setdefaultencoding('utf-8') - sys.path.insert(0, config.get_setting("unrar_path", server="torrent", default="")\ - .replace('/unrar', '').replace('\\unrar,exe', '')) - - import rarfile - - # Verificamos si hay path para UnRAR - rarfile.UNRAR_TOOL = config.get_setting("unrar_path", server="torrent", default="") - if not rarfile.UNRAR_TOOL: - if xbmc.getCondVisibility("system.platform.Android"): - rarfile.UNRAR_TOOL = xbmc.executebuiltin("StartAndroidActivity(com.rarlab.rar)") - return rar_file, False, '', '' - log("##### unrar_path: %s" % rarfile.UNRAR_TOOL) - rarfile.DEFAULT_CHARSET = 'utf-8' - - # Preparamos un path alternativo más corto para no sobrepasar la longitud máxima - video_path = '' - if item: - if item.contentType == 'movie': - video_path = '%s-%s' % (item.contentTitle, item.infoLabels['tmdb_id']) - else: - video_path = '%s-%sx%s-%s' % (item.contentSerieName, item.contentSeason, \ - item.contentEpisodeNumber, item.infoLabels['tmdb_id']) - video_path = video_path.replace("á", "a").replace("é", "e").replace("í", "i").replace("ó", "o")\ - .replace("ú", "u").replace("ü", "u").replace("ñ", "n")\ - .replace("Á", "A").replace("É", "E").replace("Í", "I").replace("Ó", "O")\ - .replace("Ú", "U").replace("Ü", "U").replace("Ñ", "N") - - # Renombramos el path dejado en la descarga a uno más corto - rename_status = False - org_rar_file = rar_file - org_save_path_videos = save_path_videos - if video_path and '/' in rar_file: - log("##### rar_file: %s" % rar_file) - rename_status, rar_file = rename_rar_dir(org_rar_file, org_save_path_videos, video_path, torr_client) - - # Calculamos el path para del RAR - if "/" in rar_file: - folders = rar_file.split("/") - erase_file_path = filetools.join(save_path_videos, folders[0]) - file_path = save_path_videos - for f in folders: - file_path = filetools.join(file_path, f) - else: - file_path = save_path_videos - erase_file_path = save_path_videos - - # Calculamos el path para la extracción - if "/" in rar_file: - folders = rar_file.split("/") - for f in folders: - if not '.rar' in f: - save_path_videos = filetools.join(save_path_videos, f) - save_path_videos = filetools.join(save_path_videos, 'Extracted') - if not filetools.exists(save_path_videos): filetools.mkdir(save_path_videos) - log("##### save_path_videos: %s" % save_path_videos) - - rar_control = update_rar_control(erase_file_path, status='UnRARing') - - # Permite hasta 5 pasadas de extracción de .RARs anidados - platformtools.dialog_notification(config.get_localized_string(70793), rar_file, time=5000) - for x in range(5): - try: - if not PY3: - archive = rarfile.RarFile(file_path.decode("utf8")) - else: - archive = rarfile.RarFile(file_path) - except: - log("##### ERROR in rar archive: %s" % rar_file) - log("##### ERROR in rar folder: %s" % file_path) - log(traceback.format_exc()) - error_msg = config.get_localized_string(70796) - error_msg1 = config.get_localized_string(60015) - platformtools.dialog_notification(error_msg, error_msg1) - rar_control = update_rar_control(erase_file_path, error=True, error_msg=error_msg, status='ERROR') - return rar_file, False, '', '' - - # Analizamos si es necesaria una contraseña, que debería estar en item.password - if archive.needs_password(): - if not password: - pass_path = filetools.split(file_path)[0] - password = last_password_search(pass_path, erase_file_path) - if not password : - password = platformtools.dialog_input(heading=config.get_localized_string(70794) % pass_path) - if not password: - error_msg = config.get_localized_string(60309) - rar_control = update_rar_control(erase_file_path, error=True, error_msg=error_msg, status='ERROR') - dp.close() - return custom_code.reactivate_unrar(init=False, mute=False) - archive.setpassword(password) - log("##### Password rar: %s" % password) - - # Miramos el contenido del RAR a extraer - files = archive.infolist() - info = [] - for idx, i in enumerate(files): - if i.file_size == 0: - files.pop(idx) - continue - filename = i.filename - if "/" in filename: - filename = filename.rsplit("/", 1)[1] - - info.append("%s - %.2f MB" % (filename, i.file_size / 1048576.0)) - if info: - info.append(config.get_localized_string(70801)) - else: - error_msg = config.get_localized_string(70797) - error_msg1 = config.get_localized_string(70798) - platformtools.dialog_notification(error_msg, error_msg1) - rar_control = update_rar_control(erase_file_path, error=True, error_msg=error_msg, status='ERROR') - dp.close() - return custom_code.reactivate_unrar(init=False, mute=False) - - # Seleccionamos extraer TODOS los archivos del RAR - #selection = xbmcgui.Dialog().select("Selecciona el fichero a extraer y reproducir", info) - selection = len(info) - 1 - if selection < 0: - error_msg = config.get_localized_string(70797) - platformtools.dialog_notification(error_msg) - rar_control = update_rar_control(erase_file_path, error=True, error_msg=error_msg, status='ERROR') - return rar_file, False, '', '' - else: - try: - log("##### RAR Extract INI #####") - if selection == len(info) - 1: - log("##### rar_file 1: %s" % file_path) - log("##### save_path_videos 1: %s" % save_path_videos) - dp.update(99, config.get_localized_string(70803), config.get_localized_string(70802)) - archive.extractall(save_path_videos) - else: - log("##### rar_file 2: %s" % file_path) - log("##### save_path_videos 2: %s" % save_path_videos) - dp.update(99, config.get_localized_string(70802), config.get_localized_string(70803) + " %s" % info[selection]) - archive.extract(files[selection], save_path_videos) - log("##### RAR Extract END #####") - except (rarfile.RarWrongPassword, rarfile.RarCRCError): - log(traceback.format_exc(1)) - error_msg = config.get_localized_string(70799) - error_msg1 = config.get_localized_string(60309) - platformtools.dialog_notification(error_msg, error_msg1) - rar_control = update_rar_control(erase_file_path, error=True, error_msg=error_msg1, status='ERROR') - dp.close() - return custom_code.reactivate_unrar(init=False, mute=False) - except rarfile.BadRarFile: - log(traceback.format_exc(1)) - error_msg = config.get_localized_string(70799) - error_msg1 = config.get_localized_string(60800) - platformtools.dialog_notification(error_msg, error_msg1) - rar_control = update_rar_control(erase_file_path, error=True, error_msg=error_msg1, status='ERROR') - #return rar_file, False, '', erase_file_path - dp.close() - return custom_code.reactivate_unrar(init=False, mute=False) - except: - log(traceback.format_exc(1)) - error_msg = config.get_localized_string(70799) - error_msg1 = config.get_localized_string(60015) - platformtools.dialog_notification(error_msg, error_msg1) - rar_control = update_rar_control(erase_file_path, error=True, error_msg=error_msg, status='ERROR') - dp.close() - return custom_code.reactivate_unrar(init=False, mute=False) - - extensions_list = ['.aaf', '.3gp', '.asf', '.avi', '.flv', '.mpeg', - '.m1v', '.m2v', '.m4v', '.mkv', '.mov', '.mpg', - '.mpe', '.mp4', '.ogg', '.wmv'] - - # Localizamos el path donde se ha dejado la extracción - folder = True - file_result = filetools.listdir(save_path_videos) - while folder: - for file_r in file_result: - if filetools.isdir(filetools.join(save_path_videos, file_r)): - file_result_alt = filetools.listdir(filetools.join(save_path_videos, file_r)) - if file_result_alt: - file_result = file_result_alt - save_path_videos = filetools.join(save_path_videos, file_r) - else: - folder = False - break - else: - folder = False - - # Si hay RARs anidados, ajustamos los paths para la siguiente pasada - if '.rar' in str(file_result): - for file_r in file_result: - if '.rar' in file_r: - rar_file = file_r - file_path = str(filetools.join(save_path_videos, rar_file)) - save_path_videos = filetools.join(save_path_videos, 'Extracted') - rar_control = update_rar_control(erase_file_path, newextract=(rar_file)) - if not filetools.exists(save_path_videos): filetools.mkdir(save_path_videos) - platformtools.dialog_notification(config.get_localized_string(70804), rar_file, time=5000) - - # Si ya se ha extraido todo, preparamos el retorno - else: - video_list = [] - for file_r in file_result: - if os.path.splitext(file_r)[1] in extensions_list: - video_list += [file_r] - if len(video_list) == 0: - error_msg = config.get_localized_string(70797) - error_msg1 = config.get_localized_string(70798) - platformtools.dialog_notification(error_msg, error_msg1) - rar_control = update_rar_control(erase_file_path, error=True, error_msg=error_msg, status='ERROR') - dp.close() - return custom_code.reactivate_unrar(init=False, mute=False) - else: - log("##### Archive extracted: %s" % video_list[0]) - platformtools.dialog_notification(config.get_localized_string(70795), video_list[0], time=10000) - log("##### Archive removes: %s" % file_path) - #rar_control = update_rar_control(erase_file_path, status='DONE') - ret = filetools.remove(filetools.join(erase_file_path, '_rar_control.json'), silent=True) - return str(video_list[0]), True, save_path_videos, erase_file_path - - -def rename_rar_dir(rar_file, save_path_videos, video_path, torr_client): - logger.info() - - rename_status = False - folders = rar_file.split("/") - if filetools.exists(filetools.join(save_path_videos, folders[0])) and video_path not in folders[0]: - if not PY3: - src = filetools.join(save_path_videos, folders[0]).decode("utf8") - dst = filetools.join(save_path_videos, video_path).decode("utf8") - dst_file = video_path.decode("utf8") - else: - src = filetools.join(save_path_videos, folders[0]) - dst = filetools.join(save_path_videos, video_path) - dst_file = video_path - - for x in range(20): - if xbmc.abortRequested: - return rename_status, rar_file - xbmc.sleep(1000) - - # Se para la actividad para que libere los archivos descargados - if torr_client in ['quasar', 'elementum']: - torr_data, deamon_url, index = get_tclient_data(folders[0], torr_client) - if torr_data and deamon_url: - log("##### Client URL: %s" % '%spause/%s' % (deamon_url, index)) - data = httptools.downloadpage('%spause/%s' % (deamon_url, index), timeout=5, alfa_s=True).data - - try: - if filetools.exists(src): - filetools.rename(src, dst_file, silent=True, strict=True) - elif not filetools.exists(dst_file): - break - except: - log("##### Rename ERROR: SRC: %s" % src) - log(traceback.format_exc(1)) - else: - if filetools.exists(dst): - log("##### Renamed: SRC: %s" % src) - log("##### TO: DST: %s" % dst) - rar_file = video_path + '/' + folders[1] - rename_status = True - update_rar_control(dst, newpath=dst) - break - - return rename_status, rar_file - - -def last_password_search(pass_path, erase_file_path=''): - logger.info(pass_path) - - if not erase_file_path: - erase_file_path = pass_path - - # Busca en el Path de extracción si hay algún archivo que contenga la URL donde pueda estar la CONTRASEÑA - password = '' - patron_url = '(http.*\:\/\/(?:www.)?\w+\.\w+\/.*?)[\n|\r|$]' - patron_pass = '<input\s*type="text"\s*id="txt_password"\s*name="[^"]+"\s*onClick="[^"]+"\s*value="([^"]+)"' - - try: - pass_path_list = filetools.listdir(pass_path) - for file in pass_path_list: - if 'contrase' in file.lower() and '.rar' not in file: - file_pass = filetools.read(filetools.join(pass_path, file)) - url = scrapertools.find_single_match(file_pass, patron_url) - if url: - data = re.sub(r"\n|\r|\t|\s{2}|(<!--.*?-->)", "", httptools.downloadpage(url).data) - password = scrapertools.find_single_match(data, patron_pass) - if password: - update_rar_control(erase_file_path, password=password, status='UnRARing: Password update') - break - except: - log(traceback.format_exc(1)) - - log("##### Password Extracted: %s" % password) - return password - - -def update_rar_control(path, newpath='', newextract='', password='', error='', error_msg='', status=''): - - try: - rar_control = {} - rar_control = jsontools.load(filetools.read(filetools.join(path, '_rar_control.json'))) - if rar_control: - if newpath: - rar_control['download_path'] = newpath - for x, entry in enumerate(rar_control['rar_files']): - if '__name' in entry: - rar_control['rar_files'][x]['__name'] = filetools.basename(newpath) - break - if newextract: - for x, entry in enumerate(rar_control['rar_files']): - if '__name' in entry: - #rar_control['rar_files'][x]['__name'] = filetools.join(rar_control['rar_files'][x]['__name'], 'Extracted') - rar_control['rar_files'][x]['__name'] = rar_control['rar_files'][x]['__name'] + '/Extracted' - break - rar_control['rar_names'] = [newextract] - if password: rar_control['password'] = password - if error: rar_control['error'] += 1 - if error_msg: rar_control['error_msg'] = error_msg - if status and status not in rar_control['status']: rar_control['status'] = status - ret = filetools.write(filetools.join(rar_control['download_path'], '_rar_control.json'), \ - jsontools.dump(rar_control)) - logger.debug('%s, %s, %s, %s, %s, %s' % (rar_control['download_path'], \ - rar_control['rar_names'][0], rar_control['password'], \ - str(rar_control['error']), rar_control['error_msg'], rar_control['status'])) - except: - log(traceback.format_exc(1)) - - return rar_control - - -def import_libtorrent(LIBTORRENT_PATH): - logger.info(LIBTORRENT_PATH) - - e = '' - e1 = '' - e2 = '' - fp = '' - pathname = '' - description = '' - lt = '' - - try: - sys.path.insert(0, LIBTORRENT_PATH) - if LIBTORRENT_PATH: - try: - if not xbmc.getCondVisibility("system.platform.android"): - import libtorrent as lt - pathname = LIBTORRENT_PATH - else: - import imp - from ctypes import CDLL - dll_path = os.path.join(LIBTORRENT_PATH, 'liblibtorrent.so') - liblibtorrent = CDLL(dll_path) - - path_list = [LIBTORRENT_PATH, xbmc.translatePath('special://xbmc')] - fp, pathname, description = imp.find_module('libtorrent', path_list) - - # Esta parte no funciona en Android. Por algún motivo da el error "dlopen failed: library "liblibtorrent.so" not found" - # Hay que encontrar un hack para rodear el problema. Lo siguiente ha sido probado sin éxito: - #if fp: fp.close() - #fp = filetools.file_open(filetools.join(LIBTORRENT_PATH, 'libtorrent.so'), mode='rb') # Usa XbmcVFS - #fp = open(os.path.join(LIBTORRENT_PATH, 'libtorrent.so'), 'rb') - - try: - lt = imp.load_module('libtorrent', fp, pathname, description) - finally: - if fp: fp.close() - - except Exception as e1: - logger.error(traceback.format_exc(1)) - log('fp = ' + str(fp)) - log('pathname = ' + str(pathname)) - log('description = ' + str(description)) - if fp: fp.close() - from lib.python_libtorrent.python_libtorrent import get_libtorrent - lt = get_libtorrent() - - except Exception as e2: - try: - logger.error(traceback.format_exc()) - if fp: fp.close() - e = e1 or e2 - ok = platformtools.dialog_ok(config.get_localized_string(30035), config.get_localized_string(30036), config.get_localized_string(60015), str(e2)) - except: - pass - - try: - if not e1 and e2: e1 = e2 - except: - try: - if e2: - e1 = e2 - else: - e1 = '' - e2 = '' - except: - e1 = '' - e2 = '' - - return lt, e, e1, e2 - - -def log(texto): - try: - xbmc.log(texto, xbmc.LOGNOTICE) - except: - pass + filename = filetools.split(filePath)[-1] + title = process_filename(filename, Title) + NewFolder = filetools.join(config.get_setting('downloadpath'), FolderName) + if not filetools.isdir(NewFolder): + filetools.mkdir(NewFolder) + from_folder = filetools.join(config.get_setting('downloadpath'), filename) + to_folder = filetools.join(config.get_setting('downloadpath'), FolderName, title) + filetools.move(from_folder, to_folder) + jsontools.update_node(filetools.join(FolderName, title), File, 'downloadFilename', jsonPath) \ No newline at end of file diff --git a/servers/upstream.json b/servers/upstream.json index d77be9eb..ee3e9685 100644 --- a/servers/upstream.json +++ b/servers/upstream.json @@ -4,8 +4,8 @@ "ignore_urls": [], "patterns": [ { - "pattern": "upstream.to/([a-z0-9]+)", - "url": "https://upstream.to/\\1" + "pattern": "upstream.to/((?:embed-)?[a-z0-9]+)", + "url": "https://upstream.to/\\1.html" } ] }, diff --git a/servers/vupplayer.json b/servers/vupplayer.json index 8823c477..d0b39cdf 100644 --- a/servers/vupplayer.json +++ b/servers/vupplayer.json @@ -4,14 +4,14 @@ "ignore_urls": [], "patterns": [ { - "pattern": "vup.to/(?:embed-)?([a-z0-9]+).html", + "pattern": "vup.to/((?:embed-)?[a-z0-9]+)", "url": "https://vup.to/\\1.html" } ] }, "free": true, "id": "vupplayer", - "name": "VUP Player", + "name": "VUP", "settings": [ { "default": false, diff --git a/service.py b/service.py index 667d6058..b9bf33a9 100644 --- a/service.py +++ b/service.py @@ -1,434 +1,402 @@ -# -*- coding: utf-8 -*- -# ------------------------------------------------------------ -# Service for updating new episodes on library series -# ------------------------------------------------------------ - -import datetime, imp, math, threading, traceback, sys, glob - -from platformcode import config -try: - import xbmc, os - librerias = xbmc.translatePath(os.path.join(config.get_runtime_path(), 'lib')) - sys.path.append(librerias) -except: - import os - librerias = os.path.join(config.get_runtime_path(), 'lib') - sys.path.append(librerias) - - - - -from core import channeltools, filetools, videolibrarytools -from platformcode import logger -from platformcode import platformtools -from specials import videolibrary -from platformcode import updater - - -def update(path, p_dialog, i, t, serie, overwrite): - logger.info("Updating " + path) - insertados_total = 0 - - head_nfo, it = videolibrarytools.read_nfo(path + '/tvshow.nfo') - # videolibrarytools.check_renumber_options(it) - videolibrarytools.update_renumber_options(it, head_nfo, path) - category = serie.category - - # logger.debug("%s: %s" %(serie.contentSerieName,str(list_canales) )) - for channel, url in serie.library_urls.items(): - serie.channel = channel - serie.url = url - - ###### Redirección al canal NewPct1.py si es un clone, o a otro canal y url si ha intervención judicial - try: - head_nfo, it = videolibrarytools.read_nfo(path + '/tvshow.nfo') #Refresca el .nfo para recoger actualizaciones - if it.emergency_urls: - serie.emergency_urls = it.emergency_urls - serie.category = category - except: - logger.error(traceback.format_exc()) - - channel_enabled = channeltools.is_enabled(serie.channel) - - if channel_enabled: - - heading = config.get_localized_string(20000) - p_dialog.update(int(math.ceil((i + 1) * t)), heading, config.get_localized_string(60389) % (serie.contentSerieName, - serie.channel.capitalize())) - try: - pathchannels = filetools.join(config.get_runtime_path(), "channels", serie.channel + '.py') - logger.info("Cargando canal: " + pathchannels + " " + - serie.channel) - - if serie.library_filter_show: - serie.show = serie.library_filter_show.get(serie.channel, serie.contentSerieName) - - obj = imp.load_source(serie.channel, pathchannels) - itemlist = obj.episodios(serie) - - try: - if int(overwrite) == 3: - # Sobrescribir todos los archivos (tvshow.nfo, 1x01.nfo, 1x01 [canal].json, 1x01.strm, etc...) - insertados, sobreescritos, fallidos, notusedpath = videolibrarytools.save_tvshow(serie, itemlist) - #serie= videolibrary.check_season_playcount(serie, serie.contentSeason) - #if filetools.write(path + '/tvshow.nfo', head_nfo + it.tojson()): - # serie.infoLabels['playcount'] = serie.playcount - else: - insertados, sobreescritos, fallidos = videolibrarytools.save_episodes(path, itemlist, serie, - silent=True, - overwrite=overwrite) - #it = videolibrary.check_season_playcount(it, it.contentSeason) - #if filetools.write(path + '/tvshow.nfo', head_nfo + it.tojson()): - # serie.infoLabels['playcount'] = serie.playcount - insertados_total += insertados - - except Exception as ex: - logger.error("Error al guardar los capitulos de la serie") - template = "An exception of type %s occured. Arguments:\n%r" - message = template % (type(ex).__name__, ex.args) - logger.error(message) - - except Exception as ex: - logger.error("Error al obtener los episodios de: %s" % serie.show) - template = "An exception of type %s occured. Arguments:\n%r" - message = template % (type(ex).__name__, ex.args) - logger.error(message) - - else: - logger.debug("Canal %s no activo no se actualiza" % serie.channel) - - #Sincronizamos los episodios vistos desde la videoteca de Kodi con la de Alfa - try: - if config.is_xbmc(): #Si es Kodi, lo hacemos - from platformcode import xbmc_videolibrary - xbmc_videolibrary.mark_content_as_watched_on_alfa(path + '/tvshow.nfo') - except: - logger.error(traceback.format_exc()) - - return insertados_total > 0 - - -def check_for_update(overwrite=True): - logger.info("Update Series...") - p_dialog = None - serie_actualizada = False - update_when_finished = False - hoy = datetime.date.today() - estado_verify_playcount_series = False - - try: - if config.get_setting("update", "videolibrary") != 0 or overwrite: - config.set_setting("updatelibrary_last_check", hoy.strftime('%Y-%m-%d'), "videolibrary") - - heading = config.get_localized_string(60389) - p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(20000), heading) - p_dialog.update(0, '') - show_list = [] - - for path, folders, files in filetools.walk(videolibrarytools.TVSHOWS_PATH): - show_list.extend([filetools.join(path, f) for f in files if f == "tvshow.nfo"]) - - if show_list: - t = float(100) / len(show_list) - - for i, tvshow_file in enumerate(show_list): - head_nfo, serie = videolibrarytools.read_nfo(tvshow_file) - path = filetools.dirname(tvshow_file) - - logger.info("serie=" + serie.contentSerieName) - p_dialog.update(int(math.ceil((i + 1) * t)), heading, serie.contentSerieName) - - #Verificamos el estado del serie.library_playcounts de la Serie por si está incompleto - try: - estado = False - #Si no hemos hecho la verificación o no tiene playcount, entramos - estado = config.get_setting("verify_playcount", "videolibrary") - if not estado or estado == False or not serie.library_playcounts: #Si no se ha pasado antes, lo hacemos ahora - serie, estado = videolibrary.verify_playcount_series(serie, path) #También se pasa si falta un PlayCount por completo - except: - logger.error(traceback.format_exc()) - else: - if estado: #Si ha tenido éxito la actualización... - estado_verify_playcount_series = True #... se marca para cambiar la opción de la Videoteca - - interval = int(serie.active) # Podria ser del tipo bool - - if not serie.active: - # si la serie no esta activa descartar - if not overwrite: - #Sincronizamos los episodios vistos desde la videoteca de Kodi con la de Alfa, aunque la serie esté desactivada - try: - if config.is_xbmc(): #Si es Kodi, lo hacemos - from platformcode import xbmc_videolibrary - xbmc_videolibrary.mark_content_as_watched_on_alfa(path + '/tvshow.nfo') - except: - logger.error(traceback.format_exc()) - - continue - - # obtenemos las fecha de actualizacion y de la proxima programada para esta serie - update_next = serie.update_next - if update_next: - y, m, d = update_next.split('-') - update_next = datetime.date(int(y), int(m), int(d)) - else: - update_next = hoy - - update_last = serie.update_last - if update_last: - y, m, d = update_last.split('-') - update_last = datetime.date(int(y), int(m), int(d)) - else: - update_last = hoy - - # si la serie esta activa ... - if overwrite or config.get_setting("updatetvshows_interval", "videolibrary") == 0: - # ... forzar actualizacion independientemente del intervalo - serie_actualizada = update(path, p_dialog, i, t, serie, overwrite) - if not serie_actualizada: - update_next = hoy + datetime.timedelta(days=interval) - - elif interval == 1 and update_next <= hoy: - # ...actualizacion diaria - serie_actualizada = update(path, p_dialog, i, t, serie, overwrite) - if not serie_actualizada and update_last <= hoy - datetime.timedelta(days=7): - # si hace una semana q no se actualiza, pasar el intervalo a semanal - interval = 7 - update_next = hoy + datetime.timedelta(days=interval) - - elif interval == 7 and update_next <= hoy: - # ...actualizacion semanal - serie_actualizada = update(path, p_dialog, i, t, serie, overwrite) - if not serie_actualizada: - if update_last <= hoy - datetime.timedelta(days=14): - # si hace 2 semanas q no se actualiza, pasar el intervalo a mensual - interval = 30 - - update_next += datetime.timedelta(days=interval) - - elif interval == 30 and update_next <= hoy: - # ...actualizacion mensual - serie_actualizada = update(path, p_dialog, i, t, serie, overwrite) - if not serie_actualizada: - update_next += datetime.timedelta(days=interval) - - if serie_actualizada: - update_last = hoy - update_next = hoy + datetime.timedelta(days=interval) - - head_nfo, serie = videolibrarytools.read_nfo(tvshow_file) #Vuelve a leer el.nfo, que ha sido modificado - if interval != int(serie.active) or update_next.strftime('%Y-%m-%d') != serie.update_next or update_last.strftime('%Y-%m-%d') != serie.update_last: - serie.update_last = update_last.strftime('%Y-%m-%d') - if update_next > hoy: - serie.update_next = update_next.strftime('%Y-%m-%d') - serie.active = interval - serie.channel = "videolibrary" - serie.action = "get_seasons" - filetools.write(tvshow_file, head_nfo + serie.tojson()) - - if serie_actualizada: - if config.get_setting("search_new_content", "videolibrary") == 0: - # Actualizamos la videoteca de Kodi: Buscar contenido en la carpeta de la serie - if config.is_xbmc() and config.get_setting("videolibrary_kodi"): - from platformcode import xbmc_videolibrary - xbmc_videolibrary.update(folder=filetools.basename(path)) - else: - update_when_finished = True - - if estado_verify_playcount_series: #Si se ha cambiado algún playcount, ... - estado = config.set_setting("verify_playcount", True, "videolibrary") #... actualizamos la opción de Videolibrary - - if config.get_setting("search_new_content", "videolibrary") == 1 and update_when_finished: - # Actualizamos la videoteca de Kodi: Buscar contenido en todas las series - if config.is_xbmc() and config.get_setting("videolibrary_kodi"): - from platformcode import xbmc_videolibrary - xbmc_videolibrary.update() - - p_dialog.close() - - else: - logger.info("No actualiza la videoteca, está desactivado en la configuración de alfa") - - except Exception as ex: - logger.error("Se ha producido un error al actualizar las series") - template = "An exception of type %s occured. Arguments:\n%r" - message = template % (type(ex).__name__, ex.args) - logger.error(message) - - if p_dialog: - p_dialog.close() - - from core.item import Item - item_dummy = Item() - videolibrary.list_movies(item_dummy, silent=True) - - -def start(thread=True): - if thread: - t = threading.Thread(target=start, args=[False]) - t.setDaemon(True) - t.start() - else: - import time - - update_wait = [0, 10000, 20000, 30000, 60000] - wait = update_wait[int(config.get_setting("update_wait", "videolibrary"))] - if wait > 0: - time.sleep(wait) - - if not config.get_setting("update", "videolibrary") == 2: - check_for_update(overwrite=False) - - # Se ejecuta ciclicamente - while True: - monitor_update() - time.sleep(3600) # cada hora - - -def monitor_update(): - update_setting = config.get_setting("update", "videolibrary") - - # "Actualizar "Una sola vez al dia" o "al inicar Kodi y al menos una vez al dia" - - if update_setting == 2 or update_setting == 3: - hoy = datetime.date.today() - last_check = config.get_setting("updatelibrary_last_check", "videolibrary") - if last_check: - y, m, d = last_check.split('-') - last_check = datetime.date(int(y), int(m), int(d)) - else: - last_check = hoy - datetime.timedelta(days=1) - - update_start = config.get_setting("everyday_delay", "videolibrary") * 4 - - # logger.info("Ultima comprobacion: %s || Fecha de hoy:%s || Hora actual: %s" % - # (last_check, hoy, datetime.datetime.now().hour)) - # logger.info("Atraso del inicio del dia: %i:00" % update_start) - - if last_check <= hoy and datetime.datetime.now().hour == int(update_start): - logger.info("Inicio actualizacion programada para las %s h.: %s" % (update_start, datetime.datetime.now())) - check_for_update(overwrite=False) - - if not config.dev_mode(): - period = float(config.get_setting('addon_update_timer')) * 3600 - curTime = time.time() - lastCheck = config.get_setting("updater_last_check", "videolibrary", '0') - if lastCheck: - lastCheck = float(lastCheck) - else: - lastCheck = 0 - - if curTime - lastCheck > period: - updated, needsReload = updater.check(background=True) - config.set_setting("updater_last_check", str(curTime), "videolibrary") - if needsReload: - xbmc.executescript(__file__) - exit(0) - -# def get_channel_json(): -# import urllib, os, xbmc -# addon = config.get_addon_core() -# ROOT_DIR = config.get_runtime_path() -# LOCAL_FILE = os.path.join(ROOT_DIR, "channels.json") -# -# if os.path.exists(LOCAL_FILE): -# os.remove(LOCAL_FILE) -# urllib.urlretrieve("https://raw.githubusercontent.com/kodiondemand/addon/master/channels.json", LOCAL_FILE) -# -# if addon.getSetting("use_custom_url") != "true": -# channels_path = os.path.join(ROOT_DIR, "channels", '*.json') -# channel_files = sorted(glob.glob(channels_path), key=lambda x: os.path.basename(x)) -# for channel_file in channel_files: -# if channel_file: -# try: import json -# except: import simplejson as json -# with open(LOCAL_FILE) as f: -# data = json.load(f) -# try: -# if data[channel_file]: -# config.set_setting(name=data[channel_file], value="value", channel=channel_file) -# except: pass #channel not in json - -# always bypass al websites that use cloudflare at startup, so there's no need to wait 5 seconds when opened -def callCloudflare(): - from core import httptools, support - import json - channels_path = os.path.join(config.get_runtime_path(), "channels", '*.json') - channel_files = [os.path.splitext(os.path.basename(c))[0] for c in glob.glob(channels_path)] - for channel_name in channel_files: - channel_parameters = channeltools.get_channel_parameters(channel_name) - if 'cloudflare' in channel_parameters and channel_parameters["cloudflare"]: - channel = __import__('channels.%s' % channel_name, fromlist=["channels.%s" % channel_name]) - try: - channel.findhost() - except: - pass - httptools.downloadpage(channel.host) - - servers_path = os.path.join(config.get_runtime_path(), "servers", '*.json') - servers_files = glob.glob(servers_path) - for server in servers_files: - with open(server) as server: - server_parameters = json.load(server) - if 'cloudflare' in server_parameters and server_parameters["cloudflare"]: - patternUrl = server_parameters["find_videos"]["patterns"][0]["url"] - url = '/'.join(patternUrl.split('/')[:3]) - httptools.downloadpage(url) - - -if __name__ == "__main__": - # threading.Thread(target=callCloudflare()) - # Se ejecuta en cada inicio - import xbmc - import time - - # mark as stopped all downloads (if we are here, probably kodi just started) - from specials.downloads import stop_all - stop_all() - - # modo adulto: - # sistema actual 0: Nunca, 1:Siempre, 2:Solo hasta que se reinicie Kodi - # si es == 2 lo desactivamos. - if config.get_setting("adult_mode") == 2: - config.set_setting("adult_mode", 0) - - update_wait = [0, 10000, 20000, 30000, 60000] - wait = update_wait[int(config.get_setting("update_wait", "videolibrary"))] - if wait > 0: - xbmc.sleep(wait) - - - # Verificar quick-fixes al abrirse Kodi, y dejarlo corriendo como Thread - if not config.dev_mode(): - updated, needsReload = updater.check(background=True) - config.set_setting("updater_last_check", str(time.time()), "videolibrary") - if needsReload: - xbmc.executescript(__file__) - exit(0) - - if xbmc.getCondVisibility('System.HasAddon(repository.kod)'): - filetools.rmdirtree(xbmc.translatePath('special://home/addons/repository.kod')) - - # Copia Custom code a las carpetas de Alfa desde la zona de Userdata - from platformcode import custom_code - custom_code.init() - - if not config.get_setting("update", "videolibrary") == 2: - check_for_update(overwrite=False) - - - # Se ejecuta ciclicamente - if config.get_platform(True)['num_version'] >= 14: - monitor = xbmc.Monitor() # For Kodi >= 14 - else: - monitor = None # For Kodi < 14 - - if monitor: - while not monitor.abortRequested(): - monitor_update() - if monitor.waitForAbort(3600): # cada hora - break - else: - while not xbmc.abortRequested: - monitor_update() - xbmc.sleep(3600) +# -*- coding: utf-8 -*- +import datetime +import math +import os +import sys +import threading +import traceback +import xbmc +import xbmcgui +from platformcode import config +librerias = xbmc.translatePath(os.path.join(config.get_runtime_path(), 'lib')) +sys.path.insert(0, librerias) + +from core import videolibrarytools, filetools, channeltools +from lib import schedule +from platformcode import logger, platformtools, updater +from specials import videolibrary +from servers import torrent + + +def update(path, p_dialog, i, t, serie, overwrite): + logger.info("Updating " + path) + insertados_total = 0 + + head_nfo, it = videolibrarytools.read_nfo(path + '/tvshow.nfo') + # videolibrarytools.check_renumber_options(it) + videolibrarytools.update_renumber_options(it, head_nfo, path) + category = serie.category + + # logger.debug("%s: %s" %(serie.contentSerieName,str(list_canales) )) + for channel, url in serie.library_urls.items(): + serie.channel = channel + serie.url = url + + ###### Redirección al canal NewPct1.py si es un clone, o a otro canal y url si ha intervención judicial + try: + head_nfo, it = videolibrarytools.read_nfo(path + '/tvshow.nfo') #Refresca el .nfo para recoger actualizaciones + if it.emergency_urls: + serie.emergency_urls = it.emergency_urls + serie.category = category + except: + logger.error(traceback.format_exc()) + + channel_enabled = channeltools.is_enabled(serie.channel) + + if channel_enabled: + + heading = config.get_localized_string(20000) + p_dialog.update(int(math.ceil((i + 1) * t)), heading, config.get_localized_string(60389) % (serie.contentSerieName, + serie.channel.capitalize())) + try: + pathchannels = filetools.join(config.get_runtime_path(), "channels", serie.channel + '.py') + logger.info("loading channel: " + pathchannels + " " + + serie.channel) + + if serie.library_filter_show: + serie.show = serie.library_filter_show.get(serie.channel, serie.contentSerieName) + + obj = __import__('channels.%s' % serie.channel, fromlist=[pathchannels]) + + itemlist = obj.episodios(serie) + + try: + if int(overwrite) == 3: + # Sobrescribir todos los archivos (tvshow.nfo, 1x01.nfo, 1x01 [canal].json, 1x01.strm, etc...) + insertados, sobreescritos, fallidos, notusedpath = videolibrarytools.save_tvshow(serie, itemlist) + #serie= videolibrary.check_season_playcount(serie, serie.contentSeason) + #if filetools.write(path + '/tvshow.nfo', head_nfo + it.tojson()): + # serie.infoLabels['playcount'] = serie.playcount + else: + insertados, sobreescritos, fallidos = videolibrarytools.save_episodes(path, itemlist, serie, + silent=True, + overwrite=overwrite) + #it = videolibrary.check_season_playcount(it, it.contentSeason) + #if filetools.write(path + '/tvshow.nfo', head_nfo + it.tojson()): + # serie.infoLabels['playcount'] = serie.playcount + insertados_total += insertados + + except Exception as ex: + logger.error("Error when saving the chapters of the series") + template = "An exception of type %s occured. Arguments:\n%r" + message = template % (type(ex).__name__, ex.args) + logger.error(message) + + except Exception as ex: + logger.error("Error in obtaining the episodes of: %s" % serie.show) + template = "An exception of type %s occured. Arguments:\n%r" + message = template % (type(ex).__name__, ex.args) + logger.error(message) + + else: + logger.debug("Channel %s not active is not updated" % serie.channel) + + #Sincronizamos los episodios vistos desde la videoteca de Kodi con la de Alfa + try: + if config.is_xbmc(): #Si es Kodi, lo hacemos + from platformcode import xbmc_videolibrary + xbmc_videolibrary.mark_content_as_watched_on_alfa(path + '/tvshow.nfo') + except: + logger.error(traceback.format_exc()) + + return insertados_total > 0 + + +def check_for_update(overwrite=True): + logger.info("Update Series...") + p_dialog = None + serie_actualizada = False + update_when_finished = False + hoy = datetime.date.today() + estado_verify_playcount_series = False + + try: + if config.get_setting("update", "videolibrary") != 0 or overwrite: + config.set_setting("updatelibrary_last_check", hoy.strftime('%Y-%m-%d'), "videolibrary") + + heading = config.get_localized_string(60389) + p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(20000), heading) + p_dialog.update(0, '') + show_list = [] + + for path, folders, files in filetools.walk(videolibrarytools.TVSHOWS_PATH): + show_list.extend([filetools.join(path, f) for f in files if f == "tvshow.nfo"]) + + if show_list: + t = float(100) / len(show_list) + + for i, tvshow_file in enumerate(show_list): + head_nfo, serie = videolibrarytools.read_nfo(tvshow_file) + path = filetools.dirname(tvshow_file) + + logger.info("serie=" + serie.contentSerieName) + p_dialog.update(int(math.ceil((i + 1) * t)), heading, serie.contentSerieName) + + #Verificamos el estado del serie.library_playcounts de la Serie por si está incompleto + try: + estado = False + #Si no hemos hecho la verificación o no tiene playcount, entramos + estado = config.get_setting("verify_playcount", "videolibrary") + if not estado or estado == False or not serie.library_playcounts: #Si no se ha pasado antes, lo hacemos ahora + serie, estado = videolibrary.verify_playcount_series(serie, path) #También se pasa si falta un PlayCount por completo + except: + logger.error(traceback.format_exc()) + else: + if estado: #Si ha tenido éxito la actualización... + estado_verify_playcount_series = True #... se marca para cambiar la opción de la Videoteca + + interval = int(serie.active) # Podria ser del tipo bool + + if not serie.active: + # si la serie no esta activa descartar + if not overwrite: + #Sincronizamos los episodios vistos desde la videoteca de Kodi con la de Alfa, aunque la serie esté desactivada + try: + if config.is_xbmc(): #Si es Kodi, lo hacemos + from platformcode import xbmc_videolibrary + xbmc_videolibrary.mark_content_as_watched_on_alfa(path + '/tvshow.nfo') + except: + logger.error(traceback.format_exc()) + + continue + + # obtenemos las fecha de actualizacion y de la proxima programada para esta serie + update_next = serie.update_next + if update_next: + y, m, d = update_next.split('-') + update_next = datetime.date(int(y), int(m), int(d)) + else: + update_next = hoy + + update_last = serie.update_last + if update_last: + y, m, d = update_last.split('-') + update_last = datetime.date(int(y), int(m), int(d)) + else: + update_last = hoy + + # si la serie esta activa ... + if overwrite or config.get_setting("updatetvshows_interval", "videolibrary") == 0: + # ... forzar actualizacion independientemente del intervalo + serie_actualizada = update(path, p_dialog, i, t, serie, overwrite) + if not serie_actualizada: + update_next = hoy + datetime.timedelta(days=interval) + + elif interval == 1 and update_next <= hoy: + # ...actualizacion diaria + serie_actualizada = update(path, p_dialog, i, t, serie, overwrite) + if not serie_actualizada and update_last <= hoy - datetime.timedelta(days=7): + # si hace una semana q no se actualiza, pasar el intervalo a semanal + interval = 7 + update_next = hoy + datetime.timedelta(days=interval) + + elif interval == 7 and update_next <= hoy: + # ...actualizacion semanal + serie_actualizada = update(path, p_dialog, i, t, serie, overwrite) + if not serie_actualizada: + if update_last <= hoy - datetime.timedelta(days=14): + # si hace 2 semanas q no se actualiza, pasar el intervalo a mensual + interval = 30 + + update_next += datetime.timedelta(days=interval) + + elif interval == 30 and update_next <= hoy: + # ...actualizacion mensual + serie_actualizada = update(path, p_dialog, i, t, serie, overwrite) + if not serie_actualizada: + update_next += datetime.timedelta(days=interval) + + if serie_actualizada: + update_last = hoy + update_next = hoy + datetime.timedelta(days=interval) + + head_nfo, serie = videolibrarytools.read_nfo(tvshow_file) #Vuelve a leer el.nfo, que ha sido modificado + if interval != int(serie.active) or update_next.strftime('%Y-%m-%d') != serie.update_next or update_last.strftime('%Y-%m-%d') != serie.update_last: + serie.update_last = update_last.strftime('%Y-%m-%d') + if update_next > hoy: + serie.update_next = update_next.strftime('%Y-%m-%d') + serie.active = interval + serie.channel = "videolibrary" + serie.action = "get_seasons" + filetools.write(tvshow_file, head_nfo + serie.tojson()) + + if serie_actualizada: + if config.get_setting("search_new_content", "videolibrary") == 0: + # Actualizamos la videoteca de Kodi: Buscar contenido en la carpeta de la serie + if config.is_xbmc() and config.get_setting("videolibrary_kodi"): + from platformcode import xbmc_videolibrary + xbmc_videolibrary.update(folder=filetools.basename(path)) + else: + update_when_finished = True + + if estado_verify_playcount_series: #Si se ha cambiado algún playcount, ... + estado = config.set_setting("verify_playcount", True, "videolibrary") #... actualizamos la opción de Videolibrary + + if config.get_setting("search_new_content", "videolibrary") == 1 and update_when_finished: + # Actualizamos la videoteca de Kodi: Buscar contenido en todas las series + if config.is_xbmc() and config.get_setting("videolibrary_kodi"): + from platformcode import xbmc_videolibrary + xbmc_videolibrary.update() + + p_dialog.close() + + else: + logger.info("Not update the video library, it is disabled") + + except Exception as ex: + logger.error("An error occurred while updating the series") + template = "An exception of type %s occured. Arguments:\n%r" + message = template % (type(ex).__name__, ex.args) + logger.error(message) + + if p_dialog: + p_dialog.close() + + from core.item import Item + item_dummy = Item() + videolibrary.list_movies(item_dummy, silent=True) + + +def viewmodeMonitor(): + try: + currentModeName = xbmc.getInfoLabel('Container.Viewmode') + win = xbmcgui.Window(xbmcgui.getCurrentWindowId()) + currentMode = int(win.getFocusId()) + if currentModeName and 'plugin.video.kod' in xbmc.getInfoLabel( + 'Container.FolderPath') and currentMode < 1000 and currentMode > 50: # inside addon and in itemlist view + content, Type = platformtools.getCurrentView() + if content: + defaultMode = int(config.get_setting('view_mode_%s' % content).split(',')[-1]) + if currentMode != defaultMode: + logger.info('viewmode changed: ' + currentModeName + '-' + str(currentMode) + ' - content: ' + content) + config.set_setting('view_mode_%s' % content, currentModeName + ', ' + str(currentMode)) + except: + logger.error(traceback.print_exc()) + + +def updaterCheck(): + # updater check + updated, needsReload = updater.check(background=True) + if needsReload: + xbmc.executescript(__file__) + exit(0) + + +def run_threaded(job_func, args): + job_thread = threading.Thread(target=job_func, args=args) + job_thread.start() + + +class AddonMonitor(xbmc.Monitor): + def __init__(self): + self.settings_pre = config.get_all_settings_addon() + + self.updaterPeriod = None + self.update_setting = None + self.update_hour = None + self.scheduleScreenOnJobs() + self.scheduleUpdater() + + # videolibrary wait + update_wait = [0, 10000, 20000, 30000, 60000] + wait = update_wait[int(config.get_setting("update_wait", "videolibrary"))] + if wait > 0: + xbmc.sleep(wait) + if not config.get_setting("update", "videolibrary") == 2: + run_threaded(check_for_update, (False,)) + self.scheduleVideolibrary() + super(AddonMonitor, self).__init__() + + def onSettingsChanged(self): + logger.info('settings changed') + settings_post = config.get_all_settings_addon() + from platformcode import xbmc_videolibrary + + if self.settings_pre.get('downloadpath', None) != settings_post.get('downloadpath', None): + xbmc_videolibrary.update_sources(settings_post.get('downloadpath', None), + self.settings_pre.get('downloadpath', None)) + + # si se ha cambiado la ruta de la videoteca llamamos a comprobar directorios para que lo cree y pregunte + # automaticamente si configurar la videoteca + if self.settings_pre.get("videolibrarypath", None) != settings_post.get("videolibrarypath", None) or \ + self.settings_pre.get("folder_movies", None) != settings_post.get("folder_movies", None) or \ + self.settings_pre.get("folder_tvshows", None) != settings_post.get("folder_tvshows", None): + videolibrary.move_videolibrary(self.settings_pre.get("videolibrarypath", None), + settings_post.get("videolibrarypath", None), + self.settings_pre.get("folder_movies", None), + settings_post.get("folder_movies", None), + self.settings_pre.get("folder_tvshows", None), + settings_post.get("folder_tvshows", None)) + + # si se ha puesto que se quiere autoconfigurar y se había creado el directorio de la videoteca + if not self.settings_pre.get("videolibrary_kodi", None) and settings_post.get("videolibrary_kodi", None): + xbmc_videolibrary.ask_set_content(silent=True) + elif self.settings_pre.get("videolibrary_kodi", None) and not settings_post.get("videolibrary_kodi", None): + xbmc_videolibrary.clean() + + if self.settings_pre.get('addon_update_timer') != settings_post.get('addon_update_timer'): + schedule.clear('updater') + self.scheduleUpdater() + + if self.update_setting != config.get_setting("update", "videolibrary") or self.update_hour != config.get_setting("everyday_delay", "videolibrary") * 4: + schedule.clear('videolibrary') + self.scheduleVideolibrary() + + if self.settings_pre.get('elementum_on_seed') != settings_post.get('elementum_on_seed') and settings_post.get('elementum_on_seed'): + if not platformtools.dialog_yesno(config.get_localized_string(70805), config.get_localized_string(70806)): + config.set_setting('elementum_on_seed', False) + + self.settings_pre = settings_post + + def onScreensaverActivated(self): + logger.info('screensaver activated, un-scheduling screen-on jobs') + schedule.clear('screenOn') + + def onScreensaverDeactivated(self): + logger.info('screensaver deactivated, re-scheduling screen-on jobs') + self.scheduleScreenOnJobs() + + def scheduleUpdater(self): + if not config.dev_mode(): + updaterCheck() + self.updaterPeriod = config.get_setting('addon_update_timer') + schedule.every(self.updaterPeriod).hours.do(updaterCheck).tag('updater') + logger.info('scheduled updater every ' + str(self.updaterPeriod) + ' hours') + + def scheduleVideolibrary(self): + self.update_setting = config.get_setting("update", "videolibrary") + # 2= daily 3=daily and when kodi starts + if self.update_setting == 2 or self.update_setting == 3: + self.update_hour = config.get_setting("everyday_delay", "videolibrary") * 4 + schedule.every().day.at(str(self.update_hour).zfill(2) + ':00').do(run_threaded, check_for_update, (False,)).tag('videolibrary') + logger.info('scheduled videolibrary at ' + str(self.update_hour).zfill(2) + ':00') + + def scheduleScreenOnJobs(self): + schedule.every().second.do(viewmodeMonitor).tag('screenOn') + schedule.every().second.do(torrent.elementum_monitor).tag('screenOn') + + def onDPMSActivated(self): + logger.info('DPMS activated, un-scheduling screen-on jobs') + schedule.clear('screenOn') + + def onDPMSDeactivated(self): + logger.info('DPMS deactivated, re-scheduling screen-on jobs') + self.scheduleScreenOnJobs() + + +if __name__ == "__main__": + logger.info('Starting KoD service') + monitor = AddonMonitor() + + # mark as stopped all downloads (if we are here, probably kodi just started) + from specials.downloads import stop_all + try: + stop_all() + except: + logger.error(traceback.format_exc()) + + while True: + schedule.run_pending() + + if monitor.waitForAbort(1): # every second + break diff --git a/specials/autoplay.py b/specials/autoplay.py index 5d66b9f9..552e5be8 100644 --- a/specials/autoplay.py +++ b/specials/autoplay.py @@ -56,6 +56,7 @@ def show_option(channel, itemlist, text_color=colorKOD, thumbnail=None, fanart=N :return: ''' from channelselector import get_thumb + from core.support import typo logger.info() if not config.is_xbmc(): @@ -69,7 +70,7 @@ def show_option(channel, itemlist, text_color=colorKOD, thumbnail=None, fanart=N plot_autoplay = config.get_localized_string(60399) itemlist.append( Item(channel=__channel__, - title=config.get_localized_string(60071), + title=typo(config.get_localized_string(60071), 'bold color kod'), action="autoplay_config", text_color=text_color, text_bold=True, @@ -113,12 +114,12 @@ def start(itemlist, item): if item.channel == 'videolibrary': autoplay_node = jsontools.get_node_from_file('autoplay', 'AUTOPLAY') channel_id = item.contentChannel - try: - active = autoplay_node['status'] - except: - active = is_active(item.channel) + # try: + # active = autoplay_node['status'] + # except: + # active = is_active(item.channel) - if not channel_id in autoplay_node or not active: + if not channel_id in autoplay_node: # or not active: return itemlist # Agrega servidores y calidades que no estaban listados a autoplay_node @@ -724,19 +725,40 @@ def reset(item, dict): return -def set_status(status): - logger.info() - # Obtiene el nodo AUTOPLAY desde el json - autoplay_node = jsontools.get_node_from_file('autoplay', 'AUTOPLAY') - autoplay_node['status'] = status +# def set_status(status): +# logger.info() +# # Obtiene el nodo AUTOPLAY desde el json +# autoplay_node = jsontools.get_node_from_file('autoplay', 'AUTOPLAY') +# autoplay_node['status'] = status +# +# result, json_data = jsontools.update_node(autoplay_node, 'autoplay', 'AUTOPLAY') - result, json_data = jsontools.update_node(autoplay_node, 'autoplay', 'AUTOPLAY') +# return if item channel has autoplay and hideserver enabled +def get_channel_AP_HS(item): + autoplay_node = jsontools.get_node_from_file('autoplay', 'AUTOPLAY') + channel_node = autoplay_node.get(item.channel, {}) + if not channel_node: # non ha mai aperto il menu del canale quindi in autoplay_data.json non c'e la key + try: + channelFile = __import__('channels.' + item.channel, fromlist=["channels.%s" % item.channel]) + except: + channelFile = __import__('specials.' + item.channel, fromlist=["specials.%s" % item.channel]) + if hasattr(channelFile, 'list_servers') and hasattr(channelFile, 'list_quality'): + init(item.channel, channelFile.list_servers, channelFile.list_quality) + + autoplay_node = jsontools.get_node_from_file('autoplay', 'AUTOPLAY') + channel_node = autoplay_node.get(item.channel, {}) + settings_node = channel_node.get('settings', {}) + AP = get_setting('autoplay') or (settings_node['active'] if 'active' in settings_node else False) + HS = config.get_setting('hide_servers') or ( + settings_node['hide_servers'] if 'hide_server' in settings_node else False) + + return AP, HS def play_multi_channel(item, itemlist): logger.info() global PLAYED video_dict = dict() - set_status(True) + # set_status(True) for video_item in itemlist: if is_active(video_item.contentChannel): @@ -751,3 +773,6 @@ def play_multi_channel(item, itemlist): start(videos, item) else: break + + AP, HS = get_channel_AP_HS(item) + return HS \ No newline at end of file diff --git a/specials/backup.py b/specials/backup.py index d46b4a1e..5802ea1d 100644 --- a/specials/backup.py +++ b/specials/backup.py @@ -10,6 +10,7 @@ import xbmc from core import ziptools, videolibrarytools, filetools from platformcode import logger, config, platformtools, xbmc_videolibrary from distutils.dir_util import copy_tree +from specials import videolibrary temp_path = xbmc.translatePath("special://userdata/addon_data/plugin.video.kod/temp/") movies_path = os.path.join(temp_path, "movies") @@ -67,15 +68,14 @@ def import_videolibrary(item): unzipper = ziptools.ziptools() unzipper.extract(zip_file, temp_path) - p_dialog.update(25) + p_dialog.update(20) + if config.is_xbmc() and config.get_setting("videolibrary_kodi"): + xbmc_videolibrary.clean() + p_dialog.update(30) filetools.rmdirtree(videolibrarytools.MOVIES_PATH) filetools.rmdirtree(videolibrarytools.TVSHOWS_PATH) p_dialog.update(50) - if config.is_xbmc() and config.get_setting("videolibrary_kodi"): - strm_list = [] - strm_list.append(config.get_setting('videolibrarypath')) - xbmc_videolibrary.clean(strm_list) config.verify_directories_created() if filetools.exists(movies_path): @@ -91,9 +91,6 @@ def import_videolibrary(item): p_dialog.close() platformtools.dialog_notification(config.get_localized_string(20000), config.get_localized_string(80008), time=5000, sound=False) - if platformtools.dialog_yesno(config.get_localized_string(20000), config.get_localized_string(80009)): - import service - service.check_for_update(overwrite=True) - + videolibrary.update_videolibrary() if config.is_xbmc() and config.get_setting("videolibrary_kodi"): - xbmc_videolibrary.update() + xbmc_videolibrary.update() \ No newline at end of file diff --git a/specials/checkhost.py b/specials/checkhost.py index 41f5efbe..5593aae3 100644 --- a/specials/checkhost.py +++ b/specials/checkhost.py @@ -20,7 +20,7 @@ LIST_SITE = ['http://www.ansa.it/', 'https://www.google.it']#, 'https://www.goog # lista di siti che non verranno raggiunti con i DNS del gestore -LST_SITE_CHCK_DNS = ['https://casacinema.space', 'https://documentari-streaming-da.com'] +LST_SITE_CHCK_DNS = ['https://www.casacinema.me/', 'https://cb01-nuovo-indirizzo.info/'] #'https://www.italia-film.pw', 'https://www.cb01.uno/',] # tolti class Kdicc(): @@ -224,25 +224,24 @@ def test_conn(is_exit, check_dns, view_msg, exit() # se ha i DNS filtrati lo comunico all'utente if check_dns == True: - if ktest.check_Dns(): - if not ktest.check_Dns(): - if view_msg == True: - ktest.view_Advise(config.get_localized_string(70722)) + if not ktest.check_Dns(): + if view_msg == True: + ktest.view_Advise(config.get_localized_string(70722)) xbmc.log("############ Inizio Check DNS ############", level=xbmc.LOGNOTICE) xbmc.log("## IP: %s" % (ktest.ip_addr), level=xbmc.LOGNOTICE) xbmc.log("## DNS: %s" % (ktest.dns), level=xbmc.LOGNOTICE) xbmc.log("############ Fine Check DNS ############", level=xbmc.LOGNOTICE) - if check_dns == True: - if ktest.check_Ip() == True and ktest.check_Adsl() == True and ktest.check_Dns() == True: - return True - else: - return False - else: - if ktest.check_Ip() == True and ktest.check_Adsl() == True: - return True - else: - return False + # if check_dns == True: + # if ktest.check_Ip() == True and ktest.check_Adsl() == True and ktest.check_Dns() == True: + # return True + # else: + # return False + # else: + # if ktest.check_Ip() == True and ktest.check_Adsl() == True: + # return True + # else: + # return False # def per la creazione del file channels.json def check_channels(inutile=''): diff --git a/specials/community.json b/specials/community.json index c72593c1..2302af6f 100644 --- a/specials/community.json +++ b/specials/community.json @@ -2,7 +2,6 @@ "id": "community", "name": "Community", "active": true, - "adult": false, "language": ["*"], "thumbnail": "", "banner": "", diff --git a/specials/downloads.json b/specials/downloads.json index 966eab98..1044ac8a 100644 --- a/specials/downloads.json +++ b/specials/downloads.json @@ -2,7 +2,6 @@ "id": "downloads", "name": "Descargas", "active": false, - "adult": false, "language": ["*"], "categories": [ "movie" diff --git a/specials/downloads.py b/specials/downloads.py index f7e9decd..ae6014ea 100644 --- a/specials/downloads.py +++ b/specials/downloads.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # ------------------------------------------------------------ -# Gestor de descargas +# Download manager # ------------------------------------------------------------ from __future__ import division @@ -22,6 +22,8 @@ from core.downloader import Downloader from core.item import Item from platformcode import config, logger from platformcode import platformtools +from core.support import log, dbg, typo +from servers import torrent kb = '0xFF65B3DA' kg = '0xFF65DAA8' @@ -38,27 +40,28 @@ FOLDER_MOVIES = config.get_setting("folder_movies") FOLDER_TVSHOWS = config.get_setting("folder_tvshows") TITLE_FILE = "[COLOR %s]| %i%% |[/COLOR] - %s" TITLE_TVSHOW = "[COLOR %s]| %i%% |[/COLOR] - %s [%s]" +extensions_list = ['.aaf', '.3gp', '.asf', '.avi', '.flv', '.mpeg', '.m1v', '.m2v', '.m4v', '.mkv', '.mov', '.mpg', '.mpe', '.mp4', '.ogg', '.wmv'] def mainlist(item): - logger.info() + log() itemlist = [] - # Lista de archivos + # File list for file in sorted(filetools.listdir(DOWNLOAD_LIST_PATH)): - # Saltamos todos los que no sean JSON + # We skip all the non JSON if not file.endswith(".json"): continue - # cargamos el item + # we load the item file = filetools.join(DOWNLOAD_LIST_PATH, file) i = Item(path=file).fromjson(filetools.read(file)) i.thumbnail = i.contentThumbnail - # Listado principal + # Main listing if not item.contentType == "tvshow": # Series if i.contentType == "episode": - # Comprobamos que la serie no este ya en el itemlist + # We check that the series is not already in the itemlist if not [x for x in itemlist if x.contentSerieName == i.contentSerieName and x.contentChannel == i.contentChannel]: title = TITLE_TVSHOW % (STATUS_COLORS[i.downloadStatus], i.downloadProgress, i.contentSerieName, i.contentChannel) @@ -79,12 +82,12 @@ def mainlist(item): s.title = TITLE_TVSHOW % (STATUS_COLORS[s.downloadStatus], downloadProgress, i.contentSerieName, i.contentChannel) - # Peliculas + # Movies elif i.contentType == "movie" or i.contentType == "video": i.title = TITLE_FILE % (STATUS_COLORS[i.downloadStatus], i.downloadProgress, i.contentTitle) itemlist.append(i) - # Listado dentro de una serie + # Listed within a series else: if i.contentType == "episode" and i.contentSerieName == item.contentSerieName and i.contentChannel == item.contentChannel: i.title = TITLE_FILE % (STATUS_COLORS[i.downloadStatus], i.downloadProgress, "%dx%0.2d: %s" % (i.contentSeason, i.contentEpisodeNumber, i.contentTitle)) @@ -92,19 +95,19 @@ def mainlist(item): estados = [i.downloadStatus for i in itemlist] - # Si hay alguno completado + # If there is any completed if 2 in estados: itemlist.insert(0, Item(channel=item.channel, action="clean_ready", title=config.get_localized_string(70218), contentType=item.contentType, contentChannel=item.contentChannel, thumbnail=get_thumb('delete.png'), contentSerieName=item.contentSerieName, text_color=STATUS_COLORS[STATUS_CODES.completed])) - # Si hay alguno con error + # If there is any error if 3 in estados: itemlist.insert(0, Item(channel=item.channel, action="restart_error", title=config.get_localized_string(70219), contentType=item.contentType, contentChannel=item.contentChannel, thumbnail=get_thumb('update.png'), contentSerieName=item.contentSerieName, text_color=STATUS_COLORS[STATUS_CODES.error])) - # Si hay alguno pendiente + # If there is any pending if 1 in estados or 0 in estados: itemlist.insert(0, Item(channel=item.channel, action="download_all", title=support.typo(config.get_localized_string(70220),'bold'), contentType=item.contentType, contentChannel=item.contentChannel, thumbnail=get_thumb('downloads.png'), @@ -126,7 +129,7 @@ def mainlist(item): itemlist.insert(0, Item(channel=item.channel, action="browser", title=support.typo(config.get_localized_string(70222),'bold'), thumbnail=get_thumb('search.png'), url=DOWNLOAD_PATH)) if not item.contentType == "tvshow": - itemlist.append(Item(channel='shortcuts', action="SettingOnPosition", category=4, setting=0, title= support.typo(config.get_localized_string(70288),'bold color kod'), thumbnail=get_thumb('setting_0.png'))) + itemlist.append(Item(channel='shortcuts', action="SettingOnPosition", category=6, setting=0, title= support.typo(config.get_localized_string(70288),'bold color kod'), thumbnail=get_thumb('setting_0.png'))) # Reload if estados: @@ -144,7 +147,7 @@ def settings(item): def browser(item): - logger.info() + log() itemlist = [] for file in filetools.listdir(item.url): @@ -152,7 +155,11 @@ def browser(item): if filetools.isdir(filetools.join(item.url, file)): itemlist.append(Item(channel=item.channel, title=file, action=item.action, url=filetools.join(item.url, file), context=[{ 'title': config.get_localized_string(30037), 'channel': 'downloads', 'action': "del_dir"}])) else: - itemlist.append(Item(channel=item.channel, title=file, action="play", url=filetools.join(item.url, file), context=[{ 'title': config.get_localized_string(30039), 'channel': 'downloads', 'action': "del_file"}])) + if not item.infoLabels: + infoLabels = {"mediatype":"video"} + else: + infoLabels = item.infoLabels + itemlist.append(Item(channel=item.channel, title=file, action="play", infoLabels=infoLabels, url=filetools.join(item.url, file), context=[{ 'title': config.get_localized_string(30039), 'channel': 'downloads', 'action': "del_file"}])) return itemlist @@ -174,17 +181,17 @@ def del_dir(item): def clean_all(item): - logger.info() + log() stop_all() removeFiles = False if platformtools.dialog_yesno(config.get_localized_string(20000), config.get_localized_string(30300)): removeFiles = True - for fichero in sorted(filetools.listdir(DOWNLOAD_LIST_PATH)): - if fichero.endswith(".json"): - download_item = Item().fromjson(filetools.read(filetools.join(DOWNLOAD_LIST_PATH, fichero))) + for File in sorted(filetools.listdir(DOWNLOAD_LIST_PATH)): + if File.endswith(".json"): + download_item = Item().fromjson(filetools.read(filetools.join(DOWNLOAD_LIST_PATH, File))) if not item.contentType == "tvshow" or ( item.contentSerieName == download_item.contentSerieName and item.contentChannel == download_item.contentChannel): - filetools.remove(filetools.join(DOWNLOAD_LIST_PATH, fichero)) + filetools.remove(filetools.join(DOWNLOAD_LIST_PATH, File)) if removeFiles: filetools.remove(filetools.join(DOWNLOAD_PATH, download_item.downloadFilename)) dirName = filetools.join(DOWNLOAD_PATH, filetools.dirname(download_item.downloadFilename)) @@ -200,11 +207,16 @@ def reload(item): def stop_all(item=None): - logger.info() + log() for fichero in sorted(filetools.listdir(DOWNLOAD_LIST_PATH)): if fichero.endswith(".json"): download_item = Item().fromjson(filetools.read(filetools.join(DOWNLOAD_LIST_PATH, fichero))) + if download_item.TorrentName: + from inspect import stack + if stack()[1][3] == 'clean_all': action = 'delete' + else: action = 'pause' + torrent.elementum_actions(action, download_item.TorrentName) if download_item.downloadStatus == 4: update_json(filetools.join(DOWNLOAD_LIST_PATH, fichero), {"downloadStatus": STATUS_CODES.stoped}) xbmc.sleep(300) @@ -213,7 +225,7 @@ def stop_all(item=None): def clean_ready(item): - logger.info() + log() for fichero in sorted(filetools.listdir(DOWNLOAD_LIST_PATH)): if fichero.endswith(".json"): download_item = Item().fromjson(filetools.read(filetools.join(DOWNLOAD_LIST_PATH, fichero))) @@ -225,7 +237,7 @@ def clean_ready(item): def restart_error(item): - logger.info() + log() for fichero in sorted(filetools.listdir(DOWNLOAD_LIST_PATH)): if fichero.endswith(".json"): download_item = Item().fromjson(filetools.read(filetools.join(DOWNLOAD_LIST_PATH, fichero))) @@ -237,8 +249,7 @@ def restart_error(item): filetools.remove( filetools.join(DOWNLOAD_PATH, download_item.downloadFilename)) - update_json(item.path, - {"downloadStatus": STATUS_CODES.stoped, "downloadComplete": 0, "downloadProgress": 0}) + update_json(item.path, {"downloadStatus": STATUS_CODES.stoped, "downloadComplete": 0, "downloadProgress": 0}) platformtools.itemlist_refresh() @@ -260,91 +271,108 @@ def download_all_background(item): if download_item.downloadStatus in [STATUS_CODES.stoped, STATUS_CODES.canceled]: res = start_download(download_item) # platformtools.itemlist_refresh() - # Si se ha cancelado paramos + # If canceled, we stop if res == STATUS_CODES.canceled: break def menu(item): - logger.info() + log(item) if item.downloadServer: servidor = item.downloadServer.get("server", "Auto") else: servidor = "Auto" - # Opciones disponibles para el menu + # Options available for the menu op = [config.get_localized_string(70225), config.get_localized_string(70226), config.get_localized_string(70227), config.get_localized_string(30165) % (servidor.capitalize()), config.get_localized_string(60220), config.get_localized_string(60221)] opciones = [] - # Opciones para el menu + # Options for the menu if item.downloadStatus == STATUS_CODES.stoped: - opciones.append(op[0]) # Descargar - if not item.server: opciones.append(op[3]) # Elegir Servidor - opciones.append(op[1]) # Eliminar de la lista + opciones.append(op[0]) # Download + if not item.server: opciones.append(op[3]) # Choose Server + opciones.append(op[1]) # Remove from the list if item.downloadStatus == STATUS_CODES.canceled: - opciones.append(op[0]) # Descargar - if not item.server: opciones.append(op[3]) # Elegir Servidor - opciones.append(op[2]) # Reiniciar descarga - opciones.append(op[1]) # Eliminar de la lista + opciones.append(op[0]) # Download + if not item.server: opciones.append(op[3]) # Choose Server + opciones.append(op[2]) # Restart download + opciones.append(op[1]) # Remove from the list if item.downloadStatus == STATUS_CODES.completed: - opciones.append(op[5]) # Play - opciones.append(op[1]) # Eliminar de la lista - opciones.append(op[2]) # Reiniciar descarga + opciones.append(op[5]) # Play + opciones.append(op[1]) # Remove from the list + opciones.append(op[2]) # Restart download - if item.downloadStatus == STATUS_CODES.error: # descarga con error - opciones.append(op[2]) # Reiniciar descarga - opciones.append(op[1]) # Eliminar de la lista + if item.downloadStatus == STATUS_CODES.error: # Download with error + opciones.append(op[2]) # Restart download + opciones.append(op[1]) # Remove from the list if item.downloadStatus == STATUS_CODES.downloading: - opciones.append(op[5]) # Play - opciones.append(op[4]) # pause download - opciones.append(op[1]) # Eliminar de la lista + opciones.append(op[5]) # Play + opciones.append(op[4]) # Pause Download + opciones.append(op[1]) # Remove from the list - # Mostramos el dialogo + # Show Dialog seleccion = platformtools.dialog_select(config.get_localized_string(30163), opciones) + logger.info('SELECTION: '+ op[seleccion]) - # -1 es cancelar + # -1 is cancel if seleccion == -1: return - logger.info("option=%s" % (opciones[seleccion])) - # Opcion Eliminar + # Delete if opciones[seleccion] == op[1]: filetools.remove(item.path) - if platformtools.dialog_yesno(config.get_localized_string(20000), config.get_localized_string(30300)): - filetools.remove(filetools.join(DOWNLOAD_PATH, item.downloadFilename)) + if item.TorrentName: + torrent.elementum_actions('delete', item.TorrentName) + else: + if platformtools.dialog_yesno(config.get_localized_string(20000), config.get_localized_string(30300)): + filetools.remove(filetools.join(DOWNLOAD_PATH, item.downloadFilename)) - # Opcion inicaiar descarga + # Start Download if opciones[seleccion] == op[0]: item.action = "start_download" xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?" + item.tourl() + ")") - # Elegir Servidor + # Select Server if opciones[seleccion] == op[3]: select_server(item) - # Reiniciar descarga + # Restart Download if opciones[seleccion] == op[2]: if filetools.isfile(filetools.join(DOWNLOAD_PATH, item.downloadFilename)): filetools.remove(filetools.join(DOWNLOAD_PATH, item.downloadFilename)) - update_json(item.path, {"downloadStatus": STATUS_CODES.stoped, "downloadComplete": 0, "downloadProgress": 0, - "downloadServer": {}}) + update_json(item.path, {"downloadStatus": STATUS_CODES.stoped, "downloadComplete": 0, "downloadProgress": 0, "downloadServer": {}}) if opciones[seleccion] == op[4]: + if item.TorrentName: + torrent.elementum_actions('pause', item.TorrentName) update_json(item.path, {"downloadStatus": STATUS_CODES.stoped}) if opciones[seleccion] == op[5]: - xbmc.executebuiltin('PlayMedia(' + filetools.join(DOWNLOAD_PATH, item.downloadFilename) + ',resume)') + path = filetools.join(DOWNLOAD_PATH, item.downloadFilename) + if filetools.isdir(path): + videos = [] + files = filetools.listdir(path) + for f in files: + if os.path.splitext(f)[-1] in extensions_list: + videos.append(f) + if len(videos) > 1: + selection = platformtools.dialog_select(config.get_localized_string(30034), files) + else: + selection = 0 + xbmc.executebuiltin('PlayMedia(' + filetools.join(path, files[selection]) + ',resume)') + else: + xbmc.executebuiltin('PlayMedia(' + path + ',resume)') if opciones[seleccion] != op[5]: platformtools.itemlist_refresh() def move_to_libray(item): - logger.info() + log() if item.contentType == 'movie': FOLDER = FOLDER_MOVIES @@ -360,6 +388,9 @@ def move_to_libray(item): library_path = filetools.join(move_path, *filetools.split(item.downloadFilename)) final_path = download_path + if not filetools.isdir(filetools.dirname(library_path)): + filetools.mkdir(filetools.dirname(library_path)) + if item.contentType == "movie" and item.infoLabels["tmdb_id"]: contentTitle = item.contentTitle if item.contentTitle else item.fulltitle library_item = Item(title= filetools.split(item.downloadFilename)[-1], channel="downloads", contentTitle = contentTitle, @@ -374,14 +405,11 @@ def move_to_libray(item): fulltitle = item.fulltitle, infoLabels={"tmdb_id": item.infoLabels["tmdb_id"]}) videolibrarytools.save_tvshow(tvshow, [library_item], silent=True) - if not filetools.isdir(filetools.dirname(library_path)): - filetools.mkdir(filetools.dirname(library_path)) - if filetools.isfile(library_path) and filetools.isfile(download_path): filetools.remove(library_path) if filetools.isfile(download_path): - if filetools.move(download_path, library_path): + if filetools.move(download_path, library_path, silent=True): final_path = library_path if len(filetools.listdir(filetools.dirname(download_path))) == 0: @@ -398,7 +426,7 @@ def move_to_libray(item): if filename.startswith(name) and (filename.endswith('.strm') or (filename.endswith('.json') and 'downloads' not in filename)): clean = True file_path = filetools.join(config.get_setting("videolibrarypath"), FOLDER, path_title, File) - logger.info('Delete File: ' + str(file_path)) + log('Delete File:', str(file_path)) filetools.remove(file_path) if file_path.endswith('.strm'): file_strm_path = file_path @@ -406,9 +434,8 @@ def move_to_libray(item): if config.is_xbmc() and config.get_setting("videolibrary_kodi"): from platformcode import xbmc_videolibrary if clean == True: - strm_list = [] - strm_list.append(file_strm_path) - xbmc_videolibrary.clean(strm_list) + path_list = [file_strm_path] + xbmc_videolibrary.clean(path_list) xbmc_videolibrary.update(FOLDER, path_title) @@ -446,9 +473,7 @@ def get_server_position(server): servers = {} if server in servers: - pos = [s for s in sorted(servers, key=lambda x: (old_div(sum(servers[x]["speeds"]), (len(servers[x]["speeds"]) or 1)), - float(sum(servers[x]["success"])) / ( - len(servers[x]["success"]) or 1)), reverse=True)] + pos = [s for s in sorted(servers, key=lambda x: (old_div(sum(servers[x]["speeds"]), (len(servers[x]["speeds"]) or 1)), float(sum(servers[x]["success"])) / ( len(servers[x]["success"]) or 1)), reverse=True)] return pos.index(server) + 1 else: return 0 @@ -456,27 +481,26 @@ def get_server_position(server): def get_match_list(data, match_list, order_list=None, only_ascii=False, ignorecase=False): """ - Busca coincidencias en una cadena de texto, con un diccionario de "ID" / "Listado de cadenas de busqueda": - { "ID1" : ["Cadena 1", "Cadena 2", "Cadena 3"], - "ID2" : ["Cadena 4", "Cadena 5", "Cadena 6"] - } + Search for matches in a text string, with a dictionary of "ID" / "List of search strings": +    {"ID1": ["String 1", "String 2", "String 3"], +      "ID2": ["String 4", "String 5", "String 6"] +    } - El diccionario no pude contener una misma cadena de busqueda en varías IDs. - - La busqueda se realiza por orden de tamaño de cadena de busqueda (de mas larga a mas corta) si una cadena coincide, - se elimina de la cadena a buscar para las siguientes, para que no se detecten dos categorias si una cadena es parte de otra: - por ejemplo: "Idioma Español" y "Español" si la primera aparece en la cadena "Pablo sabe hablar el Idioma Español" - coincidira con "Idioma Español" pero no con "Español" ya que la coincidencia mas larga tiene prioridad. +    The dictionary could not contain the same search string in several IDs. +    The search is performed in order of search string size (from longest to shortest) if a string matches, +    it is removed from the search string for the following, so that two categories are not detected if one string is part of another: +    for example: "Spanish Language" and "Spanish" if the first appears in the string "Pablo knows how to speak the Spanish Language" +    It will match "Spanish Language" but not "Spanish" since the longest match has priority. """ match_dict = dict() matches = [] - # Pasamos la cadena a unicode + # We pass the string to unicode if not PY3: data = unicode(data, "utf8") - # Pasamos el diccionario a {"Cadena 1": "ID1", "Cadena 2", "ID1", "Cadena 4", "ID2"} y los pasamos a unicode + # We pass the dictionary to {"String 1": "ID1", "String 2", "ID1", "String 4", "ID2"} and we pass them to unicode for key in match_list: if order_list and not key in order_list: raise Exception("key '%s' not in match_list" % key) @@ -488,17 +512,17 @@ def get_match_list(data, match_list, order_list=None, only_ascii=False, ignoreca else: match_dict[value] = key - # Si ignorecase = True, lo pasamos todo a mayusculas + # If ignorecase = True, we pass everything to capital letters if ignorecase: data = data.upper() match_dict = dict((key.upper(), match_dict[key]) for key in match_dict) - # Si ascii = True, eliminamos todos los accentos y Ñ + # If ascii = True, we remove all accents and Ñ if only_ascii: data = ''.join((c for c in unicodedata.normalize('NFD', data) if unicodedata.category(c) != 'Mn')) match_dict = dict((''.join((c for c in unicodedata.normalize('NFD', key) if unicodedata.category(c) != 'Mn')), match_dict[key]) for key in match_dict) - # Ordenamos el listado de mayor tamaño a menor y buscamos. + # We sort the list from largest to smallest and search. for match in sorted(match_dict, key=lambda x: len(x), reverse=True): s = data for a in matches: @@ -507,8 +531,7 @@ def get_match_list(data, match_list, order_list=None, only_ascii=False, ignoreca matches.append(match) if matches: if order_list: - return type("Mtch_list", (), - {"key": match_dict[matches[-1]], "index": order_list.index(match_dict[matches[-1]])}) + return type("Mtch_list", (), {"key": match_dict[matches[-1]], "index": order_list.index(match_dict[matches[-1]])}) else: return type("Mtch_list", (), {"key": match_dict[matches[-1]], "index": None}) else: @@ -563,22 +586,23 @@ def sort_method(item): def download_from_url(url, item): - logger.info("Attempting to download: %s" % (url)) - if url.lower().endswith(".m3u8") or url.lower().startswith("rtmp"): + log("Attempting to download:", url) + if url.lower().split('|')[0].endswith(".m3u8") or url.lower().startswith("rtmp"): save_server_statistics(item.server, 0, False) + platformtools.dialog_notification('m3u8 Download',config.get_localized_string(60364), sound=False) return {"downloadStatus": STATUS_CODES.error} - # Obtenemos la ruta de descarga y el nombre del archivo + # We get the download path and the file name item.downloadFilename = item.downloadFilename download_path = filetools.dirname(filetools.join(DOWNLOAD_PATH, item.downloadFilename)) file_name = filetools.basename(filetools.join(DOWNLOAD_PATH, item.downloadFilename)) - # Creamos la carpeta si no existe + # We create the folder if it does not exist if not filetools.exists(download_path): filetools.mkdir(download_path) - # Lanzamos la descarga + # We launch the download d = Downloader(url, download_path, file_name, max_connections=1 + int(config.get_setting("max_connections", "downloads")), block_size=2 ** (17 + int(config.get_setting("block_size", "downloads"))), @@ -593,20 +617,20 @@ def download_from_url(url, item): d.start_dialog(config.get_localized_string(60332)) - # Descarga detenida. Obtenemos el estado: - # Se ha producido un error en la descarga + # Download stopped. We get the state: + # Download failed if d.state == d.states.error: - logger.info("Error trying to download %s" % (url)) + log("Error trying to download", url) status = STATUS_CODES.error - # La descarga se ha detenifdo + # Download has stopped elif d.state == d.states.stopped: - logger.info("Stop download") + log("Stop download") status = STATUS_CODES.canceled - # La descarga ha finalizado + # Download is complete elif d.state == d.states.completed: - logger.info("Downloaded correctly") + log("Downloaded correctly") status = STATUS_CODES.completed if (item.downloadSize and item.downloadSize != d.size[0]) or d.size[0] < 5000000: # if size don't correspond or file is too little (gounlimited for example send a little video to say the server is overloaded) @@ -622,7 +646,7 @@ def download_from_url(url, item): def download_from_server(item): - logger.info(item.tostring()) + log(item.tostring()) unsupported_servers = ["torrent"] if item.contentChannel == 'local': @@ -652,34 +676,39 @@ def download_from_server(item): item.video_urls = itemlist if not item.server: item.server = "directo" else: - logger.info("There is nothing to reproduce") + log("There is nothing to reproduce") return {"downloadStatus": STATUS_CODES.error} finally: progreso.close() - logger.info("contentAction: %s | contentChannel: %s | server: %s | url: %s" % ( - item.contentAction, item.contentChannel, item.server, item.url)) + log("contentAction: %s | contentChannel: %s | server: %s | url: %s" % (item.contentAction, item.contentChannel, item.server, item.url)) + + if item.server == 'torrent': + import xbmcgui + xlistitem = xbmcgui.ListItem(path=item.url) + xlistitem.setArt({'icon': item.thumbnail, 'thumb': item.thumbnail, 'poster': item.thumbnail, 'fanart': item.thumbnail}) + platformtools.set_infolabels(xlistitem, item) + platformtools.play_torrent(item, xlistitem, item.url) if not item.server or not item.url or not item.contentAction == "play" or item.server in unsupported_servers: logger.error("The Item does not contain the necessary parameters.") return {"downloadStatus": STATUS_CODES.error} if not item.video_urls: - video_urls, puedes, motivo = servertools.resolve_video_urls_for_playing(item.server, item.url, item.password, - True, True) + video_urls, puedes, motivo = servertools.resolve_video_urls_for_playing(item.server, item.url, item.password, True, True) else: video_urls, puedes, motivo = item.video_urls, True, "" - # Si no esta disponible, salimos + # If it is not available, we go out if not puedes: - logger.info("The video is NOT available") + log("The video is NOT available") return {"downloadStatus": STATUS_CODES.error} else: - logger.info("YES Video is available") + log("YES Video is available") result = {} - # Recorre todas las opciones hasta que consiga descargar una correctamente + # Go through all the options until I can download one correctly for video_url in reversed(video_urls): result = download_from_url(video_url[1], item) @@ -687,23 +716,23 @@ def download_from_server(item): if result["downloadStatus"] in [STATUS_CODES.canceled, STATUS_CODES.completed]: break - # Error en la descarga, continuamos con la siguiente opcion + # Download error, we continue with the next option if result["downloadStatus"] == STATUS_CODES.error: continue - # Devolvemos el estado + # We return the state return result def download_from_best_server(item): - logger.info("contentAction: %s | contentChannel: %s | url: %s" % (item.contentAction, item.contentChannel, item.url)) + log("contentAction: %s | contentChannel: %s | url: %s" % (item.contentAction, item.contentChannel, item.url)) result = {"downloadStatus": STATUS_CODES.error} progreso = platformtools.dialog_progress_bg(config.get_localized_string(30101), config.get_localized_string(70179)) try: if item.downloadItemlist: - logger.info('using cached servers') + log('using cached servers') play_items = [Item().fromurl(i) for i in item.downloadItemlist] else: if item.contentChannel in ['community', 'videolibrary']: @@ -730,7 +759,7 @@ def download_from_best_server(item): finally: progreso.close() - # Recorremos el listado de servers, hasta encontrar uno que funcione + # We go through the list of servers, until we find one that works for play_item in play_items: play_item = item.clone(**play_item.__dict__) play_item.contentAction = play_item.action @@ -741,7 +770,7 @@ def download_from_best_server(item): # if progreso.iscanceled(): # result["downloadStatus"] = STATUS_CODES.canceled - # Tanto si se cancela la descarga como si se completa dejamos de probar mas opciones + # Whether the download is canceled or completed, we stop trying more options if result["downloadStatus"] in [STATUS_CODES.canceled, STATUS_CODES.completed]: result["downloadServer"] = {"url": play_item.url, "server": play_item.server} break @@ -752,12 +781,11 @@ def download_from_best_server(item): def select_server(item): if item.server: return "Auto" - logger.info( - "contentAction: %s | contentChannel: %s | url: %s" % (item.contentAction, item.contentChannel, item.url)) + log("contentAction: %s | contentChannel: %s | url: %s" % (item.contentAction, item.contentChannel, item.url)) progreso = platformtools.dialog_progress_bg(config.get_localized_string(30101), config.get_localized_string(70179)) try: if item.downloadItemlist: - logger.info('using cached servers') + log('using cached servers') play_items = [Item().fromurl(i) for i in item.downloadItemlist] else: if item.contentChannel in ['community', 'videolibrary']: @@ -785,7 +813,7 @@ def select_server(item): # if there is only one server select it seleccion = 1 else: - # altrimenti mostra la finestra di selezione + # otherwise it shows the selection window seleccion = platformtools.dialog_select(config.get_localized_string(70192), ["Auto"] + [s.title for s in play_items]) if seleccion >= 1: @@ -799,16 +827,15 @@ def select_server(item): def start_download(item): - logger.info( - "contentAction: %s | contentChannel: %s | url: %s" % (item.contentAction, item.contentChannel, item.url)) - # Ya tenemnos server, solo falta descargar + log("contentAction: %s | contentChannel: %s | url: %s" % (item.contentAction, item.contentChannel, item.url)) + # We already have a server, we just need to download if item.contentAction == "play": ret = download_from_server(item) elif item.downloadServer and item.downloadServer.get("server"): ret = download_from_server( item.clone(server=item.downloadServer.get("server"), url=item.downloadServer.get("url"), contentAction="play")) - # No tenemos server, necesitamos buscar el mejor + # We don't have a server, we need to find the best else: ret = download_from_best_server(item) @@ -820,29 +847,28 @@ def start_download(item): def get_episodes(item): - logger.info("contentAction: %s | contentChannel: %s | contentType: %s" % ( - item.contentAction, item.contentChannel, item.contentType)) + log("contentAction: %s | contentChannel: %s | contentType: %s" % (item.contentAction, item.contentChannel, item.contentType)) if 'dlseason' in item: season = True season_number = item.dlseason else: season = False - # El item que pretendemos descargar YA es un episodio + # The item we want to download NOW is an episode if item.contentType == "episode": episodes = [item.clone()] - # El item es uma serie o temporada + # The item is a series or season elif item.contentType in ["tvshow", "season"]: if item.downloadItemlist: episodes = [Item().fromurl(i) for i in item.downloadItemlist] else: - # importamos el canal + # The item is a series or season... if item.contentChannel in ['community', 'videolibrary']: channel = __import__('specials.%s' % item.contentChannel, None, None, ["specials.%s" % item.contentChannel]) else: channel = __import__('channels.%s' % item.contentChannel, None, None, ["channels.%s" % item.contentChannel]) - # Obtenemos el listado de episodios + # We get the list of episodes episodes = getattr(channel, item.contentAction)(item) itemlist = [] @@ -855,38 +881,38 @@ def get_episodes(item): else: renumber(episodes, item) - # Tenemos las lista, ahora vamos a comprobar + # We get the list of episodes... for episode in episodes: - # Si partiamos de un item que ya era episodio estos datos ya están bien, no hay que modificarlos + # If we started from an item that was already an episode, this data is already good, it should not be modified if item.contentType != "episode": episode.contentAction = episode.action episode.contentChannel = episode.channel - # Si el resultado es una temporada, no nos vale, tenemos que descargar los episodios de cada temporada + # If the result is a season, it is not worth it, we have to download the episodes of each season if episode.contentType == "season": itemlist.extend(get_episodes(episode)) - # Si el resultado es un episodio ya es lo que necesitamos, lo preparamos para añadirlo a la descarga + # If the result is an episode is already what we need, we prepare it to add it to the download if episode.contentType == "episode": - # Pasamos el id al episodio + # We pass the id to the episode if not episode.infoLabels["tmdb_id"]: episode.infoLabels["tmdb_id"] = item.infoLabels["tmdb_id"] - # Episodio, Temporada y Titulo + # Episode, Season and Title if not episode.contentSeason or not episode.contentEpisodeNumber: season_and_episode = scrapertools.get_season_and_episode(episode.title) if season_and_episode: episode.contentSeason = season_and_episode.split("x")[0] episode.contentEpisodeNumber = season_and_episode.split("x")[1] - # Buscamos en tmdb + # Episode, Season and Title... if item.infoLabels["tmdb_id"]: scraper.find_and_set_infoLabels(episode) - # Episodio, Temporada y Titulo + # Episode, Season and Title if not episode.contentTitle: - episode.contentTitle = re.sub("\[[^\]]+\]|\([^\)]+\)|\d*x\d*\s*-", "", episode.title).strip() + episode.contentTitle = re.sub(r"\[[^\]]+\]|\([^\)]+\)|\d*x\d*\s*-", "", episode.title).strip() episode.downloadFilename = filetools.validate_path(filetools.join(item.downloadFilename, "%dx%0.2d - %s" % (episode.contentSeason, episode.contentEpisodeNumber, episode.contentTitle.strip()))) if season: @@ -896,25 +922,27 @@ def get_episodes(item): itemlist.append(episode) - # Cualquier otro resultado no nos vale, lo ignoramos + # Any other result is not worth it, we ignore it else: - logger.info("Omitiendo item no válido: %s" % episode.tostring()) + log("Omitiendo item no válido:", episode.tostring()) - # if Multiple Languages or Qualities + # Any other result is not worth it, we ignore it... itemlist = videolibrarytools.filter_list(itemlist) return itemlist def write_json(item): - logger.info() + log() + channel = item.from_channel if item.from_channel else item.channel item.action = "menu" item.channel = "downloads" item.downloadStatus = STATUS_CODES.stoped item.downloadProgress = 0 item.downloadSize = 0 item.downloadCompleted = 0 + title = re.sub(r'(?:\[[^\]]+\]|%s[^-]+-\s*)' %config.get_localized_string(60356), '', item.title).strip() if not item.contentThumbnail: item.contentThumbnail = item.thumbnail @@ -922,7 +950,17 @@ def write_json(item): if name in item.__dict__: item.__dict__.pop(name) - path = filetools.join(DOWNLOAD_LIST_PATH, str(time.time()) + ".json") + if item.contentType == 'episode': + naming = title + typo(item.infoLabels['IMDBNumber'], '_ []') + typo(channel, '_ []') + else: + naming = item.fulltitle + typo(item.infoLabels['IMDBNumber'], '_ []') + typo(channel, '_ []') + naming += typo(item.contentLanguage, '_ []') if item.contentLanguage else '' + naming += typo(item.quality, '_ []') if item.quality else '' + + path = filetools.join(DOWNLOAD_LIST_PATH, naming + ".json") + if filetools.isfile(path): + filetools.remove(path) + item.path = path filetools.write(path, item.tojson()) time.sleep(0.1) @@ -940,7 +978,7 @@ def save_download(item): def save_download_background(item): - logger.info() + log() # Menu contextual if item.from_action and item.from_channel: item.channel = item.from_channel @@ -989,7 +1027,7 @@ def save_download_background(item): def save_download_videolibrary(item): - logger.info() + log() show_disclaimer() item.contentChannel = 'videolibrary' item.channel = "downloads" @@ -998,8 +1036,7 @@ def save_download_videolibrary(item): def save_download_video(item): - logger.info("contentAction: %s | contentChannel: %s | contentTitle: %s" % ( - item.contentAction, item.contentChannel, item.contentTitle)) + log("contentAction: %s | contentChannel: %s | contentTitle: %s" % (item.contentAction, item.contentChannel, item.contentTitle)) set_movie_title(item) @@ -1014,7 +1051,7 @@ def save_download_video(item): def save_download_movie(item): - logger.info("contentAction: %s | contentChannel: %s | contentTitle: %s" % ( item.contentAction, item.contentChannel, item.contentTitle)) + log("contentAction: %s | contentChannel: %s | contentTitle: %s" % ( item.contentAction, item.contentChannel, item.contentTitle)) progreso = platformtools.dialog_progress_bg(config.get_localized_string(30101), config.get_localized_string(70191)) @@ -1028,14 +1065,14 @@ def save_download_movie(item): progreso.update(0, config.get_localized_string(60062)) item.downloadFilename = filetools.validate_path("%s [%s]" % (item.contentTitle.strip(), item.infoLabels['IMDBNumber'])) + item.backupFilename = filetools.validate_path("%s [%s]" % (item.contentTitle.strip(), item.infoLabels['IMDBNumber'])) write_json(item) progreso.close() if not platformtools.dialog_yesno(config.get_localized_string(30101), config.get_localized_string(70189)): - platformtools.dialog_ok(config.get_localized_string(30101), item.contentTitle, - config.get_localized_string(30109)) + platformtools.dialog_ok(config.get_localized_string(30101), item.contentTitle, config.get_localized_string(30109)) else: play_item = select_server(item) if play_item == 'Auto': @@ -1048,8 +1085,7 @@ def save_download_movie(item): def save_download_tvshow(item): - logger.info("contentAction: %s | contentChannel: %s | contentType: %s | contentSerieName: %s" % ( - item.contentAction, item.contentChannel, item.contentType, item.contentSerieName)) + log("contentAction: %s | contentChannel: %s | contentType: %s | contentSerieName: %s" % (item.contentAction, item.contentChannel, item.contentType, item.contentSerieName)) progreso = platformtools.dialog_progress_bg(config.get_localized_string(30101), config.get_localized_string(70188)) try: @@ -1077,9 +1113,8 @@ def save_download_tvshow(item): progreso.close() if not platformtools.dialog_yesno(config.get_localized_string(30101), config.get_localized_string(70189)): - platformtools.dialog_ok(config.get_localized_string(30101), - str(len(episodes)) + config.get_localized_string(30110) + item.contentSerieName, - config.get_localized_string(30109)) + platformtools.dialog_ok(config.get_localized_string(30101), str(len(episodes)) + config.get_localized_string(30110) + item.contentSerieName, config.get_localized_string(30109)) + else: if len(episodes) == 1: play_item = select_server(episodes[0]) @@ -1101,10 +1136,10 @@ def save_download_tvshow(item): def set_movie_title(item): if not item.contentTitle: - item.contentTitle = re.sub("\[[^\]]+\]|\([^\)]+\)", "", item.contentTitle).strip() + item.contentTitle = re.sub(r"\[[^\]]+\]|\([^\)]+\)", "", item.contentTitle).strip() if not item.contentTitle: - item.contentTitle = re.sub("\[[^\]]+\]|\([^\)]+\)", "", item.title).strip() + item.contentTitle = re.sub(r"\[[^\]]+\]|\([^\)]+\)", "", item.title).strip() def show_disclaimer(): diff --git a/specials/filmontv.json b/specials/filmontv.json index fcf35bf5..39fb9c6b 100644 --- a/specials/filmontv.json +++ b/specials/filmontv.json @@ -3,7 +3,6 @@ "name": "Film in tv", "language": ["ita"], "active": false, - "adult": false, "thumbnail": null, "banner": null, "categories": [], diff --git a/specials/help.json b/specials/help.json index 5a49476b..8e51ddd1 100644 --- a/specials/help.json +++ b/specials/help.json @@ -2,6 +2,5 @@ "id": "help", "name": "Ayuda", "active": false, - "adult": false, "language": ["*"] } \ No newline at end of file diff --git a/specials/news.json b/specials/news.json index 63fb0be7..5c5e7f87 100644 --- a/specials/news.json +++ b/specials/news.json @@ -2,7 +2,6 @@ "id": "news", "name": "Novedades", "active": false, - "adult": false, "language": ["*"], "categories": [ "movie" diff --git a/specials/news.py b/specials/news.py index 63aad9dd..3d9a4ad1 100644 --- a/specials/news.py +++ b/specials/news.py @@ -119,7 +119,7 @@ def mainlist(item): set_category_context(new_item) itemlist.append(new_item) thumbnail = get_thumb("setting_0.png") - itemlist.append(Item(channel='shortcuts', action="SettingOnPosition", category=5, setting=0, + itemlist.append(Item(channel='shortcuts', action="SettingOnPosition", category=7, setting=1, title=typo(config.get_localized_string(70285), 'bold color kod'), thumbnail=thumbnail)) return itemlist @@ -155,10 +155,6 @@ def get_channels_list(): if not channel_parameters["active"]: continue - # No incluir si es un canal para adultos, y el modo adulto está desactivado - if channel_parameters["adult"] and config.get_setting("adult_mode") == 0: - continue - # No incluir si el canal es en un idioma filtrado if channel_language != "all" and channel_language not in str(channel_parameters["language"]) \ and "*" not in channel_parameters["language"]: @@ -630,10 +626,6 @@ def setting_channel(item): if not channel_parameters["active"]: continue - # No incluir si es un canal para adultos, y el modo adulto está desactivado - if channel_parameters["adult"] and config.get_setting("adult_mode") == 0: - continue - # No incluir si el canal es en un idioma filtrado if channel_language != "all" and channel_language not in str(channel_parameters["language"]) \ and "*" not in channel_parameters["language"]: diff --git a/specials/resolverdns.py b/specials/resolverdns.py index 56e5b126..f73ed6ae 100644 --- a/specials/resolverdns.py +++ b/specials/resolverdns.py @@ -10,6 +10,7 @@ from lib.requests_toolbelt.adapters import host_header_ssl from lib import doh from platformcode import logger, config import requests +from core import scrapertools try: import _sqlite3 as sql @@ -107,7 +108,10 @@ class CipherSuiteAdapter(host_header_ssl.HostHeaderSSLAdapter): domain = parse.netloc else: raise requests.exceptions.URLRequired - ip = self.getIp(domain) + if not scrapertools.find_single_match(domain, '\d+\.\d+\.\d+\.\d+'): + ip = self.getIp(domain) + else: + ip = None if ip: self.ssl_context = CustomContext(protocol, domain) if self.CF: diff --git a/specials/search.json b/specials/search.json index 0db387a0..947ebb08 100644 --- a/specials/search.json +++ b/specials/search.json @@ -2,7 +2,6 @@ "id": "search", "name": "search", "active": false, - "adult": false, "thumbnail": "", "banner": "", "categories": [], diff --git a/specials/search.py b/specials/search.py index 7e8eab43..4a22f3cf 100644 --- a/specials/search.py +++ b/specials/search.py @@ -46,7 +46,7 @@ def mainlist(item): Item(channel=item.channel, title=typo(config.get_localized_string(59994), 'color kod bold'), action='opciones', thumbnail=get_thumb('setting_0.png')), - Item(channel='shortcuts', title=typo(config.get_localized_string(70286), 'color kod bold'), action='SettingOnPosition', category=3, thumbnail=get_thumb('setting_0.png'))] + Item(channel='shortcuts', title=typo(config.get_localized_string(70286), 'color kod bold'), action='SettingOnPosition', category=5, setting=1, thumbnail=get_thumb('setting_0.png'))] itemlist = set_context(itemlist) @@ -298,34 +298,30 @@ def channel_search(item): def get_channel_results(ch, item): max_results = 10 results = list() + try: + ch_params = channeltools.get_channel_parameters(ch) - ch_params = channeltools.get_channel_parameters(ch) + module = __import__('channels.%s' % ch_params["channel"], fromlist=["channels.%s" % ch_params["channel"]]) + mainlist = getattr(module, 'mainlist')(Item(channel=ch_params["channel"])) + search_action = [elem for elem in mainlist if elem.action == "search" and (item.mode == 'all' or elem.contentType == item.mode)] - module = __import__('channels.%s' % ch_params["channel"], fromlist=["channels.%s" % ch_params["channel"]]) - mainlist = getattr(module, 'mainlist')(Item(channel=ch_params["channel"])) - search_action = [elem for elem in mainlist if elem.action == "search" and (item.mode == 'all' or elem.contentType == item.mode)] - - if search_action: - for search_ in search_action: - try: + if search_action: + for search_ in search_action: results.extend(module.search(search_, item.text)) - except: - pass - else: - try: + else: results.extend(module.search(item, item.text)) - except: - pass - if len(results) < 0 and len(results) < max_results and item.mode != 'all': + if len(results) < 0 and len(results) < max_results and item.mode != 'all': - if len(results) == 1: - if not results[0].action or config.get_localized_string(30992).lower() in results[0].title.lower(): - return [ch, []] + if len(results) == 1: + if not results[0].action or config.get_localized_string(30992).lower() in results[0].title.lower(): + return [ch, []] - results = get_info(results) + results = get_info(results) - return [ch, results] + return [ch, results] + except: + return [ch, results] def get_info(itemlist): @@ -418,8 +414,6 @@ def setting_channel_new(item): presel_values = ['skip', 'actual', 'all', 'none'] categs = ['movie', 'tvshow', 'documentary', 'anime', 'vos', 'direct', 'torrent'] - if config.get_setting('adult_mode') > 0: - categs.append('adult') for c in categs: preselecciones.append(config.get_localized_string(70577) + config.get_localized_category(c)) presel_values.append(c) diff --git a/specials/setting.py b/specials/setting.py index ed947e7f..27826152 100644 --- a/specials/setting.py +++ b/specials/setting.py @@ -107,142 +107,142 @@ def autostart(item): # item necessario launcher.py linea 265 # xbmcgui.Dialog().ok(config.get_localized_string(20000), config.get_localized_string(70710)) -def setting_torrent(item): - logger.info() +# def setting_torrent(item): +# logger.info() - LIBTORRENT_PATH = config.get_setting("libtorrent_path", server="torrent", default="") - LIBTORRENT_ERROR = config.get_setting("libtorrent_error", server="torrent", default="") - default = config.get_setting("torrent_client", server="torrent", default=0) - BUFFER = config.get_setting("mct_buffer", server="torrent", default="50") - DOWNLOAD_PATH = config.get_setting("mct_download_path", server="torrent", default=config.get_setting("downloadpath")) - if not DOWNLOAD_PATH: DOWNLOAD_PATH = filetools.join(config.get_data_path(), 'downloads') - BACKGROUND = config.get_setting("mct_background_download", server="torrent", default=True) - RAR = config.get_setting("mct_rar_unpack", server="torrent", default=True) - DOWNLOAD_LIMIT = config.get_setting("mct_download_limit", server="torrent", default="") - BUFFER_BT = config.get_setting("bt_buffer", server="torrent", default="50") - DOWNLOAD_PATH_BT = config.get_setting("bt_download_path", server="torrent", default=config.get_setting("downloadpath")) - if not DOWNLOAD_PATH_BT: DOWNLOAD_PATH_BT = filetools.join(config.get_data_path(), 'downloads') - MAGNET2TORRENT = config.get_setting("magnet2torrent", server="torrent", default=False) +# LIBTORRENT_PATH = config.get_setting("libtorrent_path", server="torrent", default="") +# LIBTORRENT_ERROR = config.get_setting("libtorrent_error", server="torrent", default="") +# default = config.get_setting("torrent_client", server="torrent", default=0) +# BUFFER = config.get_setting("mct_buffer", server="torrent", default="50") +# DOWNLOAD_PATH = config.get_setting("mct_download_path", server="torrent", default=config.get_setting("downloadpath")) +# if not DOWNLOAD_PATH: DOWNLOAD_PATH = filetools.join(config.get_data_path(), 'downloads') +# BACKGROUND = config.get_setting("mct_background_download", server="torrent", default=True) +# RAR = config.get_setting("mct_rar_unpack", server="torrent", default=True) +# DOWNLOAD_LIMIT = config.get_setting("mct_download_limit", server="torrent", default="") +# BUFFER_BT = config.get_setting("bt_buffer", server="torrent", default="50") +# DOWNLOAD_PATH_BT = config.get_setting("bt_download_path", server="torrent", default=config.get_setting("downloadpath")) +# if not DOWNLOAD_PATH_BT: DOWNLOAD_PATH_BT = filetools.join(config.get_data_path(), 'downloads') +# MAGNET2TORRENT = config.get_setting("magnet2torrent", server="torrent", default=False) - torrent_options = [config.get_localized_string(30006), config.get_localized_string(70254), config.get_localized_string(70255)] - torrent_options.extend(platformtools.torrent_client_installed()) +# torrent_options = [config.get_localized_string(30006), config.get_localized_string(70254), config.get_localized_string(70255)] +# torrent_options.extend(platformtools.torrent_client_installed()) - list_controls = [ - { - "id": "libtorrent_path", - "type": "text", - "label": "Libtorrent path", - "default": LIBTORRENT_PATH, - "enabled": True, - "visible": False - }, - { - "id": "libtorrent_error", - "type": "text", - "label": "libtorrent error", - "default": LIBTORRENT_ERROR, - "enabled": True, - "visible": False - }, - { - "id": "list_torrent", - "type": "list", - "label": config.get_localized_string(70256), - "default": default, - "enabled": True, - "visible": True, - "lvalues": torrent_options - }, - { - "id": "mct_buffer", - "type": "text", - "label": "MCT - " + config.get_localized_string(70758), - "default": BUFFER, - "enabled": True, - "visible": "eq(-1,%s)" % torrent_options[2] - }, - { - "id": "mct_download_path", - "type": "text", - "label": "MCT - " + config.get_localized_string(30017), - "default": DOWNLOAD_PATH, - "enabled": True, - "visible": "eq(-2,%s)" % torrent_options[2] - }, - { - "id": "bt_buffer", - "type": "text", - "label": "BT - " + config.get_localized_string(70758), - "default": BUFFER_BT, - "enabled": True, - "visible": "eq(-3,%s)" % torrent_options[1] - }, - { - "id": "bt_download_path", - "type": "text", - "label": "BT - " + config.get_localized_string(30017), - "default": DOWNLOAD_PATH_BT, - "enabled": True, - "visible": "eq(-4,%s)" % torrent_options[1] - }, - { - "id": "mct_download_limit", - "type": "text", - "label": config.get_localized_string(70759), - "default": DOWNLOAD_LIMIT, - "enabled": True, - "visible": "eq(-5,%s) | eq(-5,%s)" % (torrent_options[1], torrent_options[2]) - }, - { - "id": "mct_rar_unpack", - "type": "bool", - "label": config.get_localized_string(70760), - "default": RAR, - "enabled": True, - "visible": True - }, - { - "id": "mct_background_download", - "type": "bool", - "label": config.get_localized_string(70761), - "default": BACKGROUND, - "enabled": True, - "visible": True - }, - { - "id": "magnet2torrent", - "type": "bool", - "label": config.get_localized_string(70762), - "default": MAGNET2TORRENT, - "enabled": True, - "visible": True - } - ] +# list_controls = [ +# { +# "id": "libtorrent_path", +# "type": "text", +# "label": "Libtorrent path", +# "default": LIBTORRENT_PATH, +# "enabled": True, +# "visible": False +# }, +# { +# "id": "libtorrent_error", +# "type": "text", +# "label": "libtorrent error", +# "default": LIBTORRENT_ERROR, +# "enabled": True, +# "visible": False +# }, +# { +# "id": "list_torrent", +# "type": "list", +# "label": config.get_localized_string(70256), +# "default": default, +# "enabled": True, +# "visible": True, +# "lvalues": torrent_options +# }, +# { +# "id": "mct_buffer", +# "type": "text", +# "label": "MCT - " + config.get_localized_string(70758), +# "default": BUFFER, +# "enabled": True, +# "visible": "eq(-1,%s)" % torrent_options[2] +# }, +# { +# "id": "mct_download_path", +# "type": "text", +# "label": "MCT - " + config.get_localized_string(30017), +# "default": DOWNLOAD_PATH, +# "enabled": True, +# "visible": "eq(-2,%s)" % torrent_options[2] +# }, +# { +# "id": "bt_buffer", +# "type": "text", +# "label": "BT - " + config.get_localized_string(70758), +# "default": BUFFER_BT, +# "enabled": True, +# "visible": "eq(-3,%s)" % torrent_options[1] +# }, +# { +# "id": "bt_download_path", +# "type": "text", +# "label": "BT - " + config.get_localized_string(30017), +# "default": DOWNLOAD_PATH_BT, +# "enabled": True, +# "visible": "eq(-4,%s)" % torrent_options[1] +# }, +# { +# "id": "mct_download_limit", +# "type": "text", +# "label": config.get_localized_string(70759), +# "default": DOWNLOAD_LIMIT, +# "enabled": True, +# "visible": "eq(-5,%s) | eq(-5,%s)" % (torrent_options[1], torrent_options[2]) +# }, +# { +# "id": "mct_rar_unpack", +# "type": "bool", +# "label": config.get_localized_string(70760), +# "default": RAR, +# "enabled": True, +# "visible": True +# }, +# { +# "id": "mct_background_download", +# "type": "bool", +# "label": config.get_localized_string(70761), +# "default": BACKGROUND, +# "enabled": True, +# "visible": True +# }, +# { +# "id": "magnet2torrent", +# "type": "bool", +# "label": config.get_localized_string(70762), +# "default": MAGNET2TORRENT, +# "enabled": True, +# "visible": True +# } +# ] - platformtools.show_channel_settings(list_controls=list_controls, callback='save_setting_torrent', item=item, - caption=config.get_localized_string(70257), custom_button={'visible': False}) +# platformtools.show_channel_settings(list_controls=list_controls, callback='save_setting_torrent', item=item, +# caption=config.get_localized_string(70257), custom_button={'visible': False}) -def save_setting_torrent(item, dict_data_saved): - if dict_data_saved and "list_torrent" in dict_data_saved: - config.set_setting("torrent_client", dict_data_saved["list_torrent"], server="torrent") - if dict_data_saved and "mct_buffer" in dict_data_saved: - config.set_setting("mct_buffer", dict_data_saved["mct_buffer"], server="torrent") - if dict_data_saved and "mct_download_path" in dict_data_saved: - config.set_setting("mct_download_path", dict_data_saved["mct_download_path"], server="torrent") - if dict_data_saved and "mct_background_download" in dict_data_saved: - config.set_setting("mct_background_download", dict_data_saved["mct_background_download"], server="torrent") - if dict_data_saved and "mct_rar_unpack" in dict_data_saved: - config.set_setting("mct_rar_unpack", dict_data_saved["mct_rar_unpack"], server="torrent") - if dict_data_saved and "mct_download_limit" in dict_data_saved: - config.set_setting("mct_download_limit", dict_data_saved["mct_download_limit"], server="torrent") - if dict_data_saved and "bt_buffer" in dict_data_saved: - config.set_setting("bt_buffer", dict_data_saved["bt_buffer"], server="torrent") - if dict_data_saved and "bt_download_path" in dict_data_saved: - config.set_setting("bt_download_path", dict_data_saved["bt_download_path"], server="torrent") - if dict_data_saved and "magnet2torrent" in dict_data_saved: - config.set_setting("magnet2torrent", dict_data_saved["magnet2torrent"], server="torrent") +# def save_setting_torrent(item, dict_data_saved): +# if dict_data_saved and "list_torrent" in dict_data_saved: +# config.set_setting("torrent_client", dict_data_saved["list_torrent"], server="torrent") +# if dict_data_saved and "mct_buffer" in dict_data_saved: +# config.set_setting("mct_buffer", dict_data_saved["mct_buffer"], server="torrent") +# if dict_data_saved and "mct_download_path" in dict_data_saved: +# config.set_setting("mct_download_path", dict_data_saved["mct_download_path"], server="torrent") +# if dict_data_saved and "mct_background_download" in dict_data_saved: +# config.set_setting("mct_background_download", dict_data_saved["mct_background_download"], server="torrent") +# if dict_data_saved and "mct_rar_unpack" in dict_data_saved: +# config.set_setting("mct_rar_unpack", dict_data_saved["mct_rar_unpack"], server="torrent") +# if dict_data_saved and "mct_download_limit" in dict_data_saved: +# config.set_setting("mct_download_limit", dict_data_saved["mct_download_limit"], server="torrent") +# if dict_data_saved and "bt_buffer" in dict_data_saved: +# config.set_setting("bt_buffer", dict_data_saved["bt_buffer"], server="torrent") +# if dict_data_saved and "bt_download_path" in dict_data_saved: +# config.set_setting("bt_download_path", dict_data_saved["bt_download_path"], server="torrent") +# if dict_data_saved and "magnet2torrent" in dict_data_saved: +# config.set_setting("magnet2torrent", dict_data_saved["magnet2torrent"], server="torrent") def menu_servers(item): logger.info() @@ -468,16 +468,16 @@ def check_quickfixes(item): return False -def update_quasar(item): - logger.info() +# def update_quasar(item): +# logger.info() - from platformcode import custom_code, platformtools - stat = False - stat = custom_code.update_external_addon("quasar") - if stat: - platformtools.dialog_notification("Actualización Quasar", "Realizada con éxito") - else: - platformtools.dialog_notification("Actualización Quasar", "Ha fallado. Consulte el log") +# from platformcode import custom_code, platformtools +# stat = False +# stat = custom_code.update_external_addon("quasar") +# if stat: +# platformtools.dialog_notification("Actualización Quasar", "Realizada con éxito") +# else: +# platformtools.dialog_notification("Actualización Quasar", "Ha fallado. Consulte el log") def conf_tools(item): diff --git a/specials/shortcuts.py b/specials/shortcuts.py index b43b6478..32a552d0 100644 --- a/specials/shortcuts.py +++ b/specials/shortcuts.py @@ -8,12 +8,12 @@ def context(): # original # if config.get_setting('quick_menu'): context.append((config.get_localized_string(60360).upper(), "XBMC.RunPlugin(plugin://plugin.video.kod/?%s)" % Item(channel='shortcuts', action="shortcut_menu").tourl())) # if config.get_setting('side_menu'): context.append((config.get_localized_string(70737).upper(), "XBMC.RunPlugin(plugin://plugin.video.kod/?%s)" % Item(channel='shortcuts',action="side_menu").tourl())) - # if config.get_setting('kod_menu'): context.append((config.get_localized_string(30025), "XBMC.RunPlugin(plugin://plugin.video.kod/?%s)" % Item(channel='shortcuts', action="settings_menu").tourl())) + # if config.get_setting('kod_menu'): context.append((config.get_localized_string(60026), "XBMC.RunPlugin(plugin://plugin.video.kod/?%s)" % Item(channel='shortcuts', action="settings_menu").tourl())) # pre-serialised - if config.get_setting('quick_menu'): context.append((config.get_localized_string(60360).upper(), 'XBMC.RunPlugin(plugin://plugin.video.kod/?ewogICAgImFjdGlvbiI6ICJzaG9ydGN1dF9tZW51IiwgCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiLCAKICAgICJpbmZvTGFiZWxzIjoge30KfQ%3D%3D)')) - if config.get_setting('side_menu'): context.append((config.get_localized_string(70737).upper(), 'XBMC.RunPlugin(plugin://plugin.video.kod/?ewogICAgImFjdGlvbiI6ICJzaWRlX21lbnUiLCAKICAgICJjaGFubmVsIjogInNob3J0Y3V0cyIsIAogICAgImluZm9MYWJlbHMiOiB7fQp9)')) - if config.get_setting('kod_menu'): context.append((config.get_localized_string(30025), 'XBMC.RunPlugin(plugin://plugin.video.kod/?ewogICAgImFjdGlvbiI6ICJzZXR0aW5nc19tZW51IiwgCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiLCAKICAgICJpbmZvTGFiZWxzIjoge30KfQ%3D%3D)')) + if config.get_setting('quick_menu'): context.append((config.get_localized_string(60360), 'XBMC.RunPlugin(plugin://plugin.video.kod/?ewogICAgImFjdGlvbiI6ICJzaG9ydGN1dF9tZW51IiwgCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiLCAKICAgICJpbmZvTGFiZWxzIjoge30KfQ%3D%3D)')) + if config.get_setting('side_menu'): context.append((config.get_localized_string(70737), 'XBMC.RunPlugin(plugin://plugin.video.kod/?ewogICAgImFjdGlvbiI6ICJzaWRlX21lbnUiLCAKICAgICJjaGFubmVsIjogInNob3J0Y3V0cyIsIAogICAgImluZm9MYWJlbHMiOiB7fQp9)')) + if config.get_setting('kod_menu'): context.append((config.get_localized_string(60026), 'XBMC.RunPlugin(plugin://plugin.video.kod/?ewogICAgImFjdGlvbiI6ICJzZXR0aW5nc19tZW51IiwgCiAgICAiY2hhbm5lbCI6ICJzaG9ydGN1dHMiLCAKICAgICJpbmZvTGFiZWxzIjoge30KfQ%3D%3D)')) return context @@ -29,36 +29,6 @@ def settings_menu(item): from platformcode import config config.open_settings() -def view_mode(item): - logger.info(str(item)) - import xbmc - from core import filetools, jsontools - from core.support import typo - from platformcode import config, platformtools - - skin_name = xbmc.getSkinDir() - config.set_setting('skin_name', skin_name) - - path = filetools.join(config.get_runtime_path(), 'resources', 'views', skin_name + '.json') - if filetools.isfile(path): - json_file = open(path, "r").read() - json = jsontools.load(json_file) - - Type = 'addon'if item.type in ['channel', 'server'] else item.type - skin = json[Type] - - list_type = [] - for key in skin: - list_type.append(key) - list_type.sort() - list_type.insert(0, config.get_localized_string(70003)) - - select = platformtools.dialog_select(config.get_localized_string(70754), list_type) - value = list_type[select] + ' , ' + str(skin[list_type[select]] if list_type[select] in skin else 0) - config.set_setting('view_mode_%s' % item.type, value) - else: - platformtools.dialog_ok(config.get_localized_string(30141), config.get_localized_string(30142) % typo(skin_name.replace('skin.','').replace('.',' '), 'capitalize bold')) - def servers_menu(item): # from core.support import dbg; dbg() from core import servertools @@ -177,5 +147,5 @@ def select(item): else: values = item.values.split('|') - select = platformtools.dialog_select(label, values) + select = platformtools.dialog_select(label, values, config.get_setting(item.id)) config.set_setting(item.id, values[select]) \ No newline at end of file diff --git a/specials/trailertools.py b/specials/trailertools.py index 683ae7ca..7db64695 100644 --- a/specials/trailertools.py +++ b/specials/trailertools.py @@ -64,7 +64,7 @@ def buscartrailer(item, trailers=[]): itemlist = [] if item.search_title: - item.contentTitle = item.search_title + item.contentTitle = urllib.unquote_plus(item.search_title) elif item.contentTitle != "": item.contentTitle = item.contentTitle.strip() elif keyboard: diff --git a/specials/tvmoviedb.json b/specials/tvmoviedb.json index 7a97a93c..250e4adc 100644 --- a/specials/tvmoviedb.json +++ b/specials/tvmoviedb.json @@ -2,7 +2,6 @@ "id": "tvmoviedb", "name": "TvMovieDB", "active": false, - "adult": false, "language": ["*"], "thumbnail": "http://i.imgur.com/HA7fvgD.png", "categories": [ diff --git a/specials/url.json b/specials/url.json index 16b4a1b4..693984be 100644 --- a/specials/url.json +++ b/specials/url.json @@ -2,7 +2,6 @@ "id": "url", "name": "URL", "active": false, - "adult": false, "thumbnail": "url.png", "banner": "url.png" } \ No newline at end of file diff --git a/specials/videolibrary.json b/specials/videolibrary.json index 89e04bc2..20d3056f 100644 --- a/specials/videolibrary.json +++ b/specials/videolibrary.json @@ -2,9 +2,78 @@ "id": "videolibrary", "name": "Videoteca", "active": false, - "adult": false, "language": ["*"], "settings": [ + { + "id": "update", + "type": "list", + "label": "@60601", + "default": 1, + "visible": true, + "lvalues": [ + "@60602", + "@60603", + "@60604", + "@60605" + ] + }, + { + "id": "update_wait", + "type": "list", + "label": "@60606", + "default": 0, + "enabled": "eq(-1,@60603)|eq(-1,@60605)", + "lvalues": [ + "No", + "@60609", + "@60610", + "@60611", + "@60612" + ] + }, + { + "id": "everyday_delay", + "type": "list", + "label": "@60613", + "default": 1, + "enabled": "eq(-2,@60604)|eq(-2,@60605)", + "lvalues": [ + "00:00", + "04:00", + "08:00", + "12:00", + "16:00", + "20:00" + ] + }, + { + "id": "updatetvshows_interval", + "type": "list", + "label": "@60614", + "default": 0, + "enabled": "!eq(-3,@60615)", + "lvalues": [ + "@60616", + "@60617" + ] + }, + { + "id": "search_new_content", + "type": "list", + "label": "@60618", + "default": 0, + "enabled": "!eq(-4,@60615)", + "lvalues": [ + "@60619", + "@60620" + ] + }, + { + "id": "local_episodes", + "type": "bool", + "label": "@80042", + "default": false + }, { "id": "lab_1", "type": "label", @@ -56,73 +125,6 @@ "pt" ] }, - { - "id": "update", - "type": "list", - "label": "@60601", - "default": 1, - "visible": true, - "lvalues": [ - "@60602", - "@60603", - "@60604", - "@60605" - ] - }, - { - "id": "update_wait", - "type": "list", - "label": "@60606", - "default": 0, - "visible": true, - "enabled": "eq(-1,@60603)|eq(-1,@60605)", - "lvalues": [ - "No", - "@60609", - "@60610", - "@60611", - "@60612" - ] - }, - { - "id": "everyday_delay", - "type": "list", - "label": "@60613", - "default": 1, - "visible": true, - "enabled": "eq(-2,@60604)|eq(-2,@60605)", - "lvalues": [ - "00:00", - "04:00", - "08:00", - "12:00", - "16:00", - "20:00" - ] - }, - { - "id": "updatetvshows_interval", - "type": "list", - "label": "@60614", - "default": 0, - "visible": true, - "enabled": "!eq(-3,@60615)", - "lvalues": [ - "@60616", - "@60617" - ] - }, - { - "id": "search_new_content", - "type": "list", - "label": "@60618", - "default": 0, - "enabled": "!eq(-4,@60615)", - "lvalues": [ - "@60619", - "@60620" - ] - }, { "id": "window_type", "type": "list", diff --git a/specials/videolibrary.py b/specials/videolibrary.py index dfb16983..2e56cf85 100644 --- a/specials/videolibrary.py +++ b/specials/videolibrary.py @@ -32,7 +32,7 @@ def mainlist(item): category=config.get_localized_string(70271), thumbnail=get_thumb("videolibrary_tvshow.png"))) itemlist.append(Item(channel='shortcuts', action="SettingOnPosition", - category=2, setting=0, title=typo(config.get_localized_string(70287),'bold color kod'), + category=2, setting=1, title=typo(config.get_localized_string(70287),'bold color kod'), thumbnail = get_thumb("setting_0.png"))) return itemlist @@ -306,6 +306,14 @@ def list_tvshows(item): {"title": config.get_localized_string(70269), "action": "update_tvshow", "channel": "videolibrary"}] + if item_tvshow.local_episodes_path == "": + item_tvshow.context.append({"title": config.get_localized_string(80048), + "action": "add_local_episodes", + "channel": "videolibrary"}) + else: + item_tvshow.context.append({"title": config.get_localized_string(80049), + "action": "remove_local_episodes", + "channel": "videolibrary"}) # ,{"title": "Cambiar contenido (PENDIENTE)", # "action": "", # "channel": "videolibrary"}] @@ -322,7 +330,7 @@ def list_tvshows(item): itemlist = sorted(itemlist, key=lambda it: it.title.lower()) itemlist.append(Item(channel=item.channel, action="update_videolibrary", thumbnail=item.thumbnail, - title=config.get_localized_string(60026), folder=False)) + title=typo(config.get_localized_string(70269), 'bold color kod'), folder=False)) return itemlist @@ -468,7 +476,7 @@ def findvideos(item): item_local = None # Desactiva autoplay - autoplay.set_status(False) + # autoplay.set_status(False) if not item.contentTitle or not item.strm_path: logger.debug("Unable to search for videos due to lack of parameters") @@ -587,7 +595,7 @@ def findvideos(item): list_servers = servertools.filter_servers(list_servers) elif item_json.action == 'play': from platformcode import platformtools - autoplay.set_status(True) + # autoplay.set_status(True) item_json.contentChannel = item_json.channel item_json.channel = "videolibrary" platformtools.play_video(item_json) @@ -629,7 +637,8 @@ def findvideos(item): itemlist.append(server) # return sorted(itemlist, key=lambda it: it.title.lower()) - autoplay.play_multi_channel(item, itemlist) + if autoplay.play_multi_channel(item, itemlist): # hideserver + return [] from inspect import stack from specials import nextep if nextep.check(item) and stack()[1][3] == 'run': @@ -678,7 +687,7 @@ def play(item): return itemlist -def update_videolibrary(item): +def update_videolibrary(item=''): logger.info() # Actualizar las series activas sobreescribiendo @@ -767,17 +776,15 @@ def delete_videolibrary(item): p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(20000), config.get_localized_string(80038)) p_dialog.update(0) - filetools.rmdirtree(videolibrarytools.MOVIES_PATH) - p_dialog.update(40) - filetools.rmdirtree(videolibrarytools.TVSHOWS_PATH) - p_dialog.update(80) if config.is_xbmc() and config.get_setting("videolibrary_kodi"): from platformcode import xbmc_videolibrary - strm_list = [] - strm_list.append(config.get_setting('videolibrarypath')) - xbmc_videolibrary.clean(strm_list) - + xbmc_videolibrary.clean() + p_dialog.update(10) + filetools.rmdirtree(videolibrarytools.MOVIES_PATH) + p_dialog.update(50) + filetools.rmdirtree(videolibrarytools.TVSHOWS_PATH) p_dialog.update(90) + config.verify_directories_created() p_dialog.update(100) xbmc.sleep(1000) @@ -795,12 +802,59 @@ def update_tvshow(item): p_dialog.update(0, heading, item.contentSerieName) import service - if service.update(item.path, p_dialog, 1, 1, item, False) and config.is_xbmc() and config.get_setting("videolibrary_kodi"): + if service.update(item.path, p_dialog, 0, 100, item, False) and config.is_xbmc() and config.get_setting("videolibrary_kodi"): from platformcode import xbmc_videolibrary xbmc_videolibrary.update(folder=filetools.basename(item.path)) p_dialog.close() + # check if the TV show is ended or has been canceled and ask the user to remove it from the video library update + nfo_path = filetools.join(item.path, "tvshow.nfo") + head_nfo, item_nfo = videolibrarytools.read_nfo(nfo_path) + if item.active and not item_nfo.active: + if not platformtools.dialog_yesno(config.get_localized_string(60037).replace('...',''), config.get_localized_string(70268) % item.contentSerieName): + item_nfo.active = 1 + filetools.write(nfo_path, head_nfo + item_nfo.tojson()) + + platformtools.itemlist_refresh() + + +def add_local_episodes(item): + logger.info() + + done, local_episodes_path = videolibrarytools.config_local_episodes_path(item.path, item.contentSerieName, silent=True) + if done < 0: + logger.info("An issue has occurred while configuring local episodes") + elif local_episodes_path: + nfo_path = filetools.join(item.path, "tvshow.nfo") + head_nfo, item_nfo = videolibrarytools.read_nfo(nfo_path) + item_nfo.local_episodes_path = local_episodes_path + if not item_nfo.active: + item_nfo.active = 1 + filetools.write(nfo_path, head_nfo + item_nfo.tojson()) + + update_tvshow(item) + + platformtools.itemlist_refresh() + + +def remove_local_episodes(item): + logger.info() + + nfo_path = filetools.join(item.path, "tvshow.nfo") + head_nfo, item_nfo = videolibrarytools.read_nfo(nfo_path) + + for season_episode in item_nfo.local_episodes_list: + filetools.remove(filetools.join(item.path, season_episode + '.strm')) + + item_nfo.local_episodes_list = [] + item_nfo.local_episodes_path = '' + filetools.write(nfo_path, head_nfo + item_nfo.tojson()) + + update_tvshow(item) + + platformtools.itemlist_refresh() + def verify_playcount_series(item, path): logger.info() @@ -1024,22 +1078,24 @@ def delete(item): for file in filetools.listdir(_item.path): if file.endswith(".strm") or file.endswith(".nfo") or file.endswith(".json")or file.endswith(".torrent"): filetools.remove(filetools.join(_item.path, file)) - raiz, carpeta_serie, ficheros = next(filetools.walk(_item.path)) - if ficheros == []: - filetools.rmdir(_item.path) + + if _item.contentType == 'movie': + heading = config.get_localized_string(70084) else: - if _item.contentType == 'movie': - heading = config.get_localized_string(70084) - else: - heading = config.get_localized_string(70085) - if platformtools.dialog_yesno(heading, config.get_localized_string(70081)): - filetools.rmdirtree(_item.path) + heading = config.get_localized_string(70085) if config.is_xbmc() and config.get_setting("videolibrary_kodi"): from platformcode import xbmc_videolibrary - strm_list = [] - strm_list.append(_item.extra) - xbmc_videolibrary.clean(strm_list) + if _item.local_episodes_path: + platformtools.dialog_ok(heading, config.get_localized_string(80047) % _item.infoLabels['title']) + path_list = [_item.extra] + xbmc_videolibrary.clean(path_list) + + raiz, carpeta_serie, ficheros = next(filetools.walk(_item.path)) + if ficheros == []: + filetools.rmdir(_item.path) + elif platformtools.dialog_yesno(heading, config.get_localized_string(70081) % os.path.basename(_item.path)): + filetools.rmdirtree(_item.path) logger.info("All links removed") xbmc.sleep(1000) @@ -1067,8 +1123,8 @@ def delete(item): if index == 0: # Seleccionado Eliminar pelicula/serie - canal = None delete_all(item) + return elif index > 0: # Seleccionado Eliminar canal X @@ -1079,41 +1135,43 @@ def delete(item): else: canal = item.dead - if canal: - num_enlaces = 0 - strm_list = [] - for fd in filetools.listdir(item.path): - if fd.endswith(canal + '].json') or scrapertools.find_single_match(fd, '%s]_\d+.torrent' % canal): - if filetools.remove(filetools.join(item.path, fd)): - num_enlaces += 1 - # Remove strm and nfo if no other channel - episode = fd.replace(' [' + canal + '].json', '') - found_ch = False - for ch in channels: - if filetools.exists(filetools.join(item.path, episode + ' [' + ch + '].json')): - found_ch = True - break - if found_ch == False: - filetools.remove(filetools.join(item.path, episode + '.nfo')) - filetools.remove(filetools.join(item.path, episode + '.strm')) - strm_list.append(filetools.join(item.extra, episode + '.strm')) + num_enlaces = 0 + path_list = [] + for fd in filetools.listdir(item.path): + if fd.endswith(canal + '].json') or scrapertools.find_single_match(fd, '%s]_\d+.torrent' % canal): + if filetools.remove(filetools.join(item.path, fd)): + num_enlaces += 1 + # Remove strm and nfo if no other channel + episode = fd.replace(' [' + canal + '].json', '') + found_ch = False + for ch in channels: + if filetools.exists(filetools.join(item.path, episode + ' [' + ch + '].json')): + found_ch = True + break + if found_ch == False: + filetools.remove(filetools.join(item.path, episode + '.nfo')) + strm_path = filetools.join(item.path, episode + '.strm') + # if it is a local episode, do not delete the strm + if 'plugin://plugin.video.kod/?' in filetools.read(strm_path): + filetools.remove(strm_path) + path_list.append(filetools.join(item.extra, episode + '.strm')) - if config.is_xbmc() and config.get_setting("videolibrary_kodi") and strm_list: - from platformcode import xbmc_videolibrary - xbmc_videolibrary.clean(strm_list) + if config.is_xbmc() and config.get_setting("videolibrary_kodi") and path_list: + from platformcode import xbmc_videolibrary + xbmc_videolibrary.clean(path_list) - if num_enlaces > 0: - # Actualizar .nfo - head_nfo, item_nfo = videolibrarytools.read_nfo(item.nfo) - del item_nfo.library_urls[canal] - if item_nfo.emergency_urls and item_nfo.emergency_urls.get(canal, False): - del item_nfo.emergency_urls[canal] - filetools.write(item.nfo, head_nfo + item_nfo.tojson()) + if num_enlaces > 0: + # Actualizar .nfo + head_nfo, item_nfo = videolibrarytools.read_nfo(item.nfo) + del item_nfo.library_urls[canal] + if item_nfo.emergency_urls and item_nfo.emergency_urls.get(canal, False): + del item_nfo.emergency_urls[canal] + filetools.write(item.nfo, head_nfo + item_nfo.tojson()) - msg_txt = config.get_localized_string(70087) % (num_enlaces, canal) - logger.info(msg_txt) - platformtools.dialog_notification(heading, msg_txt) - platformtools.itemlist_refresh() + msg_txt = config.get_localized_string(70087) % (num_enlaces, canal) + logger.info(msg_txt) + platformtools.dialog_notification(heading, msg_txt) + platformtools.itemlist_refresh() else: if platformtools.dialog_yesno(heading, config.get_localized_string(70088) % item.infoLabels['title']):