diff --git a/.github/workflows/run_pytest.yml b/.github/workflows/run_pytest.yml index e9d8d1c..e826202 100644 --- a/.github/workflows/run_pytest.yml +++ b/.github/workflows/run_pytest.yml @@ -16,24 +16,24 @@ jobs: build: runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.9", "3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v4 - - name: Set up Python 3.10 + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v3 with: - python-version: "3.10" + python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r flake8 pytest pytest-cov pdoc - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - - name: Lint with flake8 + pip install flake8 pytest pytest-cov pdoc + if [ -f test/requirements.txt ]; then pip install -r test/requirements.txt; fi + - name: Check Syntax with flake8 run: | - # stop the build if there are Python syntax errors or undefined names - flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + flake8 --extend-ignore=E501 pyxtream/pyxtream.py pyxtream/rest_api.py pyxtream/schemaValidator.py pyxtream/version.py pyxtream/progress.py - name: Test with pytest run: | - pytest --cov=pyxtream pyxtream + python3 -m pytest --cov=pyxtream test/test_pyxtream.py diff --git a/PYPI.md b/PYPI.md index 852001d..f23fc70 100644 --- a/PYPI.md +++ b/PYPI.md @@ -2,7 +2,7 @@ ```shell poetry lock -poetry install --sync +poetry sync poetry debug resolve ``` @@ -36,6 +36,8 @@ poetry publish -u __token__ -p # Upload to PYPI +References: https://www.digitalocean.com/community/tutorials/how-to-publish-python-packages-to-pypi-using-poetry-on-ubuntu-22-04 + ```shell poetry publish ``` diff --git a/README.md b/README.md index f437af4..42cee64 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ PyXtream loads the xtream IPTV content from a provider server. Groups, Channels, Series are all organized in dictionaries. Season and Episodes are retrieved as needed. It includes functions for searching streams and downloading. -This library was originally designed to work with Hypnotix at https://github.com/linuxmint/hypnotix +This library was originally designed to work with Hypnotix at https://github.com/linuxmint/hypnotix, so its compatibility with Hypnotix takes precedence. # Installing @@ -34,19 +34,17 @@ else: print("Could not connect") ``` -Once completed, all the data can be found in xTream.groups, xTream.channels, xTream.movies, xTream.series. Series do not contains the information for all the Seasons and Episodes. Those are loaded separately when needed by calling the following function using a Series object from xTream.series array of dictionaries. +Once completed, all the data can be found in `xTream.groups`, `xTream.channels`, `xTream.movies`, `xTream.series`. Series do not contains the information for all the Seasons and Episodes. Those are loaded separately when needed by calling the following function using a Series object from `xTream.series` array of dictionaries. ```python xt.get_series_info_by_id(series_obj) ``` -At this point, the series_obj will have both Seasons and Episodes populated. - -If you have installed Flask, the REST Api will be turned ON automatically. At this point, there is no method to turn it off. Maybe in a future version. +At this point, the `series_obj` will have both Seasons and Episodes populated. ## Functional Test -Please modify the functional_test.py file with your provider information, then start the application. +Please modify the `functional_test.py` file with your provider information, then start the application. ```shell python3 functional_test.py @@ -54,21 +52,15 @@ python3 functional_test.py The functional test will allow you to authenticate on startup, load and search streams. If Flask is installed, a simple website will be available at http://localhost:5000 to allow you to search and play streams. -## Interesting Work by somebody else - -- xtreamPOC - https://github.com/sght500/xtreamPOC - Project is a Proof of Concept (POC) that leverages pyxtream, MPV, and NiceGUI to demonstrate the use of Xtream Portal Codes. - -So far there is no ready to use Transport Stream library for playing live stream. +## Applications using PyXtream -- This is the library to convert TS to MP4 - - https://github.com/videojs/mux.js/ +Applications using PyXtream PYPI package -- More on above, but same problem. XMLHttpRequest waits until the whole TS file is completely loaded. It does not work for live video streams - - https://developpaper.com/play-ts-video-directly-on-the-web/ +- xtreamPOC - https://github.com/sght500/xtreamPOC - Project is a Proof of Concept (POC) that leverages pyxtream, MPV, and NiceGUI to demonstrate the use of Xtream Portal Codes. -- This below will allow me to process chunks of data - - https://stackoverflow.com/questions/37402716/handle-xmlhttprequest-response-with-large-data +Applications using PyXtream files +- Hypnotix - https://github.com/linuxmint/hypnotix - Hypnotix is an IPTV streaming application with support for live TV, movies and series. # API @@ -106,6 +98,7 @@ xTream.movies[{},{},...] - xTream.allEpg() # Versioning +Follows the Semantic Versioning from https://semver.org/ - Increment the MAJOR version when you make incompatible API changes. - Increment the MINOR version when you add functionality in a backwards-compatible manner. - Increment the PATCH version when you make backwards-compatible bug fixes. @@ -114,6 +107,7 @@ xTream.movies[{},{},...] | Date | Version | Description | | ----------- | -----| ----------- | +| 2025-02-17 | 0.7.3 | - Added Initial PyTest and Coverage
- Added timestamp field "added" to Series to match channels "added" field
- Added string field "url" to Series to quickly get the series download address
- Added new API "get_last_7days()" returns the last added streams in the last 7 days in JSON format
- Added new API "get_download_progress()" returns information on the current download stream in JSON format
- Changed internal function _load_series_info_by_id_from_provider to allow returned value to change to JSON
- Changed search_stream function to only search in specific collections
- Refactored "rest_api.py" to make it easier to extend in the future
- Added new rest API
- Changed to Poetry environment
- Changed Functional Test to test loading series information
- Changed sample index.html to test more features| | 2024-09-02 | 0.7.2 | - Added missing request package to setup.py
- Refactored the search stream function and now, it can search for a specific stream type
- Refactored the download stream function
- Refactored the _get_request function and removed the call to the sleep function
- Added functional test to get series json output from a series_id
- Added functional test to get EPG for a specific stream ID
- Added xtream account expiration date printed on the console during authentication
- Improved results with the Flask HTML page and differentiating between movies and series
- Improved code readability| | 2024-05-21 | 0.7.1 | - Fixed missing jsonschema package
- Fixed provider name in functional_test
- Improved print out of connection attempts
- Added method to read latest changes in functional_test | 2023-11-08 | 0.7.0 | - Added Schema Validator
- Added Channel Age
- Added list of movies added in the last 30 and 7 days
- Updated code based on PyLint
- Fixed Flask package to be optional [richard-de-vos](https://github.com/richard-de-vos)| @@ -126,3 +120,16 @@ xTream.movies[{},{},...] | 2021-06-05 | 0.1.2 | - Fixed Server Name | | 2021-06-04 | 0.1.1 | - Updated README.md | | 2021-06-04 | 0.1.0 | - Initial Release | + +## Interesting content that could be used for future development + +So far there is no ready to use Transport Stream library for playing live stream. + +- This is the library to convert TS to MP4 + - https://github.com/videojs/mux.js/ + +- More on above, but same problem. XMLHttpRequest waits until the whole TS file is completely loaded. It does not work for live video streams + - https://developpaper.com/play-ts-video-directly-on-the-web/ + +- This below will allow me to process chunks of data + - https://stackoverflow.com/questions/37402716/handle-xmlhttprequest-response-with-large-data diff --git a/docs/pyxtream.html b/docs/pyxtream.html index 6421399..b693496 100644 --- a/docs/pyxtream.html +++ b/docs/pyxtream.html @@ -50,15 +50,15 @@

-
1from .progress import progress
-2from .pyxtream import XTream
+                        
1from .progress import progress
+2from .pyxtream import XTream, Channel, Group, Serie, Episode
 3
 4try:
-5    from .rest_api import FlaskWrap
+5    from .rest_api import FlaskWrap
 6    USE_FLASK = True
 7except ImportError:
 8    USE_FLASK = False
-9from .version import __author__, __author_email__, __version__
+9from .version import __author__, __author_email__, __version__
 
diff --git a/docs/pyxtream/progress.html b/docs/pyxtream/progress.html index 8038999..d7e09e6 100644 --- a/docs/pyxtream/progress.html +++ b/docs/pyxtream/progress.html @@ -57,26 +57,26 @@

 1# The MIT License (MIT)
  2# Copyright (c) 2016 Vladimir Ignatev
  3#
- 4# Permission is hereby granted, free of charge, to any person obtaining 
- 5# a copy of this software and associated documentation files (the "Software"), 
- 6# to deal in the Software without restriction, including without limitation 
- 7# the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- 8# and/or sell copies of the Software, and to permit persons to whom the Software 
+ 4# Permission is hereby granted, free of charge, to any person obtaining
+ 5# a copy of this software and associated documentation files (the "Software"),
+ 6# to deal in the Software without restriction, including without limitation
+ 7# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ 8# and/or sell copies of the Software, and to permit persons to whom the Software
  9# is furnished to do so, subject to the following conditions:
-10# 
-11# The above copyright notice and this permission notice shall be included 
+10#
+11# The above copyright notice and this permission notice shall be included
 12# in all copies or substantial portions of the Software.
 13#
-14# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
-15# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
+14# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+15# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 16# PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
 17# FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
-18# OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
+18# OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
 19# OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-20import sys
+20import sys
 21
 22
-23def progress(count, total, status=''):
+23def progress(count, total, status=''):
 24    bar_len = 60
 25    filled_len = int(round(bar_len * count / float(total)))
 26
@@ -100,7 +100,7 @@ 

-
24def progress(count, total, status=''):
+            
24def progress(count, total, status=''):
 25    bar_len = 60
 26    filled_len = int(round(bar_len * count / float(total)))
 27
diff --git a/docs/pyxtream/pyxtream.html b/docs/pyxtream/pyxtream.html
index aa82502..62682de 100644
--- a/docs/pyxtream/pyxtream.html
+++ b/docs/pyxtream/pyxtream.html
@@ -210,6 +210,9 @@ 

API Documentation

  • episodes
  • +
  • + url +
  • export_json
  • @@ -252,6 +255,18 @@

    API Documentation

  • password
  • +
  • + base_url +
  • +
  • + base_url_ssl +
  • +
  • + cache_path +
  • +
  • + account_expiration +
  • live_type
  • @@ -307,10 +322,10 @@

    API Documentation

    threshold_time_sec
  • - cache_path + validate_json
  • - validate_json + download_progress
  • app_fullpath @@ -318,6 +333,12 @@

    API Documentation

  • html_template_folder
  • +
  • + get_download_progress +
  • +
  • + get_last_7days +
  • search_stream
  • @@ -416,7 +437,7 @@

    Module handles downloading xtream data.

    -

    Part of this content comes from

    +

    Part of this content comes from

    • https://github.com/chazlarson/py-xtream-codes/blob/master/xtream.py
    • @@ -443,7 +464,7 @@

      4 5Module handles downloading xtream data. 6 - 7Part of this content comes from + 7Part of this content comes from 8- https://github.com/chazlarson/py-xtream-codes/blob/master/xtream.py 9- https://github.com/linuxmint/hypnotix 10 @@ -454,1197 +475,1250 @@

      15> _Note_: It does not support M3U 16""" 17 - 18import json + 18import json 19# used for URL validation - 20import re - 21import time - 22from os import makedirs - 23from os import path as osp - 24from os import remove - 25# Timing xtream json downloads - 26from timeit import default_timer as timer - 27from typing import List, Tuple, Optional - 28from datetime import datetime, timedelta - 29import requests - 30 - 31from pyxtream.schemaValidator import SchemaType, schemaValidator - 32 - 33try: - 34 from pyxtream.rest_api import FlaskWrap - 35 USE_FLASK = True - 36except ImportError: - 37 USE_FLASK = False - 38 - 39from pyxtream.progress import progress - 40 + 20import re + 21import time + 22import sys + 23from os import makedirs + 24from os import path as osp + 25 + 26# Timing xtream json downloads + 27from timeit import default_timer as timer + 28from typing import Tuple, Optional + 29from datetime import datetime, timedelta + 30import requests + 31 + 32from pyxtream.schemaValidator import SchemaType, schemaValidator + 33 + 34try: + 35 from pyxtream.rest_api import FlaskWrap + 36 USE_FLASK = True + 37except ImportError: + 38 USE_FLASK = False + 39 + 40from pyxtream.progress import progress 41 - 42class Channel: - 43 # Required by Hypnotix - 44 info = "" - 45 id = "" - 46 name = "" # What is the difference between the below name and title? - 47 logo = "" - 48 logo_path = "" - 49 group_title = "" - 50 title = "" - 51 url = "" - 52 - 53 # XTream - 54 stream_type: str = "" - 55 group_id: str = "" - 56 is_adult: int = 0 - 57 added: int = 0 - 58 epg_channel_id: str = "" - 59 age_days_from_added: int = 0 - 60 date_now: datetime - 61 - 62 # This contains the raw JSON data - 63 raw = "" - 64 - 65 def __init__(self, xtream: object, group_title, stream_info): - 66 self.date_now = datetime.now() - 67 - 68 stream_type = stream_info["stream_type"] - 69 # Adjust the odd "created_live" type - 70 if stream_type in ("created_live", "radio_streams"): - 71 stream_type = "live" - 72 - 73 if stream_type not in ("live", "movie"): - 74 print(f"Error the channel has unknown stream type `{stream_type}`\n`{stream_info}`") - 75 else: - 76 # Raw JSON Channel - 77 self.raw = stream_info - 78 - 79 stream_name = stream_info["name"] - 80 - 81 # Required by Hypnotix - 82 self.id = stream_info["stream_id"] - 83 self.name = stream_name - 84 self.logo = stream_info["stream_icon"] - 85 self.logo_path = xtream._get_logo_local_path(self.logo) - 86 self.group_title = group_title - 87 self.title = stream_name - 88 - 89 # Check if category_id key is available - 90 if "category_id" in stream_info.keys(): - 91 self.group_id = int(stream_info["category_id"]) - 92 - 93 if stream_type == "live": - 94 stream_extension = "ts" + 42 + 43class Channel: + 44 # Required by Hypnotix + 45 info = "" + 46 id = "" + 47 name = "" # What is the difference between the below name and title? + 48 logo = "" + 49 logo_path = "" + 50 group_title = "" + 51 title = "" + 52 url = "" + 53 + 54 # XTream + 55 stream_type: str = "" + 56 group_id: str = "" + 57 is_adult: int = 0 + 58 added: int = 0 + 59 epg_channel_id: str = "" + 60 age_days_from_added: int = 0 + 61 date_now: datetime + 62 + 63 # This contains the raw JSON data + 64 raw = "" + 65 + 66 def __init__(self, xtream: object, group_title, stream_info): + 67 self.date_now = datetime.now() + 68 + 69 stream_type = stream_info["stream_type"] + 70 # Adjust the odd "created_live" type + 71 if stream_type in ("created_live", "radio_streams"): + 72 stream_type = "live" + 73 + 74 if stream_type not in ("live", "movie"): + 75 print(f"Error the channel has unknown stream type `{stream_type}`\n`{stream_info}`") + 76 else: + 77 # Raw JSON Channel + 78 self.raw = stream_info + 79 + 80 stream_name = stream_info["name"] + 81 + 82 # Required by Hypnotix + 83 self.id = stream_info["stream_id"] + 84 self.name = stream_name + 85 self.logo = stream_info["stream_icon"] + 86 self.logo_path = xtream._get_logo_local_path(self.logo) + 87 self.group_title = group_title + 88 self.title = stream_name + 89 + 90 # Check if category_id key is available + 91 if "category_id" in stream_info.keys(): + 92 self.group_id = int(stream_info["category_id"]) + 93 + 94 stream_extension = "" 95 - 96 # Check if epg_channel_id key is available - 97 if "epg_channel_id" in stream_info.keys(): - 98 self.epg_channel_id = stream_info["epg_channel_id"] - 99 - 100 elif stream_type == "movie": - 101 stream_extension = stream_info["container_extension"] + 96 if stream_type == "live": + 97 stream_extension = "ts" + 98 + 99 # Check if epg_channel_id key is available + 100 if "epg_channel_id" in stream_info.keys(): + 101 self.epg_channel_id = stream_info["epg_channel_id"] 102 - 103 # Default to 0 - 104 self.is_adult = 0 - 105 # Check if is_adult key is available - 106 if "is_adult" in stream_info.keys(): - 107 self.is_adult = int(stream_info["is_adult"]) - 108 - 109 self.added = int(stream_info["added"]) - 110 self.age_days_from_added = abs(datetime.utcfromtimestamp(self.added) - self.date_now).days + 103 elif stream_type == "movie": + 104 stream_extension = stream_info["container_extension"] + 105 + 106 # Default to 0 + 107 self.is_adult = 0 + 108 # Check if is_adult key is available + 109 if "is_adult" in stream_info.keys(): + 110 self.is_adult = int(stream_info["is_adult"]) 111 - 112 # Required by Hypnotix - 113 self.url = f"{xtream.server}/{stream_type}/{xtream.authorization['username']}/" \ - 114 f"{xtream.authorization['password']}/{stream_info['stream_id']}.{stream_extension}" - 115 - 116 # Check that the constructed URL is valid - 117 if not xtream._validate_url(self.url): - 118 print(f"{self.name} - Bad URL? `{self.url}`") - 119 - 120 def export_json(self): - 121 jsondata = {} - 122 - 123 jsondata["url"] = self.url - 124 jsondata.update(self.raw) - 125 jsondata["logo_path"] = self.logo_path - 126 - 127 return jsondata - 128 - 129 - 130class Group: - 131 # Required by Hypnotix - 132 name = "" - 133 group_type = "" + 112 self.added = int(stream_info["added"]) + 113 self.age_days_from_added = abs( + 114 datetime.utcfromtimestamp(self.added) - self.date_now + 115 ).days + 116 + 117 # Required by Hypnotix + 118 self.url = f"{xtream.server}/{stream_type}/{xtream.authorization['username']}/" \ + 119 f"{xtream.authorization['password']}/{stream_info['stream_id']}.{stream_extension}" + 120 + 121 # Check that the constructed URL is valid + 122 if not xtream._validate_url(self.url): + 123 print(f"{self.name} - Bad URL? `{self.url}`") + 124 + 125 def export_json(self): + 126 jsondata = {} + 127 + 128 jsondata["url"] = self.url + 129 jsondata.update(self.raw) + 130 jsondata["logo_path"] = self.logo_path + 131 + 132 return jsondata + 133 134 - 135 # XTream - 136 group_id = "" - 137 - 138 # This contains the raw JSON data - 139 raw = "" - 140 - 141 def convert_region_shortname_to_fullname(self, shortname): + 135class Group: + 136 # Required by Hypnotix + 137 name = "" + 138 group_type = "" + 139 + 140 # XTream + 141 group_id = "" 142 - 143 if shortname == "AR": - 144 return "Arab" - 145 if shortname == "AM": - 146 return "America" - 147 if shortname == "AS": - 148 return "Asia" - 149 if shortname == "AF": - 150 return "Africa" - 151 if shortname == "EU": - 152 return "Europe" - 153 - 154 return "" - 155 - 156 def __init__(self, group_info: dict, stream_type: str): - 157 # Raw JSON Group - 158 self.raw = group_info - 159 - 160 self.channels = [] - 161 self.series = [] - 162 - 163 TV_GROUP, MOVIES_GROUP, SERIES_GROUP = range(3) + 143 # This contains the raw JSON data + 144 raw = "" + 145 + 146 def convert_region_shortname_to_fullname(self, shortname): + 147 + 148 if shortname == "AR": + 149 return "Arab" + 150 if shortname == "AM": + 151 return "America" + 152 if shortname == "AS": + 153 return "Asia" + 154 if shortname == "AF": + 155 return "Africa" + 156 if shortname == "EU": + 157 return "Europe" + 158 + 159 return "" + 160 + 161 def __init__(self, group_info: dict, stream_type: str): + 162 # Raw JSON Group + 163 self.raw = group_info 164 - 165 if "VOD" == stream_type: - 166 self.group_type = MOVIES_GROUP - 167 elif "Series" == stream_type: - 168 self.group_type = SERIES_GROUP - 169 elif "Live" == stream_type: - 170 self.group_type = TV_GROUP - 171 else: - 172 print(f"Unrecognized stream type `{stream_type}` for `{group_info}`") - 173 - 174 self.name = group_info["category_name"] - 175 split_name = self.name.split('|') - 176 self.region_shortname = "" - 177 self.region_longname = "" - 178 if len(split_name) > 1: - 179 self.region_shortname = split_name[0].strip() - 180 self.region_longname = self.convert_region_shortname_to_fullname(self.region_shortname) - 181 - 182 # Check if category_id key is available - 183 if "category_id" in group_info.keys(): - 184 self.group_id = int(group_info["category_id"]) - 185 + 165 self.channels = [] + 166 self.series = [] + 167 + 168 TV_GROUP, MOVIES_GROUP, SERIES_GROUP = range(3) + 169 + 170 if "VOD" == stream_type: + 171 self.group_type = MOVIES_GROUP + 172 elif "Series" == stream_type: + 173 self.group_type = SERIES_GROUP + 174 elif "Live" == stream_type: + 175 self.group_type = TV_GROUP + 176 else: + 177 print(f"Unrecognized stream type `{stream_type}` for `{group_info}`") + 178 + 179 self.name = group_info["category_name"] + 180 split_name = self.name.split('|') + 181 self.region_shortname = "" + 182 self.region_longname = "" + 183 if len(split_name) > 1: + 184 self.region_shortname = split_name[0].strip() + 185 self.region_longname = self.convert_region_shortname_to_fullname(self.region_shortname) 186 - 187class Episode: - 188 # Required by Hypnotix - 189 title = "" - 190 name = "" - 191 info = "" - 192 - 193 # XTream - 194 - 195 # This contains the raw JSON data - 196 raw = "" + 187 # Check if category_id key is available + 188 if "category_id" in group_info.keys(): + 189 self.group_id = int(group_info["category_id"]) + 190 + 191 + 192class Episode: + 193 # Required by Hypnotix + 194 title = "" + 195 name = "" + 196 info = "" 197 - 198 def __init__(self, xtream: object, series_info, group_title, episode_info) -> None: - 199 # Raw JSON Episode - 200 self.raw = episode_info - 201 - 202 self.title = episode_info["title"] - 203 self.name = self.title - 204 self.group_title = group_title - 205 self.id = episode_info["id"] - 206 self.container_extension = episode_info["container_extension"] - 207 self.episode_number = episode_info["episode_num"] - 208 self.av_info = episode_info["info"] - 209 - 210 self.logo = series_info["cover"] - 211 self.logo_path = xtream._get_logo_local_path(self.logo) - 212 - 213 self.url = f"{xtream.server}/series/" \ - 214 f"{xtream.authorization['username']}/" \ - 215 f"{xtream.authorization['password']}/{self.id}.{self.container_extension}" - 216 - 217 # Check that the constructed URL is valid - 218 if not xtream._validate_url(self.url): - 219 print(f"{self.name} - Bad URL? `{self.url}`") - 220 + 198 # XTream + 199 + 200 # This contains the raw JSON data + 201 raw = "" + 202 + 203 def __init__(self, xtream: object, series_info, group_title, episode_info) -> None: + 204 # Raw JSON Episode + 205 self.raw = episode_info + 206 + 207 self.title = episode_info["title"] + 208 self.name = self.title + 209 self.group_title = group_title + 210 self.id = episode_info["id"] + 211 self.container_extension = episode_info["container_extension"] + 212 self.episode_number = episode_info["episode_num"] + 213 self.av_info = episode_info["info"] + 214 + 215 self.logo = series_info["cover"] + 216 self.logo_path = xtream._get_logo_local_path(self.logo) + 217 + 218 self.url = f"{xtream.server}/series/" \ + 219 f"{xtream.authorization['username']}/" \ + 220 f"{xtream.authorization['password']}/{self.id}.{self.container_extension}" 221 - 222class Serie: - 223 # Required by Hypnotix - 224 name = "" - 225 logo = "" - 226 logo_path = "" - 227 - 228 # XTream - 229 series_id = "" - 230 plot = "" - 231 youtube_trailer = "" - 232 genre = "" - 233 - 234 # This contains the raw JSON data - 235 raw = "" - 236 - 237 def __init__(self, xtream: object, series_info): - 238 # Raw JSON Series - 239 self.raw = series_info - 240 self.xtream = xtream + 222 # Check that the constructed URL is valid + 223 if not xtream._validate_url(self.url): + 224 print(f"{self.name} - Bad URL? `{self.url}`") + 225 + 226 + 227class Serie: + 228 # Required by Hypnotix + 229 name = "" + 230 logo = "" + 231 logo_path = "" + 232 + 233 # XTream + 234 series_id = "" + 235 plot = "" + 236 youtube_trailer = "" + 237 genre = "" + 238 + 239 # This contains the raw JSON data + 240 raw = "" 241 - 242 # Required by Hypnotix - 243 self.name = series_info["name"] - 244 self.logo = series_info["cover"] - 245 self.logo_path = xtream._get_logo_local_path(self.logo) - 246 - 247 self.seasons = {} - 248 self.episodes = {} + 242 def __init__(self, xtream: object, series_info): + 243 + 244 series_info["added"] = series_info["last_modified"] + 245 + 246 # Raw JSON Series + 247 self.raw = series_info + 248 self.xtream = xtream 249 - 250 # Check if category_id key is available - 251 if "series_id" in series_info.keys(): - 252 self.series_id = int(series_info["series_id"]) - 253 - 254 # Check if plot key is available - 255 if "plot" in series_info.keys(): - 256 self.plot = series_info["plot"] + 250 # Required by Hypnotix + 251 self.name = series_info["name"] + 252 self.logo = series_info["cover"] + 253 self.logo_path = xtream._get_logo_local_path(self.logo) + 254 + 255 self.seasons = {} + 256 self.episodes = {} 257 - 258 # Check if youtube_trailer key is available - 259 if "youtube_trailer" in series_info.keys(): - 260 self.youtube_trailer = series_info["youtube_trailer"] + 258 # Check if category_id key is available + 259 if "series_id" in series_info.keys(): + 260 self.series_id = int(series_info["series_id"]) 261 - 262 # Check if genre key is available - 263 if "genre" in series_info.keys(): - 264 self.genre = series_info["genre"] + 262 # Check if plot key is available + 263 if "plot" in series_info.keys(): + 264 self.plot = series_info["plot"] 265 - 266 def export_json(self): - 267 jsondata = {} - 268 - 269 jsondata.update(self.raw) - 270 jsondata['logo_path'] = self.logo_path - 271 - 272 return jsondata + 266 # Check if youtube_trailer key is available + 267 if "youtube_trailer" in series_info.keys(): + 268 self.youtube_trailer = series_info["youtube_trailer"] + 269 + 270 # Check if genre key is available + 271 if "genre" in series_info.keys(): + 272 self.genre = series_info["genre"] 273 - 274class Season: - 275 # Required by Hypnotix - 276 name = "" + 274 self.url = f"{xtream.server}/series/" \ + 275 f"{xtream.authorization['username']}/" \ + 276 f"{xtream.authorization['password']}/{self.series_id}/" 277 - 278 def __init__(self, name): - 279 self.name = name - 280 self.episodes = {} - 281 - 282class XTream: + 278 def export_json(self): + 279 jsondata = {} + 280 + 281 jsondata.update(self.raw) + 282 jsondata['logo_path'] = self.logo_path 283 - 284 name = "" - 285 server = "" - 286 secure_server = "" - 287 username = "" - 288 password = "" - 289 - 290 live_type = "Live" - 291 vod_type = "VOD" - 292 series_type = "Series" - 293 - 294 auth_data = {} - 295 authorization = {} - 296 - 297 groups = [] - 298 channels = [] - 299 series = [] - 300 movies = [] - 301 movies_30days = [] - 302 movies_7days = [] - 303 - 304 connection_headers = {} + 284 return jsondata + 285 + 286 + 287class Season: + 288 # Required by Hypnotix + 289 name = "" + 290 + 291 def __init__(self, name): + 292 self.name = name + 293 self.episodes = {} + 294 + 295 + 296class XTream: + 297 + 298 name = "" + 299 server = "" + 300 secure_server = "" + 301 username = "" + 302 password = "" + 303 base_url = "" + 304 base_url_ssl = "" 305 - 306 state = {'authenticated': False, 'loaded': False} + 306 cache_path = "" 307 - 308 hide_adult_content = False + 308 account_expiration: timedelta 309 - 310 live_catch_all_group = Group( - 311 {"category_id": "9999", "category_name":"xEverythingElse", "parent_id":0}, live_type - 312 ) - 313 vod_catch_all_group = Group( - 314 {"category_id": "9999", "category_name":"xEverythingElse", "parent_id":0}, vod_type - 315 ) - 316 series_catch_all_group = Group( - 317 {"category_id": "9999", "category_name":"xEverythingElse", "parent_id":0}, series_type - 318 ) - 319 # If the cached JSON file is older than threshold_time_sec then load a new - 320 # JSON dictionary from the provider - 321 threshold_time_sec = -1 - 322 - 323 def __init__( - 324 self, - 325 provider_name: str, - 326 provider_username: str, - 327 provider_password: str, - 328 provider_url: str, - 329 headers: dict = None, - 330 hide_adult_content: bool = False, - 331 cache_path: str = "", - 332 reload_time_sec: int = 60*60*8, - 333 validate_json: bool = False, - 334 debug_flask: bool = True - 335 ): - 336 """Initialize Xtream Class - 337 - 338 Args: - 339 provider_name (str): Name of the IPTV provider - 340 provider_username (str): User name of the IPTV provider - 341 provider_password (str): Password of the IPTV provider - 342 provider_url (str): URL of the IPTV provider - 343 headers (dict): Requests Headers - 344 hide_adult_content(bool, optional): When `True` hide stream that are marked for adult - 345 cache_path (str, optional): Location where to save loaded files. - 346 Defaults to empty string. - 347 reload_time_sec (int, optional): Number of seconds before automatic reloading - 348 (-1 to turn it OFF) - 349 debug_flask (bool, optional): Enable the debug mode in Flask - 350 validate_json (bool, optional): Check Xtream API provided JSON for validity - 351 - 352 Returns: XTream Class Instance - 353 - 354 - Note 1: If it fails to authorize with provided username and password, - 355 auth_data will be an empty dictionary. - 356 - Note 2: The JSON validation option will take considerable amount of time and it should be - 357 used only as a debug tool. The Xtream API JSON from the provider passes through a - 358 schema that represent the best available understanding of how the Xtream API - 359 works. - 360 """ - 361 self.server = provider_url - 362 self.username = provider_username - 363 self.password = provider_password - 364 self.name = provider_name - 365 self.cache_path = cache_path - 366 self.hide_adult_content = hide_adult_content - 367 self.threshold_time_sec = reload_time_sec - 368 self.validate_json = validate_json - 369 - 370 # get the pyxtream local path - 371 self.app_fullpath = osp.dirname(osp.realpath(__file__)) - 372 - 373 # prepare location of local html template - 374 self.html_template_folder = osp.join(self.app_fullpath,"html") - 375 - 376 # if the cache_path is specified, test that it is a directory - 377 if self.cache_path != "": - 378 # If the cache_path is not a directory, clear it - 379 if not osp.isdir(self.cache_path): - 380 print(" - Cache Path is not a directory, using default '~/.xtream-cache/'") - 381 self.cache_path == "" - 382 - 383 # If the cache_path is still empty, use default - 384 if self.cache_path == "": - 385 self.cache_path = osp.expanduser("~/.xtream-cache/") - 386 if not osp.isdir(self.cache_path): - 387 makedirs(self.cache_path, exist_ok=True) - 388 print(f"pyxtream cache path located at {self.cache_path}") - 389 - 390 if headers is not None: - 391 self.connection_headers = headers - 392 else: - 393 self.connection_headers = {'User-Agent':"Wget/1.20.3 (linux-gnu)"} - 394 - 395 self.authenticate() + 310 live_type = "Live" + 311 vod_type = "VOD" + 312 series_type = "Series" + 313 + 314 auth_data = {} + 315 authorization = {'username': '', 'password': ''} + 316 + 317 groups = [] + 318 channels = [] + 319 series = [] + 320 movies = [] + 321 movies_30days = [] + 322 movies_7days = [] + 323 + 324 connection_headers = {} + 325 + 326 state = {'authenticated': False, 'loaded': False} + 327 + 328 hide_adult_content = False + 329 + 330 live_catch_all_group = Group( + 331 {"category_id": "9999", "category_name": "xEverythingElse", "parent_id": 0}, live_type + 332 ) + 333 vod_catch_all_group = Group( + 334 {"category_id": "9999", "category_name": "xEverythingElse", "parent_id": 0}, vod_type + 335 ) + 336 series_catch_all_group = Group( + 337 {"category_id": "9999", "category_name": "xEverythingElse", "parent_id": 0}, series_type + 338 ) + 339 # If the cached JSON file is older than threshold_time_sec then load a new + 340 # JSON dictionary from the provider + 341 threshold_time_sec = -1 + 342 + 343 validate_json: bool = True + 344 + 345 # Used by REST API to get download progress + 346 download_progress: dict = {'StreamId': 0, 'Total': 0, 'Progress': 0} + 347 + 348 def __init__( + 349 self, + 350 provider_name: str, + 351 provider_username: str, + 352 provider_password: str, + 353 provider_url: str, + 354 headers: dict = None, + 355 hide_adult_content: bool = False, + 356 cache_path: str = "", + 357 reload_time_sec: int = 60*60*8, + 358 validate_json: bool = False, + 359 enable_flask: bool = False, + 360 debug_flask: bool = True + 361 ): + 362 """Initialize Xtream Class + 363 + 364 Args: + 365 provider_name (str): Name of the IPTV provider + 366 provider_username (str): User name of the IPTV provider + 367 provider_password (str): Password of the IPTV provider + 368 provider_url (str): URL of the IPTV provider + 369 headers (dict): Requests Headers + 370 hide_adult_content(bool, optional): When `True` hide stream that are marked for adult + 371 cache_path (str, optional): Location where to save loaded files. + 372 Defaults to empty string. + 373 reload_time_sec (int, optional): Number of seconds before automatic reloading + 374 (-1 to turn it OFF) + 375 validate_json (bool, optional): Check Xtream API provided JSON for validity + 376 enable_flask (bool, optional): Enable Flask + 377 debug_flask (bool, optional): Enable the debug mode in Flask + 378 + 379 Returns: XTream Class Instance + 380 + 381 - Note 1: If it fails to authorize with provided username and password, + 382 auth_data will be an empty dictionary. + 383 - Note 2: The JSON validation option will take considerable amount of time and it should be + 384 used only as a debug tool. The Xtream API JSON from the provider passes through a + 385 schema that represent the best available understanding of how the Xtream API + 386 works. + 387 """ + 388 self.server = provider_url + 389 self.username = provider_username + 390 self.password = provider_password + 391 self.name = provider_name + 392 self.cache_path = cache_path + 393 self.hide_adult_content = hide_adult_content + 394 self.threshold_time_sec = reload_time_sec + 395 self.validate_json = validate_json 396 - 397 if self.threshold_time_sec > 0: - 398 print(f"Reload timer is ON and set to {self.threshold_time_sec} seconds") - 399 else: - 400 print("Reload timer is OFF") - 401 - 402 if self.state['authenticated']: - 403 if USE_FLASK: - 404 self.flaskapp = FlaskWrap('pyxtream', self, self.html_template_folder, debug=debug_flask) - 405 self.flaskapp.start() - 406 - 407 def search_stream(self, keyword: str, - 408 ignore_case: bool = True, - 409 return_type: str = "LIST", - 410 stream_type: list = ("series", "movies", "channels")) -> list: - 411 """Search for streams - 412 - 413 Args: - 414 keyword (str): Keyword to search for. Supports REGEX - 415 ignore_case (bool, optional): True to ignore case during search. Defaults to "True". - 416 return_type (str, optional): Output format, 'LIST' or 'JSON'. Defaults to "LIST". - 417 stream_type (list, optional): Search within specific stream type. - 418 - 419 Returns: - 420 list: List with all the results, it could be empty. - 421 """ - 422 - 423 search_result = [] - 424 regex_flags = re.IGNORECASE if ignore_case else 0 - 425 regex = re.compile(keyword, regex_flags) - 426 # if ignore_case: - 427 # regex = re.compile(keyword, re.IGNORECASE) - 428 # else: - 429 # regex = re.compile(keyword) - 430 - 431 # if "movies" in stream_type: - 432 # print(f"Checking {len(self.movies)} movies") - 433 # for stream in self.movies: - 434 # if re.match(regex, stream.name) is not None: - 435 # search_result.append(stream.export_json()) - 436 - 437 # if "channels" in stream_type: - 438 # print(f"Checking {len(self.channels)} channels") - 439 # for stream in self.channels: - 440 # if re.match(regex, stream.name) is not None: - 441 # search_result.append(stream.export_json()) + 397 # get the pyxtream local path + 398 self.app_fullpath = osp.dirname(osp.realpath(__file__)) + 399 + 400 # prepare location of local html template + 401 self.html_template_folder = osp.join(self.app_fullpath, "html") + 402 + 403 # if the cache_path is specified, test that it is a directory + 404 if self.cache_path != "": + 405 # If the cache_path is not a directory, clear it + 406 if not osp.isdir(self.cache_path): + 407 print(" - Cache Path is not a directory, using default '~/.xtream-cache/'") + 408 self.cache_path = "" + 409 + 410 # If the cache_path is still empty, use default + 411 if self.cache_path == "": + 412 self.cache_path = osp.expanduser("~/.xtream-cache/") + 413 if not osp.isdir(self.cache_path): + 414 makedirs(self.cache_path, exist_ok=True) + 415 print(f"pyxtream cache path located at {self.cache_path}") + 416 + 417 if headers is not None: + 418 self.connection_headers = headers + 419 else: + 420 self.connection_headers = {'User-Agent': "Wget/1.20.3 (linux-gnu)"} + 421 + 422 self.authenticate() + 423 + 424 if self.threshold_time_sec > 0: + 425 print(f"Reload timer is ON and set to {self.threshold_time_sec} seconds") + 426 else: + 427 print("Reload timer is OFF") + 428 + 429 if self.state['authenticated']: + 430 if USE_FLASK and enable_flask: + 431 print("Starting Web Interface") + 432 self.flaskapp = FlaskWrap( + 433 'pyxtream', self, self.html_template_folder, debug=debug_flask + 434 ) + 435 self.flaskapp.start() + 436 else: + 437 print("Web interface not running") + 438 + 439 def get_download_progress(self, stream_id: int = None): + 440 # TODO: Add check for stream specific ID + 441 return json.dumps(self.download_progress) 442 - 443 # if "series" in stream_type: - 444 # print(f"Checking {len(self.series)} series") - 445 # for stream in self.series: - 446 # if re.match(regex, stream.name) is not None: - 447 # search_result.append(stream.export_json()) - 448 - 449 stream_collections = { - 450 "movies": self.movies, - 451 "channels": self.channels, - 452 "series": self.series - 453 } - 454 - 455 for stream_type_name in stream_type: - 456 if stream_type_name in stream_collections: - 457 collection = stream_collections[stream_type_name] - 458 print(f"Checking {len(collection)} {stream_type_name}") - 459 for stream in collection: - 460 if re.match(regex, stream.name) is not None: - 461 search_result.append(stream.export_json()) - 462 else: - 463 print(f"`{stream_type_name}` not found in collection") - 464 - 465 if return_type == "JSON": - 466 # if search_result is not None: - 467 print(f"Found {len(search_result)} results `{keyword}`") - 468 return json.dumps(search_result, ensure_ascii=False) - 469 - 470 return search_result - 471 - 472 def download_video(self, stream_id: int) -> str: - 473 """Download Video from Stream ID - 474 - 475 Args: - 476 stream_id (int): Stirng identifing the stream ID - 477 - 478 Returns: - 479 str: Absolute Path Filename where the file was saved. Empty if could not download - 480 """ - 481 url = "" - 482 filename = "" - 483 for stream in self.movies: - 484 if stream.id == stream_id: - 485 url = stream.url - 486 fn = f"{self._slugify(stream.name)}.{stream.raw['container_extension']}" - 487 filename = osp.join(self.cache_path,fn) + 443 def get_last_7days(self): + 444 return json.dumps(self.movies_7days, default=lambda x: x.export_json()) + 445 + 446 def search_stream(self, keyword: str, + 447 ignore_case: bool = True, + 448 return_type: str = "LIST", + 449 stream_type: list = ("series", "movies", "channels"), + 450 added_after: datetime = None) -> list: + 451 """Search for streams + 452 + 453 Args: + 454 keyword (str): Keyword to search for. Supports REGEX + 455 ignore_case (bool, optional): True to ignore case during search. Defaults to "True". + 456 return_type (str, optional): Output format, 'LIST' or 'JSON'. Defaults to "LIST". + 457 stream_type (list, optional): Search within specific stream type. + 458 added_after (datetime, optional): Search for items that have been added after a certain date. + 459 + 460 Returns: + 461 list: List with all the results, it could be empty. + 462 """ + 463 + 464 search_result = [] + 465 regex_flags = re.IGNORECASE if ignore_case else 0 + 466 regex = re.compile(keyword, regex_flags) + 467 + 468 stream_collections = { + 469 "movies": self.movies, + 470 "channels": self.channels, + 471 "series": self.series + 472 } + 473 + 474 for stream_type_name in stream_type: + 475 if stream_type_name in stream_collections: + 476 collection = stream_collections[stream_type_name] + 477 print(f"Checking {len(collection)} {stream_type_name}") + 478 for stream in collection: + 479 if stream.name and re.match(regex, stream.name) is not None: + 480 if added_after is None: + 481 # Add all matches + 482 search_result.append(stream.export_json()) + 483 else: + 484 # Only add if it is more recent + 485 pass + 486 else: + 487 print(f"`{stream_type_name}` not found in collection") 488 - 489 # If the url was correctly built and file does not exists, start downloading - 490 if url != "": - 491 #if not osp.isfile(filename): - 492 if not self._download_video_impl(url,filename): - 493 return "Error" - 494 - 495 return filename - 496 - 497 def _download_video_impl(self, url: str, fullpath_filename: str) -> bool: - 498 """Download a stream - 499 - 500 Args: - 501 url (str): Complete URL of the stream - 502 fullpath_filename (str): Complete File path where to save the stream - 503 - 504 Returns: - 505 bool: True if successful, False if error - 506 """ - 507 ret_code = False - 508 mb_size = 1024*1024 - 509 try: - 510 print(f"Downloading from URL `{url}` and saving at `{fullpath_filename}`") - 511 - 512 # Check if the file already exists - 513 if osp.exists(fullpath_filename): - 514 # If the file exists, resume the download from where it left off - 515 file_size = osp.getsize(fullpath_filename) - 516 self.connection_headers['Range'] = f'bytes={file_size}-' - 517 mode = 'ab' # Append to the existing file - 518 print(f"Resuming from {file_size:_} bytes") - 519 else: - 520 # If the file does not exist, start a new download - 521 mode = 'wb' # Write a new file - 522 - 523 # Make the request to download - 524 response = requests.get(url, timeout=(10), stream=True, allow_redirects=True, headers=self.connection_headers) - 525 # If there is an answer from the remote server - 526 if response.status_code == 200 or response.status_code == 206: - 527 # Get content type Binary or Text - 528 content_type = response.headers.get('content-type',None) - 529 - 530 # Get total playlist byte size - 531 total_content_size = int(response.headers.get('content-length',None)) - 532 total_content_size_mb = total_content_size/mb_size - 533 - 534 # Set downloaded size - 535 downloaded_bytes = 0 - 536 - 537 # Set stream blocks - 538 block_bytes = int(4*mb_size) # 4 MB - 539 - 540 print(f"Ready to download {total_content_size_mb:.1f} MB file ({total_content_size})") - 541 if content_type.split('/')[0] != "text": - 542 with open(fullpath_filename, mode) as file: - 543 - 544 # Grab data by block_bytes - 545 for data in response.iter_content(block_bytes,decode_unicode=False): - 546 downloaded_bytes += block_bytes - 547 progress(downloaded_bytes,total_content_size,"Downloading") - 548 file.write(data) - 549 - 550 if downloaded_bytes == total_content_size: - 551 ret_code = True - 552 - 553 # Delete Range if it was added - 554 try: - 555 del self.connection_headers['Range'] - 556 except KeyError: - 557 pass - 558 else: - 559 print(f"URL has a file with unexpected content-type {content_type}") - 560 else: - 561 print(f"HTTP error {response.status_code} while retrieving from {url}") - 562 except Exception as e: - 563 print(e) - 564 - 565 return ret_code - 566 - 567 def _slugify(self, string: str) -> str: - 568 """Normalize string - 569 - 570 Normalizes string, converts to lowercase, removes non-alpha characters, - 571 and converts spaces to hyphens. + 489 if return_type == "JSON": + 490 # if search_result is not None: + 491 print(f"Found {len(search_result)} results `{keyword}`") + 492 return json.dumps(search_result, ensure_ascii=False) + 493 + 494 return search_result + 495 + 496 def download_video(self, stream_id: int) -> str: + 497 """Download Video from Stream ID + 498 + 499 Args: + 500 stream_id (int): String identifying the stream ID + 501 + 502 Returns: + 503 str: Absolute Path Filename where the file was saved. Empty if could not download + 504 """ + 505 url = "" + 506 filename = "" + 507 for series_stream in self.series: + 508 if series_stream.series_id == stream_id: + 509 episode_object: Episode = series_stream.episodes["1"] + 510 url = f"{series_stream.url}/{episode_object.id}."\ + 511 f"{episode_object.container_extension}" + 512 + 513 for stream in self.movies: + 514 if stream.id == stream_id: + 515 url = stream.url + 516 fn = f"{self._slugify(stream.name)}.{stream.raw['container_extension']}" + 517 filename = osp.join(self.cache_path, fn) + 518 + 519 # If the url was correctly built and file does not exists, start downloading + 520 if url != "": + 521 if not self._download_video_impl(url, filename): + 522 return "Error" + 523 + 524 return filename + 525 + 526 def _download_video_impl(self, url: str, fullpath_filename: str) -> bool: + 527 """Download a stream + 528 + 529 Args: + 530 url (str): Complete URL of the stream + 531 fullpath_filename (str): Complete File path where to save the stream + 532 + 533 Returns: + 534 bool: True if successful, False if error + 535 """ + 536 ret_code = False + 537 mb_size = 1024*1024 + 538 try: + 539 print(f"Downloading from URL `{url}` and saving at `{fullpath_filename}`") + 540 + 541 # Check if the file already exists + 542 if osp.exists(fullpath_filename): + 543 # If the file exists, resume the download from where it left off + 544 file_size = osp.getsize(fullpath_filename) + 545 self.connection_headers['Range'] = f'bytes={file_size}-' + 546 mode = 'ab' # Append to the existing file + 547 print(f"Resuming from {file_size:_} bytes") + 548 else: + 549 # If the file does not exist, start a new download + 550 mode = 'wb' # Write a new file + 551 + 552 # Make the request to download + 553 response = requests.get( + 554 url, timeout=(10), + 555 stream=True, + 556 allow_redirects=True, + 557 headers=self.connection_headers + 558 ) + 559 # If there is an answer from the remote server + 560 if response.status_code in (200, 206): + 561 # Get content type Binary or Text + 562 content_type = response.headers.get('content-type', None) + 563 + 564 # Get total playlist byte size + 565 total_content_size = int(response.headers.get('content-length', None)) + 566 total_content_size_mb = total_content_size/mb_size + 567 + 568 # Set downloaded size + 569 downloaded_bytes = 0 + 570 self.download_progress['Total'] = total_content_size + 571 self.download_progress['Progress'] = 0 572 - 573 Args: - 574 string (str): String to be normalized + 573 # Set stream blocks + 574 block_bytes = int(4*mb_size) # 4 MB 575 - 576 Returns: - 577 str: Normalized String - 578 """ - 579 return "".join(x.lower() for x in string if x.isprintable()) - 580 - 581 def _validate_url(self, url: str) -> bool: - 582 regex = re.compile( - 583 r"^(?:http|ftp)s?://" # http:// or https:// - 584 r"(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|" # domain... - 585 r"localhost|" # localhost... - 586 r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" # ...or ip - 587 r"(?::\d+)?" # optional port - 588 r"(?:/?|[/?]\S+)$", - 589 re.IGNORECASE, - 590 ) - 591 - 592 return re.match(regex, url) is not None - 593 - 594 def _get_logo_local_path(self, logo_url: str) -> str: - 595 """Convert the Logo URL to a local Logo Path - 596 - 597 Args: - 598 logoURL (str): The Logo URL - 599 - 600 Returns: - 601 [type]: The logo path as a string or None - 602 """ - 603 local_logo_path = None - 604 if logo_url is not None: - 605 if not self._validate_url(logo_url): - 606 logo_url = None - 607 else: - 608 local_logo_path = osp.join( - 609 self.cache_path, - 610 f"{self._slugify(self.name)}-{self._slugify(osp.split(logo_url)[-1])}" - 611 ) - 612 return local_logo_path + 576 print( + 577 f"Ready to download {total_content_size_mb:.1f} MB file ({total_content_size})" + 578 ) + 579 if content_type.split('/')[0] != "text": + 580 with open(fullpath_filename, mode) as file: + 581 + 582 # Grab data by block_bytes + 583 for data in response.iter_content(block_bytes, decode_unicode=False): + 584 downloaded_bytes += block_bytes + 585 progress(downloaded_bytes, total_content_size, "Downloading") + 586 self.download_progress['Progress'] = downloaded_bytes + 587 file.write(data) + 588 + 589 ret_code = True + 590 + 591 # Delete Range if it was added + 592 try: + 593 del self.connection_headers['Range'] + 594 except KeyError: + 595 pass + 596 else: + 597 print(f"URL has a file with unexpected content-type {content_type}") + 598 else: + 599 print(f"HTTP error {response.status_code} while retrieving from {url}") + 600 except requests.exceptions.ReadTimeout: + 601 print("Read Timeout, try again") + 602 except Exception as e: + 603 print("Unknown error") + 604 print(e) + 605 + 606 return ret_code + 607 + 608 def _slugify(self, string: str) -> str: + 609 """Normalize string + 610 + 611 Normalizes string, converts to lowercase, removes non-alpha characters, + 612 and converts spaces to hyphens. 613 - 614 def authenticate(self): - 615 """Login to provider""" - 616 # If we have not yet successfully authenticated, attempt authentication - 617 if self.state["authenticated"] is False: - 618 # Erase any previous data - 619 self.auth_data = {} - 620 # Loop through 30 seconds - 621 i = 0 - 622 r = None - 623 # Prepare the authentication url - 624 url = f"{self.server}/player_api.php?username={self.username}&password={self.password}" - 625 print("Attempting connection... ", end='') - 626 while i < 30: - 627 try: - 628 # Request authentication, wait 4 seconds maximum - 629 r = requests.get(url, timeout=(4), headers=self.connection_headers) - 630 i = 31 - 631 except requests.exceptions.ConnectionError: - 632 time.sleep(1) - 633 print(f"{i} ", end='',flush=True) - 634 i += 1 - 635 - 636 if r is not None: - 637 # If the answer is ok, process data and change state - 638 if r.ok: - 639 print("Connected") - 640 self.auth_data = r.json() - 641 self.authorization = { - 642 "username": self.auth_data["user_info"]["username"], - 643 "password": self.auth_data["user_info"]["password"] - 644 } - 645 # Account expiration date - 646 self.account_expiration = timedelta( - 647 seconds=( - 648 int(self.auth_data["user_info"]["exp_date"])-datetime.now().timestamp() - 649 ) - 650 ) - 651 # Mark connection authorized - 652 self.state["authenticated"] = True - 653 # Construct the base url for all requests - 654 self.base_url = f"{self.server}/player_api.php?username={self.username}&password={self.password}" - 655 # If there is a secure server connection, construct the base url SSL for all requests - 656 if "https_port" in self.auth_data["server_info"]: - 657 self.base_url_ssl = f"https://{self.auth_data['server_info']['url']}:{self.auth_data['server_info']['https_port']}" \ - 658 f"/player_api.php?username={self.username}&password={self.password}" - 659 print(f"Account expires in {str(self.account_expiration)}") - 660 else: - 661 print(f"Provider `{self.name}` could not be loaded. Reason: `{r.status_code} {r.reason}`") - 662 else: - 663 print(f"\n{self.name}: Provider refused the connection") - 664 - 665 def _load_from_file(self, filename) -> dict: - 666 """Try to load the dictionary from file - 667 - 668 Args: - 669 filename ([type]): File name containing the data - 670 - 671 Returns: - 672 dict: Dictionary if found and no errors, None if file does not exists - 673 """ - 674 # Build the full path - 675 full_filename = osp.join(self.cache_path, f"{self._slugify(self.name)}-{filename}") + 614 Args: + 615 string (str): String to be normalized + 616 + 617 Returns: + 618 str: Normalized String + 619 """ + 620 return "".join(x.lower() for x in string if x.isprintable()) + 621 + 622 def _validate_url(self, url: str) -> bool: + 623 regex = re.compile( + 624 r"^(?:http|ftp)s?://" # http:// or https:// + 625 r"(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|" # domain... + 626 r"localhost|" # localhost... + 627 r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" # ...or ip + 628 r"(?::\d+)?" # optional port + 629 r"(?:/?|[/?]\S+)$", + 630 re.IGNORECASE, + 631 ) + 632 + 633 return re.match(regex, url) is not None + 634 + 635 def _get_logo_local_path(self, logo_url: str) -> str: + 636 """Convert the Logo URL to a local Logo Path + 637 + 638 Args: + 639 logoURL (str): The Logo URL + 640 + 641 Returns: + 642 [type]: The logo path as a string or None + 643 """ + 644 local_logo_path = None + 645 if logo_url is not None: + 646 if not self._validate_url(logo_url): + 647 logo_url = None + 648 else: + 649 local_logo_path = osp.join( + 650 self.cache_path, + 651 f"{self._slugify(self.name)}-{self._slugify(osp.split(logo_url)[-1])}" + 652 ) + 653 return local_logo_path + 654 + 655 def authenticate(self): + 656 """Login to provider""" + 657 # If we have not yet successfully authenticated, attempt authentication + 658 if self.state["authenticated"] is False: + 659 # Erase any previous data + 660 self.auth_data = {} + 661 # Loop through 30 seconds + 662 i = 0 + 663 r = None + 664 # Prepare the authentication url + 665 url = f"{self.server}/player_api.php?username={self.username}&password={self.password}" + 666 print("Attempting connection... ", end='') + 667 while i < 30: + 668 try: + 669 # Request authentication, wait 4 seconds maximum + 670 r = requests.get(url, timeout=(4), headers=self.connection_headers) + 671 i = 31 + 672 except (requests.exceptions.ConnectionError, requests.exceptions.ReadTimeout): + 673 time.sleep(1) + 674 print(f"{i} ", end='', flush=True) + 675 i += 1 676 - 677 # If the cached file exists, attempt to load it - 678 if osp.isfile(full_filename): - 679 - 680 my_data = None - 681 - 682 # Get the enlapsed seconds since last file update - 683 file_age_sec = time.time() - osp.getmtime(full_filename) - 684 # If the file was updated less than the threshold time, - 685 # it means that the file is still fresh, we can load it. - 686 # Otherwise skip and return None to force a re-download - 687 if self.threshold_time_sec > file_age_sec: - 688 # Load the JSON data - 689 try: - 690 with open(full_filename, mode="r", encoding="utf-8") as myfile: - 691 my_data = json.load(myfile) - 692 if len(my_data) == 0: - 693 my_data = None - 694 except Exception as e: - 695 print(f" - Could not load from file `{full_filename}`: e=`{e}`") - 696 return my_data - 697 - 698 return None - 699 - 700 def _save_to_file(self, data_list: dict, filename: str) -> bool: - 701 """Save a dictionary to file - 702 - 703 This function will overwrite the file if already exists - 704 - 705 Args: - 706 data_list (dict): Dictionary to save - 707 filename (str): Name of the file + 677 if r is not None: + 678 # If the answer is ok, process data and change state + 679 if r.ok: + 680 print("Connected") + 681 self.auth_data = r.json() + 682 self.authorization = { + 683 "username": self.auth_data["user_info"]["username"], + 684 "password": self.auth_data["user_info"]["password"] + 685 } + 686 # Account expiration date + 687 self.account_expiration = timedelta( + 688 seconds=( + 689 int(self.auth_data["user_info"]["exp_date"])-datetime.now().timestamp() + 690 ) + 691 ) + 692 # Mark connection authorized + 693 self.state["authenticated"] = True + 694 # Construct the base url for all requests + 695 self.base_url = f"{self.server}/player_api.php?username={self.username}&password={self.password}" + 696 # If there is a secure server connection, construct the base url SSL for all requests + 697 if "https_port" in self.auth_data["server_info"]: + 698 self.base_url_ssl = f"https://{self.auth_data['server_info']['url']}:{self.auth_data['server_info']['https_port']}" \ + 699 f"/player_api.php?username={self.username}&password={self.password}" + 700 print(f"Account expires in {str(self.account_expiration)}") + 701 else: + 702 print(f"Provider `{self.name}` could not be loaded. Reason: `{r.status_code} {r.reason}`") + 703 else: + 704 print(f"\n{self.name}: Provider refused the connection") + 705 + 706 def _load_from_file(self, filename) -> dict: + 707 """Try to load the dictionary from file 708 - 709 Returns: - 710 bool: True if successfull, False if error - 711 """ - 712 if data_list is None: - 713 return False - 714 - 715 full_filename = osp.join(self.cache_path, f"{self._slugify(self.name)}-{filename}") - 716 try: - 717 with open(full_filename, mode="wt", encoding="utf-8") as file: - 718 json.dump(data_list, file, ensure_ascii=False) - 719 return True - 720 except Exception as e: - 721 print(f" - Could not save to file `{full_filename}`: e=`{e}`") - 722 return False - 723 # if data_list is not None: - 724 - 725 # #Build the full path - 726 # full_filename = osp.join(self.cache_path, f"{self._slugify(self.name)}-{filename}") - 727 # # If the path makes sense, save the file - 728 # json_data = json.dumps(data_list, ensure_ascii=False) - 729 # try: - 730 # with open(full_filename, mode="wt", encoding="utf-8") as myfile: - 731 # myfile.write(json_data) - 732 # except Exception as e: - 733 # print(f" - Could not save to file `{full_filename}`: e=`{e}`") - 734 # return False - 735 - 736 # return True - 737 # else: - 738 # return False - 739 - 740 def load_iptv(self) -> bool: - 741 """Load XTream IPTV - 742 - 743 - Add all Live TV to XTream.channels - 744 - Add all VOD to XTream.movies - 745 - Add all Series to XTream.series - 746 Series contains Seasons and Episodes. Those are not automatically - 747 retrieved from the server to reduce the loading time. - 748 - Add all groups to XTream.groups - 749 Groups are for all three channel types, Live TV, VOD, and Series - 750 - 751 Returns: - 752 bool: True if successfull, False if error - 753 """ - 754 # If pyxtream has not authenticated the connection, return empty - 755 if self.state["authenticated"] is False: - 756 print("Warning, cannot load steams since authorization failed") - 757 return False - 758 - 759 # If pyxtream has already loaded the data, skip and return success - 760 if self.state["loaded"] is True: - 761 print("Warning, data has already been loaded.") - 762 return True - 763 - 764 for loading_stream_type in (self.live_type, self.vod_type, self.series_type): - 765 ## Get GROUPS - 766 - 767 # Try loading local file - 768 dt = 0 - 769 start = timer() - 770 all_cat = self._load_from_file(f"all_groups_{loading_stream_type}.json") - 771 # If file empty or does not exists, download it from remote - 772 if all_cat is None: - 773 # Load all Groups and save file locally - 774 all_cat = self._load_categories_from_provider(loading_stream_type) - 775 if all_cat is not None: - 776 self._save_to_file(all_cat,f"all_groups_{loading_stream_type}.json") - 777 dt = timer() - start - 778 - 779 # If we got the GROUPS data, show the statistics and load GROUPS - 780 if all_cat is not None: - 781 print(f"{self.name}: Loaded {len(all_cat)} {loading_stream_type} Groups in {dt:.3f} seconds") - 782 ## Add GROUPS to dictionaries + 709 Args: + 710 filename ([type]): File name containing the data + 711 + 712 Returns: + 713 dict: Dictionary if found and no errors, None if file does not exists + 714 """ + 715 # Build the full path + 716 full_filename = osp.join(self.cache_path, f"{self._slugify(self.name)}-{filename}") + 717 + 718 # If the cached file exists, attempt to load it + 719 if osp.isfile(full_filename): + 720 + 721 my_data = None + 722 + 723 # Get the elapsed seconds since last file update + 724 file_age_sec = time.time() - osp.getmtime(full_filename) + 725 # If the file was updated less than the threshold time, + 726 # it means that the file is still fresh, we can load it. + 727 # Otherwise skip and return None to force a re-download + 728 if self.threshold_time_sec > file_age_sec: + 729 # Load the JSON data + 730 try: + 731 with open(full_filename, mode="r", encoding="utf-8") as myfile: + 732 my_data = json.load(myfile) + 733 if len(my_data) == 0: + 734 my_data = None + 735 except Exception as e: + 736 print(f" - Could not load from file `{full_filename}`: e=`{e}`") + 737 return my_data + 738 + 739 return None + 740 + 741 def _save_to_file(self, data_list: dict, filename: str) -> bool: + 742 """Save a dictionary to file + 743 + 744 This function will overwrite the file if already exists + 745 + 746 Args: + 747 data_list (dict): Dictionary to save + 748 filename (str): Name of the file + 749 + 750 Returns: + 751 bool: True if successful, False if error + 752 """ + 753 if data_list is None: + 754 return False + 755 + 756 full_filename = osp.join(self.cache_path, f"{self._slugify(self.name)}-{filename}") + 757 try: + 758 with open(full_filename, mode="wt", encoding="utf-8") as file: + 759 json.dump(data_list, file, ensure_ascii=False) + 760 return True + 761 except Exception as e: + 762 print(f" - Could not save to file `{full_filename}`: e=`{e}`") + 763 return False + 764 + 765 def load_iptv(self) -> bool: + 766 """Load XTream IPTV + 767 + 768 - Add all Live TV to XTream.channels + 769 - Add all VOD to XTream.movies + 770 - Add all Series to XTream.series + 771 Series contains Seasons and Episodes. Those are not automatically + 772 retrieved from the server to reduce the loading time. + 773 - Add all groups to XTream.groups + 774 Groups are for all three channel types, Live TV, VOD, and Series + 775 + 776 Returns: + 777 bool: True if successful, False if error + 778 """ + 779 # If pyxtream has not authenticated the connection, return empty + 780 if self.state["authenticated"] is False: + 781 print("Warning, cannot load steams since authorization failed") + 782 return False 783 - 784 # Add the catch-all-errors group - 785 if loading_stream_type == self.live_type: - 786 self.groups.append(self.live_catch_all_group) - 787 elif loading_stream_type == self.vod_type: - 788 self.groups.append(self.vod_catch_all_group) - 789 elif loading_stream_type == self.series_type: - 790 self.groups.append(self.series_catch_all_group) - 791 - 792 for cat_obj in all_cat: - 793 if schemaValidator(cat_obj, SchemaType.GROUP): - 794 # Create Group (Category) - 795 new_group = Group(cat_obj, loading_stream_type) - 796 # Add to xtream class - 797 self.groups.append(new_group) - 798 else: - 799 # Save what did not pass schema validation - 800 print(cat_obj) - 801 - 802 # Sort Categories - 803 self.groups.sort(key=lambda x: x.name) - 804 else: - 805 print(f" - Could not load {loading_stream_type} Groups") - 806 break - 807 - 808 ## Get Streams - 809 - 810 # Try loading local file - 811 dt = 0 - 812 start = timer() - 813 all_streams = self._load_from_file(f"all_stream_{loading_stream_type}.json") - 814 # If file empty or does not exists, download it from remote - 815 if all_streams is None: - 816 # Load all Streams and save file locally - 817 all_streams = self._load_streams_from_provider(loading_stream_type) - 818 self._save_to_file(all_streams,f"all_stream_{loading_stream_type}.json") - 819 dt = timer() - start - 820 - 821 # If we got the STREAMS data, show the statistics and load Streams - 822 if all_streams is not None: - 823 print(f"{self.name}: Loaded {len(all_streams)} {loading_stream_type} Streams in {dt:.3f} seconds") - 824 ## Add Streams to dictionaries + 784 # If pyxtream has already loaded the data, skip and return success + 785 if self.state["loaded"] is True: + 786 print("Warning, data has already been loaded.") + 787 return True + 788 + 789 # Delete skipped channels from cache + 790 full_filename = osp.join(self.cache_path, "skipped_streams.json") + 791 try: + 792 f = open(full_filename, mode="r+", encoding="utf-8") + 793 f.truncate(0) + 794 f.close() + 795 except FileNotFoundError: + 796 pass + 797 + 798 for loading_stream_type in (self.live_type, self.vod_type, self.series_type): + 799 # Get GROUPS + 800 + 801 # Try loading local file + 802 dt = 0 + 803 start = timer() + 804 all_cat = self._load_from_file(f"all_groups_{loading_stream_type}.json") + 805 # If file empty or does not exists, download it from remote + 806 if all_cat is None: + 807 # Load all Groups and save file locally + 808 all_cat = self._load_categories_from_provider(loading_stream_type) + 809 if all_cat is not None: + 810 self._save_to_file(all_cat, f"all_groups_{loading_stream_type}.json") + 811 dt = timer() - start + 812 + 813 # If we got the GROUPS data, show the statistics and load GROUPS + 814 if all_cat is not None: + 815 print(f"{self.name}: Loaded {len(all_cat)} {loading_stream_type} Groups in {dt:.3f} seconds") + 816 # Add GROUPS to dictionaries + 817 + 818 # Add the catch-all-errors group + 819 if loading_stream_type == self.live_type: + 820 self.groups.append(self.live_catch_all_group) + 821 elif loading_stream_type == self.vod_type: + 822 self.groups.append(self.vod_catch_all_group) + 823 elif loading_stream_type == self.series_type: + 824 self.groups.append(self.series_catch_all_group) 825 - 826 skipped_adult_content = 0 - 827 skipped_no_name_content = 0 - 828 - 829 number_of_streams = len(all_streams) - 830 current_stream_number = 0 - 831 # Calculate 1% of total number of streams - 832 # This is used to slow down the progress bar - 833 one_percent_number_of_streams = number_of_streams/100 - 834 start = timer() - 835 for stream_channel in all_streams: - 836 skip_stream = False - 837 current_stream_number += 1 - 838 - 839 # Show download progress every 1% of total number of streams - 840 if current_stream_number < one_percent_number_of_streams: - 841 progress( - 842 current_stream_number, - 843 number_of_streams, - 844 f"Processing {loading_stream_type} Streams" - 845 ) - 846 one_percent_number_of_streams *= 2 - 847 - 848 # Validate JSON scheme - 849 if self.validate_json: - 850 if loading_stream_type == self.series_type: - 851 if not schemaValidator(stream_channel, SchemaType.SERIES_INFO): - 852 print(stream_channel) - 853 elif loading_stream_type == self.live_type: - 854 if not schemaValidator(stream_channel, SchemaType.LIVE): - 855 print(stream_channel) - 856 else: - 857 # vod_type - 858 if not schemaValidator(stream_channel, SchemaType.VOD): - 859 print(stream_channel) - 860 - 861 # Skip if the name of the stream is empty - 862 if stream_channel["name"] == "": - 863 skip_stream = True - 864 skipped_no_name_content = skipped_no_name_content + 1 - 865 self._save_to_file_skipped_streams(stream_channel) - 866 - 867 # Skip if the user chose to hide adult streams - 868 if self.hide_adult_content and loading_stream_type == self.live_type: - 869 if "is_adult" in stream_channel: - 870 if stream_channel["is_adult"] == "1": - 871 skip_stream = True - 872 skipped_adult_content = skipped_adult_content + 1 - 873 self._save_to_file_skipped_streams(stream_channel) - 874 - 875 if not skip_stream: - 876 # Some channels have no group, - 877 # so let's add them to the catch all group - 878 if stream_channel["category_id"] == "": - 879 stream_channel["category_id"] = "9999" - 880 elif stream_channel["category_id"] != "1": - 881 pass - 882 - 883 # Find the first occurence of the group that the - 884 # Channel or Stream is pointing to - 885 the_group = next( - 886 (x for x in self.groups if x.group_id == int(stream_channel["category_id"])), - 887 None - 888 ) - 889 - 890 # Set group title - 891 if the_group is not None: - 892 group_title = the_group.name - 893 else: - 894 if loading_stream_type == self.live_type: - 895 group_title = self.live_catch_all_group.name - 896 the_group = self.live_catch_all_group - 897 elif loading_stream_type == self.vod_type: - 898 group_title = self.vod_catch_all_group.name - 899 the_group = self.vod_catch_all_group - 900 elif loading_stream_type == self.series_type: - 901 group_title = self.series_catch_all_group.name - 902 the_group = self.series_catch_all_group - 903 - 904 - 905 if loading_stream_type == self.series_type: - 906 # Load all Series - 907 new_series = Serie(self, stream_channel) - 908 # To get all the Episodes for every Season of each - 909 # Series is very time consuming, we will only - 910 # populate the Series once the user click on the - 911 # Series, the Seasons and Episodes will be loaded - 912 # using x.getSeriesInfoByID() function - 913 - 914 else: - 915 new_channel = Channel( - 916 self, - 917 group_title, - 918 stream_channel - 919 ) - 920 - 921 if new_channel.group_id == "9999": - 922 print(f" - xEverythingElse Channel -> {new_channel.name} - {new_channel.stream_type}") + 826 for cat_obj in all_cat: + 827 if schemaValidator(cat_obj, SchemaType.GROUP): + 828 # Create Group (Category) + 829 new_group = Group(cat_obj, loading_stream_type) + 830 # Add to xtream class + 831 self.groups.append(new_group) + 832 else: + 833 # Save what did not pass schema validation + 834 print(cat_obj) + 835 + 836 # Sort Categories + 837 self.groups.sort(key=lambda x: x.name) + 838 else: + 839 print(f" - Could not load {loading_stream_type} Groups") + 840 break + 841 + 842 # Get Streams + 843 + 844 # Try loading local file + 845 dt = 0 + 846 start = timer() + 847 all_streams = self._load_from_file(f"all_stream_{loading_stream_type}.json") + 848 # If file empty or does not exists, download it from remote + 849 if all_streams is None: + 850 # Load all Streams and save file locally + 851 all_streams = self._load_streams_from_provider(loading_stream_type) + 852 self._save_to_file(all_streams, f"all_stream_{loading_stream_type}.json") + 853 dt = timer() - start + 854 + 855 # If we got the STREAMS data, show the statistics and load Streams + 856 if all_streams is not None: + 857 print(f"{self.name}: Loaded {len(all_streams)} {loading_stream_type} Streams in {dt:.3f} seconds") + 858 # Add Streams to dictionaries + 859 + 860 skipped_adult_content = 0 + 861 skipped_no_name_content = 0 + 862 + 863 number_of_streams = len(all_streams) + 864 current_stream_number = 0 + 865 # Calculate 1% of total number of streams + 866 # This is used to slow down the progress bar + 867 one_percent_number_of_streams = number_of_streams/100 + 868 start = timer() + 869 for stream_channel in all_streams: + 870 skip_stream = False + 871 current_stream_number += 1 + 872 + 873 # Show download progress every 1% of total number of streams + 874 if current_stream_number < one_percent_number_of_streams: + 875 progress( + 876 current_stream_number, + 877 number_of_streams, + 878 f"Processing {loading_stream_type} Streams" + 879 ) + 880 one_percent_number_of_streams *= 2 + 881 + 882 # Validate JSON scheme + 883 if self.validate_json: + 884 if loading_stream_type == self.series_type: + 885 if not schemaValidator(stream_channel, SchemaType.SERIES_INFO): + 886 print(stream_channel) + 887 elif loading_stream_type == self.live_type: + 888 if not schemaValidator(stream_channel, SchemaType.LIVE): + 889 print(stream_channel) + 890 else: + 891 # vod_type + 892 if not schemaValidator(stream_channel, SchemaType.VOD): + 893 print(stream_channel) + 894 + 895 # Skip if the name of the stream is empty + 896 if stream_channel["name"] == "": + 897 skip_stream = True + 898 skipped_no_name_content = skipped_no_name_content + 1 + 899 self._save_to_file_skipped_streams(stream_channel) + 900 + 901 # Skip if the user chose to hide adult streams + 902 if self.hide_adult_content and loading_stream_type == self.live_type: + 903 if "is_adult" in stream_channel: + 904 if stream_channel["is_adult"] == "1": + 905 skip_stream = True + 906 skipped_adult_content = skipped_adult_content + 1 + 907 self._save_to_file_skipped_streams(stream_channel) + 908 + 909 if not skip_stream: + 910 # Some channels have no group, + 911 # so let's add them to the catch all group + 912 if not stream_channel["category_id"]: + 913 stream_channel["category_id"] = "9999" + 914 elif stream_channel["category_id"] != "1": + 915 pass + 916 + 917 # Find the first occurrence of the group that the + 918 # Channel or Stream is pointing to + 919 the_group = next( + 920 (x for x in self.groups if x.group_id == int(stream_channel["category_id"])), + 921 None + 922 ) 923 - 924 # Save the new channel to the local list of channels - 925 if loading_stream_type == self.live_type: - 926 self.channels.append(new_channel) - 927 elif loading_stream_type == self.vod_type: - 928 self.movies.append(new_channel) - 929 if new_channel.age_days_from_added < 31: - 930 self.movies_30days.append(new_channel) - 931 if new_channel.age_days_from_added < 7: - 932 self.movies_7days.append(new_channel) - 933 else: - 934 self.series.append(new_series) - 935 - 936 # Add stream to the specific Group - 937 if the_group is not None: - 938 if loading_stream_type != self.series_type: - 939 the_group.channels.append(new_channel) - 940 else: - 941 the_group.series.append(new_series) - 942 else: - 943 print(f" - Group not found `{stream_channel['name']}`") - 944 print("\n") - 945 # Print information of which streams have been skipped - 946 if self.hide_adult_content: - 947 print(f" - Skipped {skipped_adult_content} adult {loading_stream_type} streams") - 948 if skipped_no_name_content > 0: - 949 print(f" - Skipped {skipped_no_name_content} " - 950 "unprintable {loading_stream_type} streams") - 951 else: - 952 print(f" - Could not load {loading_stream_type} Streams") + 924 # Set group title + 925 if the_group is not None: + 926 group_title = the_group.name + 927 else: + 928 if loading_stream_type == self.live_type: + 929 group_title = self.live_catch_all_group.name + 930 the_group = self.live_catch_all_group + 931 elif loading_stream_type == self.vod_type: + 932 group_title = self.vod_catch_all_group.name + 933 the_group = self.vod_catch_all_group + 934 elif loading_stream_type == self.series_type: + 935 group_title = self.series_catch_all_group.name + 936 the_group = self.series_catch_all_group + 937 + 938 if loading_stream_type == self.series_type: + 939 # Load all Series + 940 new_series = Serie(self, stream_channel) + 941 # To get all the Episodes for every Season of each + 942 # Series is very time consuming, we will only + 943 # populate the Series once the user click on the + 944 # Series, the Seasons and Episodes will be loaded + 945 # using x.getSeriesInfoByID() function + 946 + 947 else: + 948 new_channel = Channel( + 949 self, + 950 group_title, + 951 stream_channel + 952 ) 953 - 954 self.state["loaded"] = True - 955 - 956 def _save_to_file_skipped_streams(self, stream_channel: Channel): - 957 - 958 # Build the full path - 959 full_filename = osp.join(self.cache_path, "skipped_streams.json") - 960 - 961 # If the path makes sense, save the file - 962 json_data = json.dumps(stream_channel, ensure_ascii=False) - 963 try: - 964 with open(full_filename, mode="a", encoding="utf-8") as myfile: - 965 myfile.writelines(json_data) - 966 return True - 967 except Exception as e: - 968 print(f" - Could not save to skipped stream file `{full_filename}`: e=`{e}`") - 969 return False - 970 - 971 def get_series_info_by_id(self, get_series: dict): - 972 """Get Seasons and Episodes for a Series - 973 - 974 Args: - 975 get_series (dict): Series dictionary - 976 """ - 977 - 978 series_seasons = self._load_series_info_by_id_from_provider(get_series.series_id) - 979 - 980 if series_seasons["seasons"] is None: - 981 series_seasons["seasons"] = [{"name": "Season 1", "cover": series_seasons["info"]["cover"]}] - 982 - 983 for series_info in series_seasons["seasons"]: - 984 season_name = series_info["name"] - 985 season_key = series_info['season_number'] - 986 season = Season(season_name) - 987 get_series.seasons[season_name] = season - 988 if "episodes" in series_seasons.keys(): - 989 for series_season in series_seasons["episodes"].keys(): - 990 for episode_info in series_seasons["episodes"][str(series_season)]: - 991 new_episode_channel = Episode( - 992 self, series_info, "Testing", episode_info - 993 ) - 994 season.episodes[episode_info["title"]] = new_episode_channel - 995 - 996 def _handle_request_exception(self, exception: requests.exceptions.RequestException): - 997 """Handle different types of request exceptions.""" - 998 if isinstance(exception, requests.exceptions.ConnectionError): - 999 print(" - Connection Error: Possible network problem \ -1000 (e.g. DNS failure, refused connection, etc)") -1001 elif isinstance(exception, requests.exceptions.HTTPError): -1002 print(" - HTTP Error") -1003 elif isinstance(exception, requests.exceptions.TooManyRedirects): -1004 print(" - TooManyRedirects") -1005 elif isinstance(exception, requests.exceptions.ReadTimeout): -1006 print(" - Timeout while loading data") -1007 else: -1008 print(f" - An unexpected error occurred: {exception}") -1009 -1010 def _get_request(self, url: str, timeout: Tuple[int, int] = (2, 15)) -> Optional[dict]: -1011 """Generic GET Request with Error handling + 954 if new_channel.group_id == "9999": + 955 print(f" - xEverythingElse Channel -> {new_channel.name} - {new_channel.stream_type}") + 956 + 957 # Save the new channel to the local list of channels + 958 if loading_stream_type == self.live_type: + 959 self.channels.append(new_channel) + 960 elif loading_stream_type == self.vod_type: + 961 self.movies.append(new_channel) + 962 if new_channel.age_days_from_added < 31: + 963 self.movies_30days.append(new_channel) + 964 if new_channel.age_days_from_added < 7: + 965 self.movies_7days.append(new_channel) + 966 else: + 967 self.series.append(new_series) + 968 + 969 # Add stream to the specific Group + 970 if the_group is not None: + 971 if loading_stream_type != self.series_type: + 972 the_group.channels.append(new_channel) + 973 else: + 974 the_group.series.append(new_series) + 975 else: + 976 print(f" - Group not found `{stream_channel['name']}`") + 977 print("\n") + 978 # Print information of which streams have been skipped + 979 if self.hide_adult_content: + 980 print(f" - Skipped {skipped_adult_content} adult {loading_stream_type} streams") + 981 if skipped_no_name_content > 0: + 982 print(f" - Skipped {skipped_no_name_content} " + 983 "unprintable {loading_stream_type} streams") + 984 else: + 985 print(f" - Could not load {loading_stream_type} Streams") + 986 + 987 self.state["loaded"] = True + 988 return True + 989 + 990 def _save_to_file_skipped_streams(self, stream_channel: Channel): + 991 + 992 # Build the full path + 993 full_filename = osp.join(self.cache_path, "skipped_streams.json") + 994 + 995 # If the path makes sense, save the file + 996 json_data = json.dumps(stream_channel, ensure_ascii=False) + 997 try: + 998 with open(full_filename, mode="a", encoding="utf-8") as myfile: + 999 myfile.writelines(json_data) +1000 myfile.write('\n') +1001 return True +1002 except Exception as e: +1003 print(f" - Could not save to skipped stream file `{full_filename}`: e=`{e}`") +1004 return False +1005 +1006 def get_series_info_by_id(self, get_series: dict): +1007 """Get Seasons and Episodes for a Series +1008 +1009 Args: +1010 get_series (dict): Series dictionary +1011 """ 1012 -1013 Args: -1014 URL (str): The URL where to GET content -1015 timeout (Tuple[int, int], optional): Connection and Downloading Timeout. -1016 Defaults to (2,15). -1017 -1018 Returns: -1019 Optional[dict]: JSON dictionary of the loaded data, or None -1020 """ -1021 for attempt in range(10): -1022 time.sleep(1) -1023 try: -1024 response = requests.get(url, timeout=timeout, headers=self.connection_headers) -1025 response.raise_for_status() # Raise an HTTPError for bad responses (4xx and 5xx) -1026 return response.json() -1027 except requests.exceptions.RequestException as e: -1028 self._handle_request_exception(e) -1029 -1030 return None -1031 # i = 0 -1032 # while i < 10: -1033 # time.sleep(1) -1034 # try: -1035 # r = requests.get(url, timeout=timeout, headers=self.connection_headers) -1036 # i = 20 -1037 # if r.status_code == 200: -1038 # return r.json() -1039 # except requests.exceptions.ConnectionError: -1040 # print(" - Connection Error: Possible network problem (e.g. DNS failure, refused connection, etc)") -1041 # i += 1 -1042 -1043 # except requests.exceptions.HTTPError: -1044 # print(" - HTTP Error") -1045 # i += 1 -1046 -1047 # except requests.exceptions.TooManyRedirects: -1048 # print(" - TooManyRedirects") -1049 # i += 1 -1050 -1051 # except requests.exceptions.ReadTimeout: -1052 # print(" - Timeout while loading data") -1053 # i += 1 -1054 -1055 # return None -1056 -1057 # GET Stream Categories -1058 def _load_categories_from_provider(self, stream_type: str): -1059 """Get from provider all category for specific stream type from provider -1060 -1061 Args: -1062 stream_type (str): Stream type can be Live, VOD, Series -1063 -1064 Returns: -1065 [type]: JSON if successfull, otherwise None -1066 """ -1067 url = "" -1068 if stream_type == self.live_type: -1069 url = self.get_live_categories_URL() -1070 elif stream_type == self.vod_type: -1071 url = self.get_vod_cat_URL() -1072 elif stream_type == self.series_type: -1073 url = self.get_series_cat_URL() -1074 else: -1075 url = "" -1076 -1077 return self._get_request(url) -1078 -1079 # GET Streams -1080 def _load_streams_from_provider(self, stream_type: str): -1081 """Get from provider all streams for specific stream type +1013 series_seasons = self._load_series_info_by_id_from_provider(get_series.series_id) +1014 +1015 if series_seasons["seasons"] is None: +1016 series_seasons["seasons"] = [ +1017 {"name": "Season 1", "cover": series_seasons["info"]["cover"]} +1018 ] +1019 +1020 for series_info in series_seasons["seasons"]: +1021 season_name = series_info["name"] +1022 season = Season(season_name) +1023 get_series.seasons[season_name] = season +1024 if "episodes" in series_seasons.keys(): +1025 for series_season in series_seasons["episodes"].keys(): +1026 for episode_info in series_seasons["episodes"][str(series_season)]: +1027 new_episode_channel = Episode( +1028 self, series_info, "Testing", episode_info +1029 ) +1030 season.episodes[episode_info["title"]] = new_episode_channel +1031 +1032 def _handle_request_exception(self, exception: requests.exceptions.RequestException): +1033 """Handle different types of request exceptions.""" +1034 if isinstance(exception, requests.exceptions.ConnectionError): +1035 print(" - Connection Error: Possible network problem \ +1036 (e.g. DNS failure, refused connection, etc)") +1037 elif isinstance(exception, requests.exceptions.HTTPError): +1038 print(" - HTTP Error") +1039 elif isinstance(exception, requests.exceptions.TooManyRedirects): +1040 print(" - TooManyRedirects") +1041 elif isinstance(exception, requests.exceptions.ReadTimeout): +1042 print(" - Timeout while loading data") +1043 else: +1044 print(f" - An unexpected error occurred: {exception}") +1045 +1046 def _get_request(self, url: str, timeout: Tuple[int, int] = (2, 15)) -> Optional[dict]: +1047 """Generic GET Request with Error handling +1048 +1049 Args: +1050 URL (str): The URL where to GET content +1051 timeout (Tuple[int, int], optional): Connection and Downloading Timeout. +1052 Defaults to (2,15). +1053 +1054 Returns: +1055 Optional[dict]: JSON dictionary of the loaded data, or None +1056 """ +1057 +1058 kb_size = 1024 +1059 all_data = [] +1060 down_stats = {"bytes": 0, "kbytes": 0, "mbytes": 0, "start": 0.0, "delta_sec": 0.0} +1061 +1062 for attempt in range(10): +1063 try: +1064 response = requests.get( +1065 url, +1066 stream=True, +1067 timeout=timeout, +1068 headers=self.connection_headers +1069 ) +1070 response.raise_for_status() # Raise an HTTPError for bad responses (4xx and 5xx) +1071 break +1072 except requests.exceptions.RequestException as e: +1073 self._handle_request_exception(e) +1074 return None +1075 +1076 # If there is an answer from the remote server +1077 if response.status_code in (200, 206): +1078 down_stats["start"] = time.perf_counter() +1079 +1080 # Set downloaded size +1081 down_stats["bytes"] = 0 1082 -1083 Args: -1084 stream_type (str): Stream type can be Live, VOD, Series +1083 # Set stream blocks +1084 block_bytes = int(1*kb_size*kb_size) # 4 MB 1085 -1086 Returns: -1087 [type]: JSON if successfull, otherwise None -1088 """ -1089 url = "" -1090 if stream_type == self.live_type: -1091 url = self.get_live_streams_URL() -1092 elif stream_type == self.vod_type: -1093 url = self.get_vod_streams_URL() -1094 elif stream_type == self.series_type: -1095 url = self.get_series_URL() -1096 else: -1097 url = "" -1098 -1099 return self._get_request(url) -1100 -1101 # GET Streams by Category -1102 def _load_streams_by_category_from_provider(self, stream_type: str, category_id): -1103 """Get from provider all streams for specific stream type with category/group ID -1104 -1105 Args: -1106 stream_type (str): Stream type can be Live, VOD, Series -1107 category_id ([type]): Category/Group ID. -1108 -1109 Returns: -1110 [type]: JSON if successfull, otherwise None -1111 """ -1112 url = "" -1113 -1114 if stream_type == self.live_type: -1115 url = self.get_live_streams_URL_by_category(category_id) -1116 elif stream_type == self.vod_type: -1117 url = self.get_vod_streams_URL_by_category(category_id) -1118 elif stream_type == self.series_type: -1119 url = self.get_series_URL_by_category(category_id) -1120 else: -1121 url = "" -1122 -1123 return self._get_request(url) -1124 -1125 # GET SERIES Info -1126 def _load_series_info_by_id_from_provider(self, series_id: str): -1127 """Gets informations about a Serie -1128 -1129 Args: -1130 series_id (str): Serie ID as described in Group +1086 # Grab data by block_bytes +1087 for data in response.iter_content(block_bytes, decode_unicode=False): +1088 down_stats["bytes"] += len(data) +1089 down_stats["kbytes"] = down_stats["bytes"]/kb_size +1090 down_stats["mbytes"] = down_stats["bytes"]/kb_size/kb_size +1091 down_stats["delta_sec"] = time.perf_counter() - down_stats["start"] +1092 download_speed_average = down_stats["kbytes"]//down_stats["delta_sec"] +1093 sys.stdout.write( +1094 f'\rDownloading {down_stats["kbytes"]:.1f} MB at {download_speed_average:.0f} kB/s' +1095 ) +1096 sys.stdout.flush() +1097 all_data.append(data) +1098 print(" - Done") +1099 full_content = b''.join(all_data) +1100 return json.loads(full_content) +1101 +1102 print(f"HTTP error {response.status_code} while retrieving from {url}") +1103 +1104 return None +1105 +1106 # GET Stream Categories +1107 def _load_categories_from_provider(self, stream_type: str): +1108 """Get from provider all category for specific stream type from provider +1109 +1110 Args: +1111 stream_type (str): Stream type can be Live, VOD, Series +1112 +1113 Returns: +1114 [type]: JSON if successful, otherwise None +1115 """ +1116 url = "" +1117 if stream_type == self.live_type: +1118 url = self.get_live_categories_URL() +1119 elif stream_type == self.vod_type: +1120 url = self.get_vod_cat_URL() +1121 elif stream_type == self.series_type: +1122 url = self.get_series_cat_URL() +1123 else: +1124 url = "" +1125 +1126 return self._get_request(url) +1127 +1128 # GET Streams +1129 def _load_streams_from_provider(self, stream_type: str): +1130 """Get from provider all streams for specific stream type 1131 -1132 Returns: -1133 [type]: JSON if successfull, otherwise None -1134 """ -1135 return self._get_request(self.get_series_info_URL_by_ID(series_id)) -1136 -1137 # The seasons array, might be filled or might be completely empty. -1138 # If it is not empty, it will contain the cover, overview and the air date -1139 # of the selected season. -1140 # In your APP if you want to display the series, you have to take that -1141 # from the episodes array. -1142 -1143 # GET VOD Info -1144 def vodInfoByID(self, vod_id): -1145 return self._get_request(self.get_VOD_info_URL_by_ID(vod_id)) -1146 -1147 # GET short_epg for LIVE Streams (same as stalker portal, -1148 # prints the next X EPG that will play soon) -1149 def liveEpgByStream(self, stream_id): -1150 return self._get_request(self.get_live_epg_URL_by_stream(stream_id)) -1151 -1152 def liveEpgByStreamAndLimit(self, stream_id, limit): -1153 return self._get_request(self.get_live_epg_URL_by_stream_and_limit(stream_id, limit)) -1154 -1155 # GET ALL EPG for LIVE Streams (same as stalker portal, -1156 # but it will print all epg listings regardless of the day) -1157 def allLiveEpgByStream(self, stream_id): -1158 return self._get_request(self.get_all_live_epg_URL_by_stream(stream_id)) -1159 -1160 # Full EPG List for all Streams -1161 def allEpg(self): -1162 return self._get_request(self.get_all_epg_URL()) -1163 -1164 ## URL-builder methods -1165 def get_live_categories_URL(self) -> str: -1166 return f"{self.base_url}&action=get_live_categories" -1167 -1168 def get_live_streams_URL(self) -> str: -1169 return f"{self.base_url}&action=get_live_streams" -1170 -1171 def get_live_streams_URL_by_category(self, category_id) -> str: -1172 return f"{self.base_url}&action=get_live_streams&category_id={category_id}" +1132 Args: +1133 stream_type (str): Stream type can be Live, VOD, Series +1134 +1135 Returns: +1136 [type]: JSON if successful, otherwise None +1137 """ +1138 url = "" +1139 if stream_type == self.live_type: +1140 url = self.get_live_streams_URL() +1141 elif stream_type == self.vod_type: +1142 url = self.get_vod_streams_URL() +1143 elif stream_type == self.series_type: +1144 url = self.get_series_URL() +1145 else: +1146 url = "" +1147 +1148 return self._get_request(url) +1149 +1150 # GET Streams by Category +1151 def _load_streams_by_category_from_provider(self, stream_type: str, category_id): +1152 """Get from provider all streams for specific stream type with category/group ID +1153 +1154 Args: +1155 stream_type (str): Stream type can be Live, VOD, Series +1156 category_id ([type]): Category/Group ID. +1157 +1158 Returns: +1159 [type]: JSON if successful, otherwise None +1160 """ +1161 url = "" +1162 +1163 if stream_type == self.live_type: +1164 url = self.get_live_streams_URL_by_category(category_id) +1165 elif stream_type == self.vod_type: +1166 url = self.get_vod_streams_URL_by_category(category_id) +1167 elif stream_type == self.series_type: +1168 url = self.get_series_URL_by_category(category_id) +1169 else: +1170 url = "" +1171 +1172 return self._get_request(url) 1173 -1174 def get_vod_cat_URL(self) -> str: -1175 return f"{self.base_url}&action=get_vod_categories" -1176 -1177 def get_vod_streams_URL(self) -> str: -1178 return f"{self.base_url}&action=get_vod_streams" -1179 -1180 def get_vod_streams_URL_by_category(self, category_id) -> str: -1181 return f"{self.base_url}&action=get_vod_streams&category_id={category_id}" -1182 -1183 def get_series_cat_URL(self) -> str: -1184 return f"{self.base_url}&action=get_series_categories" -1185 -1186 def get_series_URL(self) -> str: -1187 return f"{self.base_url}&action=get_series" -1188 -1189 def get_series_URL_by_category(self, category_id) -> str: -1190 return f"{self.base_url}&action=get_series&category_id={category_id}" -1191 -1192 def get_series_info_URL_by_ID(self, series_id) -> str: -1193 return f"{self.base_url}&action=get_series_info&series_id={series_id}" -1194 -1195 def get_VOD_info_URL_by_ID(self, vod_id) -> str: -1196 return f"{self.base_url}&action=get_vod_info&vod_id={vod_id}" -1197 -1198 def get_live_epg_URL_by_stream(self, stream_id) -> str: -1199 return f"{self.base_url}&action=get_short_epg&stream_id={stream_id}" -1200 -1201 def get_live_epg_URL_by_stream_and_limit(self, stream_id, limit) -> str: -1202 return f"{self.base_url}&action=get_short_epg&stream_id={stream_id}&limit={limit}" -1203 -1204 def get_all_live_epg_URL_by_stream(self, stream_id) -> str: -1205 return f"{self.base_url}&action=get_simple_data_table&stream_id={stream_id}" -1206 -1207 def get_all_epg_URL(self) -> str: -1208 return f"{self.server}/xmltv.php?username={self.username}&password={self.password}" +1174 # GET SERIES Info +1175 def _load_series_info_by_id_from_provider(self, series_id: str, return_type: str = "DICT"): +1176 """Gets information about a Serie +1177 +1178 Args: +1179 series_id (str): Serie ID as described in Group +1180 return_type (str, optional): Output format, 'DICT' or 'JSON'. Defaults to "DICT". +1181 +1182 Returns: +1183 [type]: JSON if successful, otherwise None +1184 """ +1185 data = self._get_request(self.get_series_info_URL_by_ID(series_id)) +1186 if return_type == "JSON": +1187 return json.dumps(data, ensure_ascii=False) +1188 return data +1189 +1190 # The seasons array, might be filled or might be completely empty. +1191 # If it is not empty, it will contain the cover, overview and the air date +1192 # of the selected season. +1193 # In your APP if you want to display the series, you have to take that +1194 # from the episodes array. +1195 +1196 # GET VOD Info +1197 def vodInfoByID(self, vod_id): +1198 return self._get_request(self.get_VOD_info_URL_by_ID(vod_id)) +1199 +1200 # GET short_epg for LIVE Streams (same as stalker portal, +1201 # prints the next X EPG that will play soon) +1202 def liveEpgByStream(self, stream_id): +1203 return self._get_request(self.get_live_epg_URL_by_stream(stream_id)) +1204 +1205 def liveEpgByStreamAndLimit(self, stream_id, limit): +1206 return self._get_request(self.get_live_epg_URL_by_stream_and_limit(stream_id, limit)) +1207 +1208 # GET ALL EPG for LIVE Streams (same as stalker portal, +1209 # but it will print all epg listings regardless of the day) +1210 def allLiveEpgByStream(self, stream_id): +1211 return self._get_request(self.get_all_live_epg_URL_by_stream(stream_id)) +1212 +1213 # Full EPG List for all Streams +1214 def allEpg(self): +1215 return self._get_request(self.get_all_epg_URL()) +1216 +1217 # URL-builder methods +1218 def get_live_categories_URL(self) -> str: +1219 return f"{self.base_url}&action=get_live_categories" +1220 +1221 def get_live_streams_URL(self) -> str: +1222 return f"{self.base_url}&action=get_live_streams" +1223 +1224 def get_live_streams_URL_by_category(self, category_id) -> str: +1225 return f"{self.base_url}&action=get_live_streams&category_id={category_id}" +1226 +1227 def get_vod_cat_URL(self) -> str: +1228 return f"{self.base_url}&action=get_vod_categories" +1229 +1230 def get_vod_streams_URL(self) -> str: +1231 return f"{self.base_url}&action=get_vod_streams" +1232 +1233 def get_vod_streams_URL_by_category(self, category_id) -> str: +1234 return f"{self.base_url}&action=get_vod_streams&category_id={category_id}" +1235 +1236 def get_series_cat_URL(self) -> str: +1237 return f"{self.base_url}&action=get_series_categories" +1238 +1239 def get_series_URL(self) -> str: +1240 return f"{self.base_url}&action=get_series" +1241 +1242 def get_series_URL_by_category(self, category_id) -> str: +1243 return f"{self.base_url}&action=get_series&category_id={category_id}" +1244 +1245 def get_series_info_URL_by_ID(self, series_id) -> str: +1246 return f"{self.base_url}&action=get_series_info&series_id={series_id}" +1247 +1248 def get_VOD_info_URL_by_ID(self, vod_id) -> str: +1249 return f"{self.base_url}&action=get_vod_info&vod_id={vod_id}" +1250 +1251 def get_live_epg_URL_by_stream(self, stream_id) -> str: +1252 return f"{self.base_url}&action=get_short_epg&stream_id={stream_id}" +1253 +1254 def get_live_epg_URL_by_stream_and_limit(self, stream_id, limit) -> str: +1255 return f"{self.base_url}&action=get_short_epg&stream_id={stream_id}&limit={limit}" +1256 +1257 def get_all_live_epg_URL_by_stream(self, stream_id) -> str: +1258 return f"{self.base_url}&action=get_simple_data_table&stream_id={stream_id}" +1259 +1260 def get_all_epg_URL(self) -> str: +1261 return f"{self.server}/xmltv.php?username={self.username}&password={self.password}"

    @@ -1660,92 +1734,96 @@

    -
     43class Channel:
    - 44    # Required by Hypnotix
    - 45    info = ""
    - 46    id = ""
    - 47    name = ""  # What is the difference between the below name and title?
    - 48    logo = ""
    - 49    logo_path = ""
    - 50    group_title = ""
    - 51    title = ""
    - 52    url = ""
    - 53
    - 54    # XTream
    - 55    stream_type: str = ""
    - 56    group_id: str = ""
    - 57    is_adult: int = 0
    - 58    added: int = 0
    - 59    epg_channel_id: str = ""
    - 60    age_days_from_added: int = 0
    - 61    date_now: datetime
    - 62
    - 63    # This contains the raw JSON data
    - 64    raw = ""
    - 65
    - 66    def __init__(self, xtream: object, group_title, stream_info):
    - 67        self.date_now = datetime.now()
    - 68
    - 69        stream_type = stream_info["stream_type"]
    - 70        # Adjust the odd "created_live" type
    - 71        if stream_type in ("created_live", "radio_streams"):
    - 72            stream_type = "live"
    - 73
    - 74        if stream_type not in ("live", "movie"):
    - 75            print(f"Error the channel has unknown stream type `{stream_type}`\n`{stream_info}`")
    - 76        else:
    - 77            # Raw JSON Channel
    - 78            self.raw = stream_info
    - 79
    - 80            stream_name = stream_info["name"]
    - 81
    - 82            # Required by Hypnotix
    - 83            self.id = stream_info["stream_id"]
    - 84            self.name = stream_name
    - 85            self.logo = stream_info["stream_icon"]
    - 86            self.logo_path = xtream._get_logo_local_path(self.logo)
    - 87            self.group_title = group_title
    - 88            self.title = stream_name
    - 89
    - 90            # Check if category_id key is available
    - 91            if "category_id" in stream_info.keys():
    - 92                self.group_id = int(stream_info["category_id"])
    - 93
    - 94            if stream_type == "live":
    - 95                stream_extension = "ts"
    +            
     44class Channel:
    + 45    # Required by Hypnotix
    + 46    info = ""
    + 47    id = ""
    + 48    name = ""  # What is the difference between the below name and title?
    + 49    logo = ""
    + 50    logo_path = ""
    + 51    group_title = ""
    + 52    title = ""
    + 53    url = ""
    + 54
    + 55    # XTream
    + 56    stream_type: str = ""
    + 57    group_id: str = ""
    + 58    is_adult: int = 0
    + 59    added: int = 0
    + 60    epg_channel_id: str = ""
    + 61    age_days_from_added: int = 0
    + 62    date_now: datetime
    + 63
    + 64    # This contains the raw JSON data
    + 65    raw = ""
    + 66
    + 67    def __init__(self, xtream: object, group_title, stream_info):
    + 68        self.date_now = datetime.now()
    + 69
    + 70        stream_type = stream_info["stream_type"]
    + 71        # Adjust the odd "created_live" type
    + 72        if stream_type in ("created_live", "radio_streams"):
    + 73            stream_type = "live"
    + 74
    + 75        if stream_type not in ("live", "movie"):
    + 76            print(f"Error the channel has unknown stream type `{stream_type}`\n`{stream_info}`")
    + 77        else:
    + 78            # Raw JSON Channel
    + 79            self.raw = stream_info
    + 80
    + 81            stream_name = stream_info["name"]
    + 82
    + 83            # Required by Hypnotix
    + 84            self.id = stream_info["stream_id"]
    + 85            self.name = stream_name
    + 86            self.logo = stream_info["stream_icon"]
    + 87            self.logo_path = xtream._get_logo_local_path(self.logo)
    + 88            self.group_title = group_title
    + 89            self.title = stream_name
    + 90
    + 91            # Check if category_id key is available
    + 92            if "category_id" in stream_info.keys():
    + 93                self.group_id = int(stream_info["category_id"])
    + 94
    + 95            stream_extension = ""
      96
    - 97                # Check if epg_channel_id key is available
    - 98                if "epg_channel_id" in stream_info.keys():
    - 99                    self.epg_channel_id = stream_info["epg_channel_id"]
    -100
    -101            elif stream_type == "movie":
    -102                stream_extension = stream_info["container_extension"]
    + 97            if stream_type == "live":
    + 98                stream_extension = "ts"
    + 99
    +100                # Check if epg_channel_id key is available
    +101                if "epg_channel_id" in stream_info.keys():
    +102                    self.epg_channel_id = stream_info["epg_channel_id"]
     103
    -104            # Default to 0
    -105            self.is_adult = 0
    -106            # Check if is_adult key is available
    -107            if "is_adult" in stream_info.keys():
    -108                self.is_adult = int(stream_info["is_adult"])
    -109
    -110            self.added = int(stream_info["added"])
    -111            self.age_days_from_added = abs(datetime.utcfromtimestamp(self.added) - self.date_now).days
    +104            elif stream_type == "movie":
    +105                stream_extension = stream_info["container_extension"]
    +106
    +107            # Default to 0
    +108            self.is_adult = 0
    +109            # Check if is_adult key is available
    +110            if "is_adult" in stream_info.keys():
    +111                self.is_adult = int(stream_info["is_adult"])
     112
    -113            # Required by Hypnotix
    -114            self.url = f"{xtream.server}/{stream_type}/{xtream.authorization['username']}/" \
    -115                       f"{xtream.authorization['password']}/{stream_info['stream_id']}.{stream_extension}"
    -116
    -117            # Check that the constructed URL is valid
    -118            if not xtream._validate_url(self.url):
    -119                print(f"{self.name} - Bad URL? `{self.url}`")
    -120
    -121    def export_json(self):
    -122        jsondata = {}
    -123
    -124        jsondata["url"] = self.url
    -125        jsondata.update(self.raw)
    -126        jsondata["logo_path"] = self.logo_path
    -127
    -128        return jsondata
    +113            self.added = int(stream_info["added"])
    +114            self.age_days_from_added = abs(
    +115                datetime.utcfromtimestamp(self.added) - self.date_now
    +116                ).days
    +117
    +118            # Required by Hypnotix
    +119            self.url = f"{xtream.server}/{stream_type}/{xtream.authorization['username']}/" \
    +120                       f"{xtream.authorization['password']}/{stream_info['stream_id']}.{stream_extension}"
    +121
    +122            # Check that the constructed URL is valid
    +123            if not xtream._validate_url(self.url):
    +124                print(f"{self.name} - Bad URL? `{self.url}`")
    +125
    +126    def export_json(self):
    +127        jsondata = {}
    +128
    +129        jsondata["url"] = self.url
    +130        jsondata.update(self.raw)
    +131        jsondata["logo_path"] = self.logo_path
    +132
    +133        return jsondata
     
    @@ -1761,60 +1839,64 @@

    -
     66    def __init__(self, xtream: object, group_title, stream_info):
    - 67        self.date_now = datetime.now()
    - 68
    - 69        stream_type = stream_info["stream_type"]
    - 70        # Adjust the odd "created_live" type
    - 71        if stream_type in ("created_live", "radio_streams"):
    - 72            stream_type = "live"
    - 73
    - 74        if stream_type not in ("live", "movie"):
    - 75            print(f"Error the channel has unknown stream type `{stream_type}`\n`{stream_info}`")
    - 76        else:
    - 77            # Raw JSON Channel
    - 78            self.raw = stream_info
    - 79
    - 80            stream_name = stream_info["name"]
    - 81
    - 82            # Required by Hypnotix
    - 83            self.id = stream_info["stream_id"]
    - 84            self.name = stream_name
    - 85            self.logo = stream_info["stream_icon"]
    - 86            self.logo_path = xtream._get_logo_local_path(self.logo)
    - 87            self.group_title = group_title
    - 88            self.title = stream_name
    - 89
    - 90            # Check if category_id key is available
    - 91            if "category_id" in stream_info.keys():
    - 92                self.group_id = int(stream_info["category_id"])
    - 93
    - 94            if stream_type == "live":
    - 95                stream_extension = "ts"
    +            
     67    def __init__(self, xtream: object, group_title, stream_info):
    + 68        self.date_now = datetime.now()
    + 69
    + 70        stream_type = stream_info["stream_type"]
    + 71        # Adjust the odd "created_live" type
    + 72        if stream_type in ("created_live", "radio_streams"):
    + 73            stream_type = "live"
    + 74
    + 75        if stream_type not in ("live", "movie"):
    + 76            print(f"Error the channel has unknown stream type `{stream_type}`\n`{stream_info}`")
    + 77        else:
    + 78            # Raw JSON Channel
    + 79            self.raw = stream_info
    + 80
    + 81            stream_name = stream_info["name"]
    + 82
    + 83            # Required by Hypnotix
    + 84            self.id = stream_info["stream_id"]
    + 85            self.name = stream_name
    + 86            self.logo = stream_info["stream_icon"]
    + 87            self.logo_path = xtream._get_logo_local_path(self.logo)
    + 88            self.group_title = group_title
    + 89            self.title = stream_name
    + 90
    + 91            # Check if category_id key is available
    + 92            if "category_id" in stream_info.keys():
    + 93                self.group_id = int(stream_info["category_id"])
    + 94
    + 95            stream_extension = ""
      96
    - 97                # Check if epg_channel_id key is available
    - 98                if "epg_channel_id" in stream_info.keys():
    - 99                    self.epg_channel_id = stream_info["epg_channel_id"]
    -100
    -101            elif stream_type == "movie":
    -102                stream_extension = stream_info["container_extension"]
    + 97            if stream_type == "live":
    + 98                stream_extension = "ts"
    + 99
    +100                # Check if epg_channel_id key is available
    +101                if "epg_channel_id" in stream_info.keys():
    +102                    self.epg_channel_id = stream_info["epg_channel_id"]
     103
    -104            # Default to 0
    -105            self.is_adult = 0
    -106            # Check if is_adult key is available
    -107            if "is_adult" in stream_info.keys():
    -108                self.is_adult = int(stream_info["is_adult"])
    -109
    -110            self.added = int(stream_info["added"])
    -111            self.age_days_from_added = abs(datetime.utcfromtimestamp(self.added) - self.date_now).days
    +104            elif stream_type == "movie":
    +105                stream_extension = stream_info["container_extension"]
    +106
    +107            # Default to 0
    +108            self.is_adult = 0
    +109            # Check if is_adult key is available
    +110            if "is_adult" in stream_info.keys():
    +111                self.is_adult = int(stream_info["is_adult"])
     112
    -113            # Required by Hypnotix
    -114            self.url = f"{xtream.server}/{stream_type}/{xtream.authorization['username']}/" \
    -115                       f"{xtream.authorization['password']}/{stream_info['stream_id']}.{stream_extension}"
    -116
    -117            # Check that the constructed URL is valid
    -118            if not xtream._validate_url(self.url):
    -119                print(f"{self.name} - Bad URL? `{self.url}`")
    +113            self.added = int(stream_info["added"])
    +114            self.age_days_from_added = abs(
    +115                datetime.utcfromtimestamp(self.added) - self.date_now
    +116                ).days
    +117
    +118            # Required by Hypnotix
    +119            self.url = f"{xtream.server}/{stream_type}/{xtream.authorization['username']}/" \
    +120                       f"{xtream.authorization['password']}/{stream_info['stream_id']}.{stream_extension}"
    +121
    +122            # Check that the constructed URL is valid
    +123            if not xtream._validate_url(self.url):
    +124                print(f"{self.name} - Bad URL? `{self.url}`")
     
    @@ -2023,14 +2105,14 @@

    -
    121    def export_json(self):
    -122        jsondata = {}
    -123
    -124        jsondata["url"] = self.url
    -125        jsondata.update(self.raw)
    -126        jsondata["logo_path"] = self.logo_path
    -127
    -128        return jsondata
    +            
    126    def export_json(self):
    +127        jsondata = {}
    +128
    +129        jsondata["url"] = self.url
    +130        jsondata.update(self.raw)
    +131        jsondata["logo_path"] = self.logo_path
    +132
    +133        return jsondata
     
    @@ -2049,61 +2131,61 @@

    -
    131class Group:
    -132    # Required by Hypnotix
    -133    name = ""
    -134    group_type = ""
    -135
    -136    # XTream
    -137    group_id = ""
    -138
    -139    # This contains the raw JSON data
    -140    raw = ""
    -141
    -142    def convert_region_shortname_to_fullname(self, shortname):
    +            
    136class Group:
    +137    # Required by Hypnotix
    +138    name = ""
    +139    group_type = ""
    +140
    +141    # XTream
    +142    group_id = ""
     143
    -144        if shortname == "AR":
    -145            return "Arab"
    -146        if shortname == "AM":
    -147            return "America"
    -148        if shortname == "AS":
    -149            return "Asia"
    -150        if shortname == "AF":
    -151            return "Africa"
    -152        if shortname == "EU":
    -153            return "Europe"
    -154
    -155        return ""
    -156
    -157    def __init__(self, group_info: dict, stream_type: str):
    -158        # Raw JSON Group
    -159        self.raw = group_info
    -160
    -161        self.channels = []
    -162        self.series = []
    -163
    -164        TV_GROUP, MOVIES_GROUP, SERIES_GROUP = range(3)
    +144    # This contains the raw JSON data
    +145    raw = ""
    +146
    +147    def convert_region_shortname_to_fullname(self, shortname):
    +148
    +149        if shortname == "AR":
    +150            return "Arab"
    +151        if shortname == "AM":
    +152            return "America"
    +153        if shortname == "AS":
    +154            return "Asia"
    +155        if shortname == "AF":
    +156            return "Africa"
    +157        if shortname == "EU":
    +158            return "Europe"
    +159
    +160        return ""
    +161
    +162    def __init__(self, group_info: dict, stream_type: str):
    +163        # Raw JSON Group
    +164        self.raw = group_info
     165
    -166        if "VOD" == stream_type:
    -167            self.group_type = MOVIES_GROUP
    -168        elif "Series" == stream_type:
    -169            self.group_type = SERIES_GROUP
    -170        elif "Live" == stream_type:
    -171            self.group_type = TV_GROUP
    -172        else:
    -173            print(f"Unrecognized stream type `{stream_type}` for `{group_info}`")
    -174
    -175        self.name = group_info["category_name"]
    -176        split_name = self.name.split('|')
    -177        self.region_shortname = ""
    -178        self.region_longname = ""
    -179        if len(split_name) > 1:
    -180            self.region_shortname = split_name[0].strip()
    -181            self.region_longname = self.convert_region_shortname_to_fullname(self.region_shortname)
    -182
    -183        # Check if category_id key is available
    -184        if "category_id" in group_info.keys():
    -185            self.group_id = int(group_info["category_id"])
    +166        self.channels = []
    +167        self.series = []
    +168
    +169        TV_GROUP, MOVIES_GROUP, SERIES_GROUP = range(3)
    +170
    +171        if "VOD" == stream_type:
    +172            self.group_type = MOVIES_GROUP
    +173        elif "Series" == stream_type:
    +174            self.group_type = SERIES_GROUP
    +175        elif "Live" == stream_type:
    +176            self.group_type = TV_GROUP
    +177        else:
    +178            print(f"Unrecognized stream type `{stream_type}` for `{group_info}`")
    +179
    +180        self.name = group_info["category_name"]
    +181        split_name = self.name.split('|')
    +182        self.region_shortname = ""
    +183        self.region_longname = ""
    +184        if len(split_name) > 1:
    +185            self.region_shortname = split_name[0].strip()
    +186            self.region_longname = self.convert_region_shortname_to_fullname(self.region_shortname)
    +187
    +188        # Check if category_id key is available
    +189        if "category_id" in group_info.keys():
    +190            self.group_id = int(group_info["category_id"])
     
    @@ -2119,35 +2201,35 @@

    -
    157    def __init__(self, group_info: dict, stream_type: str):
    -158        # Raw JSON Group
    -159        self.raw = group_info
    -160
    -161        self.channels = []
    -162        self.series = []
    -163
    -164        TV_GROUP, MOVIES_GROUP, SERIES_GROUP = range(3)
    +            
    162    def __init__(self, group_info: dict, stream_type: str):
    +163        # Raw JSON Group
    +164        self.raw = group_info
     165
    -166        if "VOD" == stream_type:
    -167            self.group_type = MOVIES_GROUP
    -168        elif "Series" == stream_type:
    -169            self.group_type = SERIES_GROUP
    -170        elif "Live" == stream_type:
    -171            self.group_type = TV_GROUP
    -172        else:
    -173            print(f"Unrecognized stream type `{stream_type}` for `{group_info}`")
    -174
    -175        self.name = group_info["category_name"]
    -176        split_name = self.name.split('|')
    -177        self.region_shortname = ""
    -178        self.region_longname = ""
    -179        if len(split_name) > 1:
    -180            self.region_shortname = split_name[0].strip()
    -181            self.region_longname = self.convert_region_shortname_to_fullname(self.region_shortname)
    -182
    -183        # Check if category_id key is available
    -184        if "category_id" in group_info.keys():
    -185            self.group_id = int(group_info["category_id"])
    +166        self.channels = []
    +167        self.series = []
    +168
    +169        TV_GROUP, MOVIES_GROUP, SERIES_GROUP = range(3)
    +170
    +171        if "VOD" == stream_type:
    +172            self.group_type = MOVIES_GROUP
    +173        elif "Series" == stream_type:
    +174            self.group_type = SERIES_GROUP
    +175        elif "Live" == stream_type:
    +176            self.group_type = TV_GROUP
    +177        else:
    +178            print(f"Unrecognized stream type `{stream_type}` for `{group_info}`")
    +179
    +180        self.name = group_info["category_name"]
    +181        split_name = self.name.split('|')
    +182        self.region_shortname = ""
    +183        self.region_longname = ""
    +184        if len(split_name) > 1:
    +185            self.region_shortname = split_name[0].strip()
    +186            self.region_longname = self.convert_region_shortname_to_fullname(self.region_shortname)
    +187
    +188        # Check if category_id key is available
    +189        if "category_id" in group_info.keys():
    +190            self.group_id = int(group_info["category_id"])
     
    @@ -2213,20 +2295,20 @@

    -
    142    def convert_region_shortname_to_fullname(self, shortname):
    -143
    -144        if shortname == "AR":
    -145            return "Arab"
    -146        if shortname == "AM":
    -147            return "America"
    -148        if shortname == "AS":
    -149            return "Asia"
    -150        if shortname == "AF":
    -151            return "Africa"
    -152        if shortname == "EU":
    -153            return "Europe"
    -154
    -155        return ""
    +            
    147    def convert_region_shortname_to_fullname(self, shortname):
    +148
    +149        if shortname == "AR":
    +150            return "Arab"
    +151        if shortname == "AM":
    +152            return "America"
    +153        if shortname == "AS":
    +154            return "Asia"
    +155        if shortname == "AF":
    +156            return "Africa"
    +157        if shortname == "EU":
    +158            return "Europe"
    +159
    +160        return ""
     
    @@ -2289,39 +2371,39 @@

    -
    188class Episode:
    -189    # Required by Hypnotix
    -190    title = ""
    -191    name = ""
    -192    info = ""
    -193
    -194    # XTream
    -195
    -196    # This contains the raw JSON data
    -197    raw = ""
    +            
    193class Episode:
    +194    # Required by Hypnotix
    +195    title = ""
    +196    name = ""
    +197    info = ""
     198
    -199    def __init__(self, xtream: object, series_info, group_title, episode_info) -> None:
    -200        # Raw JSON Episode
    -201        self.raw = episode_info
    -202
    -203        self.title = episode_info["title"]
    -204        self.name = self.title
    -205        self.group_title = group_title
    -206        self.id = episode_info["id"]
    -207        self.container_extension = episode_info["container_extension"]
    -208        self.episode_number = episode_info["episode_num"]
    -209        self.av_info = episode_info["info"]
    -210
    -211        self.logo = series_info["cover"]
    -212        self.logo_path = xtream._get_logo_local_path(self.logo)
    -213
    -214        self.url =  f"{xtream.server}/series/" \
    -215                    f"{xtream.authorization['username']}/" \
    -216                    f"{xtream.authorization['password']}/{self.id}.{self.container_extension}"
    -217
    -218        # Check that the constructed URL is valid
    -219        if not xtream._validate_url(self.url):
    -220            print(f"{self.name} - Bad URL? `{self.url}`")
    +199    # XTream
    +200
    +201    # This contains the raw JSON data
    +202    raw = ""
    +203
    +204    def __init__(self, xtream: object, series_info, group_title, episode_info) -> None:
    +205        # Raw JSON Episode
    +206        self.raw = episode_info
    +207
    +208        self.title = episode_info["title"]
    +209        self.name = self.title
    +210        self.group_title = group_title
    +211        self.id = episode_info["id"]
    +212        self.container_extension = episode_info["container_extension"]
    +213        self.episode_number = episode_info["episode_num"]
    +214        self.av_info = episode_info["info"]
    +215
    +216        self.logo = series_info["cover"]
    +217        self.logo_path = xtream._get_logo_local_path(self.logo)
    +218
    +219        self.url = f"{xtream.server}/series/" \
    +220                   f"{xtream.authorization['username']}/" \
    +221                   f"{xtream.authorization['password']}/{self.id}.{self.container_extension}"
    +222
    +223        # Check that the constructed URL is valid
    +224        if not xtream._validate_url(self.url):
    +225            print(f"{self.name} - Bad URL? `{self.url}`")
     
    @@ -2337,28 +2419,28 @@

    -
    199    def __init__(self, xtream: object, series_info, group_title, episode_info) -> None:
    -200        # Raw JSON Episode
    -201        self.raw = episode_info
    -202
    -203        self.title = episode_info["title"]
    -204        self.name = self.title
    -205        self.group_title = group_title
    -206        self.id = episode_info["id"]
    -207        self.container_extension = episode_info["container_extension"]
    -208        self.episode_number = episode_info["episode_num"]
    -209        self.av_info = episode_info["info"]
    -210
    -211        self.logo = series_info["cover"]
    -212        self.logo_path = xtream._get_logo_local_path(self.logo)
    -213
    -214        self.url =  f"{xtream.server}/series/" \
    -215                    f"{xtream.authorization['username']}/" \
    -216                    f"{xtream.authorization['password']}/{self.id}.{self.container_extension}"
    -217
    -218        # Check that the constructed URL is valid
    -219        if not xtream._validate_url(self.url):
    -220            print(f"{self.name} - Bad URL? `{self.url}`")
    +            
    204    def __init__(self, xtream: object, series_info, group_title, episode_info) -> None:
    +205        # Raw JSON Episode
    +206        self.raw = episode_info
    +207
    +208        self.title = episode_info["title"]
    +209        self.name = self.title
    +210        self.group_title = group_title
    +211        self.id = episode_info["id"]
    +212        self.container_extension = episode_info["container_extension"]
    +213        self.episode_number = episode_info["episode_num"]
    +214        self.av_info = episode_info["info"]
    +215
    +216        self.logo = series_info["cover"]
    +217        self.logo_path = xtream._get_logo_local_path(self.logo)
    +218
    +219        self.url = f"{xtream.server}/series/" \
    +220                   f"{xtream.authorization['username']}/" \
    +221                   f"{xtream.authorization['password']}/{self.id}.{self.container_extension}"
    +222
    +223        # Check that the constructed URL is valid
    +224        if not xtream._validate_url(self.url):
    +225            print(f"{self.name} - Bad URL? `{self.url}`")
     
    @@ -2513,57 +2595,64 @@

    -
    223class Serie:
    -224    # Required by Hypnotix
    -225    name = ""
    -226    logo = ""
    -227    logo_path = ""
    -228
    -229    # XTream
    -230    series_id = ""
    -231    plot = ""
    -232    youtube_trailer = ""
    -233    genre = ""
    -234
    -235    # This contains the raw JSON data
    -236    raw = ""
    -237
    -238    def __init__(self, xtream: object, series_info):
    -239        # Raw JSON Series
    -240        self.raw = series_info
    -241        self.xtream = xtream
    +            
    228class Serie:
    +229    # Required by Hypnotix
    +230    name = ""
    +231    logo = ""
    +232    logo_path = ""
    +233
    +234    # XTream
    +235    series_id = ""
    +236    plot = ""
    +237    youtube_trailer = ""
    +238    genre = ""
    +239
    +240    # This contains the raw JSON data
    +241    raw = ""
     242
    -243        # Required by Hypnotix
    -244        self.name = series_info["name"]
    -245        self.logo = series_info["cover"]
    -246        self.logo_path = xtream._get_logo_local_path(self.logo)
    -247
    -248        self.seasons = {}
    -249        self.episodes = {}
    +243    def __init__(self, xtream: object, series_info):
    +244
    +245        series_info["added"] = series_info["last_modified"]
    +246
    +247        # Raw JSON Series
    +248        self.raw = series_info
    +249        self.xtream = xtream
     250
    -251        # Check if category_id key is available
    -252        if "series_id" in series_info.keys():
    -253            self.series_id = int(series_info["series_id"])
    -254
    -255        # Check if plot key is available
    -256        if "plot" in series_info.keys():
    -257            self.plot = series_info["plot"]
    +251        # Required by Hypnotix
    +252        self.name = series_info["name"]
    +253        self.logo = series_info["cover"]
    +254        self.logo_path = xtream._get_logo_local_path(self.logo)
    +255
    +256        self.seasons = {}
    +257        self.episodes = {}
     258
    -259        # Check if youtube_trailer key is available
    -260        if "youtube_trailer" in series_info.keys():
    -261            self.youtube_trailer = series_info["youtube_trailer"]
    +259        # Check if category_id key is available
    +260        if "series_id" in series_info.keys():
    +261            self.series_id = int(series_info["series_id"])
     262
    -263        # Check if genre key is available
    -264        if "genre" in series_info.keys():
    -265            self.genre = series_info["genre"]
    +263        # Check if plot key is available
    +264        if "plot" in series_info.keys():
    +265            self.plot = series_info["plot"]
     266
    -267    def export_json(self):
    -268        jsondata = {}
    -269
    -270        jsondata.update(self.raw)
    -271        jsondata['logo_path'] = self.logo_path
    -272
    -273        return jsondata
    +267        # Check if youtube_trailer key is available
    +268        if "youtube_trailer" in series_info.keys():
    +269            self.youtube_trailer = series_info["youtube_trailer"]
    +270
    +271        # Check if genre key is available
    +272        if "genre" in series_info.keys():
    +273            self.genre = series_info["genre"]
    +274
    +275        self.url = f"{xtream.server}/series/" \
    +276                   f"{xtream.authorization['username']}/" \
    +277                   f"{xtream.authorization['password']}/{self.series_id}/"
    +278
    +279    def export_json(self):
    +280        jsondata = {}
    +281
    +282        jsondata.update(self.raw)
    +283        jsondata['logo_path'] = self.logo_path
    +284
    +285        return jsondata
     
    @@ -2579,34 +2668,41 @@

    -
    238    def __init__(self, xtream: object, series_info):
    -239        # Raw JSON Series
    -240        self.raw = series_info
    -241        self.xtream = xtream
    -242
    -243        # Required by Hypnotix
    -244        self.name = series_info["name"]
    -245        self.logo = series_info["cover"]
    -246        self.logo_path = xtream._get_logo_local_path(self.logo)
    -247
    -248        self.seasons = {}
    -249        self.episodes = {}
    +            
    243    def __init__(self, xtream: object, series_info):
    +244
    +245        series_info["added"] = series_info["last_modified"]
    +246
    +247        # Raw JSON Series
    +248        self.raw = series_info
    +249        self.xtream = xtream
     250
    -251        # Check if category_id key is available
    -252        if "series_id" in series_info.keys():
    -253            self.series_id = int(series_info["series_id"])
    -254
    -255        # Check if plot key is available
    -256        if "plot" in series_info.keys():
    -257            self.plot = series_info["plot"]
    +251        # Required by Hypnotix
    +252        self.name = series_info["name"]
    +253        self.logo = series_info["cover"]
    +254        self.logo_path = xtream._get_logo_local_path(self.logo)
    +255
    +256        self.seasons = {}
    +257        self.episodes = {}
     258
    -259        # Check if youtube_trailer key is available
    -260        if "youtube_trailer" in series_info.keys():
    -261            self.youtube_trailer = series_info["youtube_trailer"]
    +259        # Check if category_id key is available
    +260        if "series_id" in series_info.keys():
    +261            self.series_id = int(series_info["series_id"])
     262
    -263        # Check if genre key is available
    -264        if "genre" in series_info.keys():
    -265            self.genre = series_info["genre"]
    +263        # Check if plot key is available
    +264        if "plot" in series_info.keys():
    +265            self.plot = series_info["plot"]
    +266
    +267        # Check if youtube_trailer key is available
    +268        if "youtube_trailer" in series_info.keys():
    +269            self.youtube_trailer = series_info["youtube_trailer"]
    +270
    +271        # Check if genre key is available
    +272        if "genre" in series_info.keys():
    +273            self.genre = series_info["genre"]
    +274
    +275        self.url = f"{xtream.server}/series/" \
    +276                   f"{xtream.authorization['username']}/" \
    +277                   f"{xtream.authorization['password']}/{self.series_id}/"
     
    @@ -2741,6 +2837,17 @@

    +

    +
    +
    + url + + +
    + + + +
    @@ -2753,13 +2860,13 @@

    -
    267    def export_json(self):
    -268        jsondata = {}
    -269
    -270        jsondata.update(self.raw)
    -271        jsondata['logo_path'] = self.logo_path
    -272
    -273        return jsondata
    +            
    279    def export_json(self):
    +280        jsondata = {}
    +281
    +282        jsondata.update(self.raw)
    +283        jsondata['logo_path'] = self.logo_path
    +284
    +285        return jsondata
     
    @@ -2778,13 +2885,13 @@

    -
    275class Season:
    -276    # Required by Hypnotix
    -277    name = ""
    -278
    -279    def __init__(self, name):
    -280        self.name = name
    -281        self.episodes = {}
    +            
    288class Season:
    +289    # Required by Hypnotix
    +290    name = ""
    +291
    +292    def __init__(self, name):
    +293        self.name = name
    +294        self.episodes = {}
     
    @@ -2800,9 +2907,9 @@

    -
    279    def __init__(self, name):
    -280        self.name = name
    -281        self.episodes = {}
    +            
    292    def __init__(self, name):
    +293        self.name = name
    +294        self.episodes = {}
     
    @@ -2844,933 +2951,972 @@

    -
     283class XTream:
    - 284
    - 285    name = ""
    - 286    server = ""
    - 287    secure_server = ""
    - 288    username = ""
    - 289    password = ""
    - 290
    - 291    live_type = "Live"
    - 292    vod_type = "VOD"
    - 293    series_type = "Series"
    - 294
    - 295    auth_data = {}
    - 296    authorization = {}
    - 297
    - 298    groups = []
    - 299    channels = []
    - 300    series = []
    - 301    movies = []
    - 302    movies_30days = []
    - 303    movies_7days = []
    - 304
    - 305    connection_headers = {}
    +            
     297class XTream:
    + 298
    + 299    name = ""
    + 300    server = ""
    + 301    secure_server = ""
    + 302    username = ""
    + 303    password = ""
    + 304    base_url = ""
    + 305    base_url_ssl = ""
      306
    - 307    state = {'authenticated': False, 'loaded': False}
    + 307    cache_path = ""
      308
    - 309    hide_adult_content = False
    + 309    account_expiration: timedelta
      310
    - 311    live_catch_all_group = Group(
    - 312        {"category_id": "9999", "category_name":"xEverythingElse", "parent_id":0}, live_type
    - 313    )
    - 314    vod_catch_all_group = Group(
    - 315        {"category_id": "9999", "category_name":"xEverythingElse", "parent_id":0}, vod_type
    - 316    )
    - 317    series_catch_all_group = Group(
    - 318        {"category_id": "9999", "category_name":"xEverythingElse", "parent_id":0}, series_type
    - 319    )
    - 320    # If the cached JSON file is older than threshold_time_sec then load a new
    - 321    # JSON dictionary from the provider
    - 322    threshold_time_sec = -1
    - 323
    - 324    def __init__(
    - 325        self,
    - 326        provider_name: str,
    - 327        provider_username: str,
    - 328        provider_password: str,
    - 329        provider_url: str,
    - 330        headers: dict = None,
    - 331        hide_adult_content: bool = False,
    - 332        cache_path: str = "",
    - 333        reload_time_sec: int = 60*60*8,
    - 334        validate_json: bool = False,
    - 335        debug_flask: bool = True
    - 336        ):
    - 337        """Initialize Xtream Class
    - 338
    - 339        Args:
    - 340            provider_name     (str):            Name of the IPTV provider
    - 341            provider_username (str):            User name of the IPTV provider
    - 342            provider_password (str):            Password of the IPTV provider
    - 343            provider_url      (str):            URL of the IPTV provider
    - 344            headers           (dict):           Requests Headers
    - 345            hide_adult_content(bool, optional): When `True` hide stream that are marked for adult
    - 346            cache_path        (str, optional):  Location where to save loaded files.
    - 347                                                Defaults to empty string.
    - 348            reload_time_sec   (int, optional):  Number of seconds before automatic reloading
    - 349                                                (-1 to turn it OFF)
    - 350            debug_flask       (bool, optional): Enable the debug mode in Flask
    - 351            validate_json     (bool, optional): Check Xtream API provided JSON for validity
    - 352
    - 353        Returns: XTream Class Instance
    - 354
    - 355        - Note 1: If it fails to authorize with provided username and password,
    - 356                auth_data will be an empty dictionary.
    - 357        - Note 2: The JSON validation option will take considerable amount of time and it should be 
    - 358                  used only as a debug tool. The Xtream API JSON from the provider passes through a
    - 359                  schema that represent the best available understanding of how the Xtream API 
    - 360                  works.
    - 361        """
    - 362        self.server = provider_url
    - 363        self.username = provider_username
    - 364        self.password = provider_password
    - 365        self.name = provider_name
    - 366        self.cache_path = cache_path
    - 367        self.hide_adult_content = hide_adult_content
    - 368        self.threshold_time_sec = reload_time_sec
    - 369        self.validate_json = validate_json
    - 370
    - 371        # get the pyxtream local path
    - 372        self.app_fullpath = osp.dirname(osp.realpath(__file__))
    - 373
    - 374        # prepare location of local html template
    - 375        self.html_template_folder = osp.join(self.app_fullpath,"html")
    - 376
    - 377        # if the cache_path is specified, test that it is a directory
    - 378        if self.cache_path != "":
    - 379            # If the cache_path is not a directory, clear it
    - 380            if not osp.isdir(self.cache_path):
    - 381                print(" - Cache Path is not a directory, using default '~/.xtream-cache/'")
    - 382                self.cache_path == ""
    - 383
    - 384        # If the cache_path is still empty, use default
    - 385        if self.cache_path == "":
    - 386            self.cache_path = osp.expanduser("~/.xtream-cache/")
    - 387            if not osp.isdir(self.cache_path):
    - 388                makedirs(self.cache_path, exist_ok=True)
    - 389            print(f"pyxtream cache path located at {self.cache_path}")
    - 390
    - 391        if headers is not None:
    - 392            self.connection_headers = headers
    - 393        else:
    - 394            self.connection_headers = {'User-Agent':"Wget/1.20.3 (linux-gnu)"}
    - 395
    - 396        self.authenticate()
    + 311    live_type = "Live"
    + 312    vod_type = "VOD"
    + 313    series_type = "Series"
    + 314
    + 315    auth_data = {}
    + 316    authorization = {'username': '', 'password': ''}
    + 317
    + 318    groups = []
    + 319    channels = []
    + 320    series = []
    + 321    movies = []
    + 322    movies_30days = []
    + 323    movies_7days = []
    + 324
    + 325    connection_headers = {}
    + 326
    + 327    state = {'authenticated': False, 'loaded': False}
    + 328
    + 329    hide_adult_content = False
    + 330
    + 331    live_catch_all_group = Group(
    + 332        {"category_id": "9999", "category_name": "xEverythingElse", "parent_id": 0}, live_type
    + 333    )
    + 334    vod_catch_all_group = Group(
    + 335        {"category_id": "9999", "category_name": "xEverythingElse", "parent_id": 0}, vod_type
    + 336    )
    + 337    series_catch_all_group = Group(
    + 338        {"category_id": "9999", "category_name": "xEverythingElse", "parent_id": 0}, series_type
    + 339    )
    + 340    # If the cached JSON file is older than threshold_time_sec then load a new
    + 341    # JSON dictionary from the provider
    + 342    threshold_time_sec = -1
    + 343
    + 344    validate_json: bool = True
    + 345
    + 346    # Used by REST API to get download progress
    + 347    download_progress: dict = {'StreamId': 0, 'Total': 0, 'Progress': 0}
    + 348
    + 349    def __init__(
    + 350        self,
    + 351        provider_name: str,
    + 352        provider_username: str,
    + 353        provider_password: str,
    + 354        provider_url: str,
    + 355        headers: dict = None,
    + 356        hide_adult_content: bool = False,
    + 357        cache_path: str = "",
    + 358        reload_time_sec: int = 60*60*8,
    + 359        validate_json: bool = False,
    + 360        enable_flask: bool = False,
    + 361        debug_flask: bool = True
    + 362            ):
    + 363        """Initialize Xtream Class
    + 364
    + 365        Args:
    + 366            provider_name     (str):            Name of the IPTV provider
    + 367            provider_username (str):            User name of the IPTV provider
    + 368            provider_password (str):            Password of the IPTV provider
    + 369            provider_url      (str):            URL of the IPTV provider
    + 370            headers           (dict):           Requests Headers
    + 371            hide_adult_content(bool, optional): When `True` hide stream that are marked for adult
    + 372            cache_path        (str, optional):  Location where to save loaded files.
    + 373                                                Defaults to empty string.
    + 374            reload_time_sec   (int, optional):  Number of seconds before automatic reloading
    + 375                                                (-1 to turn it OFF)
    + 376            validate_json     (bool, optional): Check Xtream API provided JSON for validity
    + 377            enable_flask      (bool, optional): Enable Flask
    + 378            debug_flask       (bool, optional): Enable the debug mode in Flask
    + 379
    + 380        Returns: XTream Class Instance
    + 381
    + 382        - Note 1: If it fails to authorize with provided username and password,
    + 383                auth_data will be an empty dictionary.
    + 384        - Note 2: The JSON validation option will take considerable amount of time and it should be
    + 385                  used only as a debug tool. The Xtream API JSON from the provider passes through a
    + 386                  schema that represent the best available understanding of how the Xtream API
    + 387                  works.
    + 388        """
    + 389        self.server = provider_url
    + 390        self.username = provider_username
    + 391        self.password = provider_password
    + 392        self.name = provider_name
    + 393        self.cache_path = cache_path
    + 394        self.hide_adult_content = hide_adult_content
    + 395        self.threshold_time_sec = reload_time_sec
    + 396        self.validate_json = validate_json
      397
    - 398        if self.threshold_time_sec > 0:
    - 399            print(f"Reload timer is ON and set to {self.threshold_time_sec} seconds")
    - 400        else:
    - 401            print("Reload timer is OFF")
    - 402
    - 403        if self.state['authenticated']:
    - 404            if USE_FLASK:
    - 405                self.flaskapp = FlaskWrap('pyxtream', self, self.html_template_folder, debug=debug_flask)
    - 406                self.flaskapp.start()
    - 407
    - 408    def search_stream(self, keyword: str,
    - 409                      ignore_case: bool = True,
    - 410                      return_type: str = "LIST",
    - 411                      stream_type: list = ("series", "movies", "channels")) -> list:
    - 412        """Search for streams
    - 413
    - 414        Args:
    - 415            keyword (str): Keyword to search for. Supports REGEX
    - 416            ignore_case (bool, optional): True to ignore case during search. Defaults to "True".
    - 417            return_type (str, optional): Output format, 'LIST' or 'JSON'. Defaults to "LIST".
    - 418            stream_type (list, optional): Search within specific stream type.
    - 419
    - 420        Returns:
    - 421            list: List with all the results, it could be empty.
    - 422        """
    - 423
    - 424        search_result = []
    - 425        regex_flags = re.IGNORECASE if ignore_case else 0
    - 426        regex = re.compile(keyword, regex_flags)
    - 427        # if ignore_case:
    - 428        #     regex = re.compile(keyword, re.IGNORECASE)
    - 429        # else:
    - 430        #     regex = re.compile(keyword)
    - 431
    - 432        # if "movies" in stream_type:
    - 433        #     print(f"Checking {len(self.movies)} movies")
    - 434        #     for stream in self.movies:
    - 435        #         if re.match(regex, stream.name) is not None:
    - 436        #             search_result.append(stream.export_json())
    - 437
    - 438        # if "channels" in stream_type:
    - 439        #     print(f"Checking {len(self.channels)} channels")
    - 440        #     for stream in self.channels:
    - 441        #         if re.match(regex, stream.name) is not None:
    - 442        #             search_result.append(stream.export_json())
    + 398        # get the pyxtream local path
    + 399        self.app_fullpath = osp.dirname(osp.realpath(__file__))
    + 400
    + 401        # prepare location of local html template
    + 402        self.html_template_folder = osp.join(self.app_fullpath, "html")
    + 403
    + 404        # if the cache_path is specified, test that it is a directory
    + 405        if self.cache_path != "":
    + 406            # If the cache_path is not a directory, clear it
    + 407            if not osp.isdir(self.cache_path):
    + 408                print(" - Cache Path is not a directory, using default '~/.xtream-cache/'")
    + 409                self.cache_path = ""
    + 410
    + 411        # If the cache_path is still empty, use default
    + 412        if self.cache_path == "":
    + 413            self.cache_path = osp.expanduser("~/.xtream-cache/")
    + 414            if not osp.isdir(self.cache_path):
    + 415                makedirs(self.cache_path, exist_ok=True)
    + 416            print(f"pyxtream cache path located at {self.cache_path}")
    + 417
    + 418        if headers is not None:
    + 419            self.connection_headers = headers
    + 420        else:
    + 421            self.connection_headers = {'User-Agent': "Wget/1.20.3 (linux-gnu)"}
    + 422
    + 423        self.authenticate()
    + 424
    + 425        if self.threshold_time_sec > 0:
    + 426            print(f"Reload timer is ON and set to {self.threshold_time_sec} seconds")
    + 427        else:
    + 428            print("Reload timer is OFF")
    + 429
    + 430        if self.state['authenticated']:
    + 431            if USE_FLASK and enable_flask:
    + 432                print("Starting Web Interface")
    + 433                self.flaskapp = FlaskWrap(
    + 434                    'pyxtream', self, self.html_template_folder, debug=debug_flask
    + 435                    )
    + 436                self.flaskapp.start()
    + 437            else:
    + 438                print("Web interface not running")
    + 439
    + 440    def get_download_progress(self, stream_id: int = None):
    + 441        # TODO: Add check for stream specific ID
    + 442        return json.dumps(self.download_progress)
      443
    - 444        # if "series" in stream_type:
    - 445        #     print(f"Checking {len(self.series)} series")
    - 446        #     for stream in self.series:
    - 447        #         if re.match(regex, stream.name) is not None:
    - 448        #             search_result.append(stream.export_json())
    - 449
    - 450        stream_collections = {
    - 451            "movies": self.movies,
    - 452            "channels": self.channels,
    - 453            "series": self.series
    - 454        }
    - 455
    - 456        for stream_type_name in stream_type:
    - 457            if stream_type_name in stream_collections:
    - 458                collection = stream_collections[stream_type_name]
    - 459                print(f"Checking {len(collection)} {stream_type_name}")
    - 460                for stream in collection:
    - 461                    if re.match(regex, stream.name) is not None:
    - 462                        search_result.append(stream.export_json())
    - 463            else:
    - 464                print(f"`{stream_type_name}` not found in collection")
    - 465
    - 466        if return_type == "JSON":
    - 467            # if search_result is not None:
    - 468            print(f"Found {len(search_result)} results `{keyword}`")
    - 469            return json.dumps(search_result, ensure_ascii=False)
    - 470
    - 471        return search_result
    - 472
    - 473    def download_video(self, stream_id: int) -> str:
    - 474        """Download Video from Stream ID
    - 475
    - 476        Args:
    - 477            stream_id (int): Stirng identifing the stream ID
    - 478
    - 479        Returns:
    - 480            str: Absolute Path Filename where the file was saved. Empty if could not download
    - 481        """
    - 482        url = ""
    - 483        filename = ""
    - 484        for stream in self.movies:
    - 485            if stream.id == stream_id:
    - 486                url = stream.url
    - 487                fn = f"{self._slugify(stream.name)}.{stream.raw['container_extension']}"
    - 488                filename = osp.join(self.cache_path,fn)
    + 444    def get_last_7days(self):
    + 445        return json.dumps(self.movies_7days, default=lambda x: x.export_json())
    + 446
    + 447    def search_stream(self, keyword: str,
    + 448                      ignore_case: bool = True,
    + 449                      return_type: str = "LIST",
    + 450                      stream_type: list = ("series", "movies", "channels"),
    + 451                      added_after: datetime = None) -> list:
    + 452        """Search for streams
    + 453
    + 454        Args:
    + 455            keyword (str): Keyword to search for. Supports REGEX
    + 456            ignore_case (bool, optional): True to ignore case during search. Defaults to "True".
    + 457            return_type (str, optional): Output format, 'LIST' or 'JSON'. Defaults to "LIST".
    + 458            stream_type (list, optional): Search within specific stream type.
    + 459            added_after (datetime, optional): Search for items that have been added after a certain date.
    + 460
    + 461        Returns:
    + 462            list: List with all the results, it could be empty.
    + 463        """
    + 464
    + 465        search_result = []
    + 466        regex_flags = re.IGNORECASE if ignore_case else 0
    + 467        regex = re.compile(keyword, regex_flags)
    + 468
    + 469        stream_collections = {
    + 470            "movies": self.movies,
    + 471            "channels": self.channels,
    + 472            "series": self.series
    + 473        }
    + 474
    + 475        for stream_type_name in stream_type:
    + 476            if stream_type_name in stream_collections:
    + 477                collection = stream_collections[stream_type_name]
    + 478                print(f"Checking {len(collection)} {stream_type_name}")
    + 479                for stream in collection:
    + 480                    if stream.name and re.match(regex, stream.name) is not None:
    + 481                        if added_after is None:
    + 482                            # Add all matches
    + 483                            search_result.append(stream.export_json())
    + 484                        else:
    + 485                            # Only add if it is more recent
    + 486                            pass
    + 487            else:
    + 488                print(f"`{stream_type_name}` not found in collection")
      489
    - 490        # If the url was correctly built and file does not exists, start downloading
    - 491        if url != "":
    - 492            #if not osp.isfile(filename):
    - 493            if not self._download_video_impl(url,filename):
    - 494                return "Error"
    - 495
    - 496        return filename
    - 497
    - 498    def _download_video_impl(self, url: str, fullpath_filename: str) -> bool:
    - 499        """Download a stream
    - 500
    - 501        Args:
    - 502            url (str): Complete URL of the stream
    - 503            fullpath_filename (str): Complete File path where to save the stream
    - 504
    - 505        Returns:
    - 506            bool: True if successful, False if error
    - 507        """
    - 508        ret_code = False
    - 509        mb_size = 1024*1024
    - 510        try:
    - 511            print(f"Downloading from URL `{url}` and saving at `{fullpath_filename}`")
    - 512
    - 513            # Check if the file already exists
    - 514            if osp.exists(fullpath_filename):
    - 515                # If the file exists, resume the download from where it left off
    - 516                file_size = osp.getsize(fullpath_filename)
    - 517                self.connection_headers['Range'] = f'bytes={file_size}-'
    - 518                mode = 'ab'  # Append to the existing file
    - 519                print(f"Resuming from {file_size:_} bytes")
    - 520            else:
    - 521                # If the file does not exist, start a new download
    - 522                mode = 'wb'  # Write a new file
    - 523
    - 524            # Make the request to download
    - 525            response = requests.get(url, timeout=(10), stream=True, allow_redirects=True, headers=self.connection_headers)
    - 526            # If there is an answer from the remote server
    - 527            if response.status_code == 200 or response.status_code == 206:
    - 528                # Get content type Binary or Text
    - 529                content_type = response.headers.get('content-type',None)
    - 530
    - 531                # Get total playlist byte size
    - 532                total_content_size = int(response.headers.get('content-length',None))
    - 533                total_content_size_mb = total_content_size/mb_size
    - 534
    - 535                # Set downloaded size
    - 536                downloaded_bytes = 0
    - 537
    - 538                # Set stream blocks
    - 539                block_bytes = int(4*mb_size)     # 4 MB
    - 540
    - 541                print(f"Ready to download {total_content_size_mb:.1f} MB file ({total_content_size})")
    - 542                if content_type.split('/')[0] != "text":
    - 543                    with open(fullpath_filename, mode) as file:
    - 544
    - 545                        # Grab data by block_bytes
    - 546                        for data in response.iter_content(block_bytes,decode_unicode=False):
    - 547                            downloaded_bytes += block_bytes
    - 548                            progress(downloaded_bytes,total_content_size,"Downloading")
    - 549                            file.write(data)
    - 550
    - 551                    if downloaded_bytes == total_content_size:
    - 552                        ret_code = True
    - 553
    - 554                    # Delete Range if it was added
    - 555                    try:
    - 556                        del self.connection_headers['Range']
    - 557                    except KeyError:
    - 558                        pass
    - 559                else:
    - 560                    print(f"URL has a file with unexpected content-type {content_type}")
    - 561            else:
    - 562                print(f"HTTP error {response.status_code} while retrieving from {url}")
    - 563        except Exception as e:
    - 564            print(e)
    - 565
    - 566        return ret_code
    - 567
    - 568    def _slugify(self, string: str) -> str:
    - 569        """Normalize string
    - 570
    - 571        Normalizes string, converts to lowercase, removes non-alpha characters,
    - 572        and converts spaces to hyphens.
    + 490        if return_type == "JSON":
    + 491            # if search_result is not None:
    + 492            print(f"Found {len(search_result)} results `{keyword}`")
    + 493            return json.dumps(search_result, ensure_ascii=False)
    + 494
    + 495        return search_result
    + 496
    + 497    def download_video(self, stream_id: int) -> str:
    + 498        """Download Video from Stream ID
    + 499
    + 500        Args:
    + 501            stream_id (int): String identifying the stream ID
    + 502
    + 503        Returns:
    + 504            str: Absolute Path Filename where the file was saved. Empty if could not download
    + 505        """
    + 506        url = ""
    + 507        filename = ""
    + 508        for series_stream in self.series:
    + 509            if series_stream.series_id == stream_id:
    + 510                episode_object: Episode = series_stream.episodes["1"]
    + 511                url = f"{series_stream.url}/{episode_object.id}."\
    + 512                      f"{episode_object.container_extension}"
    + 513
    + 514        for stream in self.movies:
    + 515            if stream.id == stream_id:
    + 516                url = stream.url
    + 517                fn = f"{self._slugify(stream.name)}.{stream.raw['container_extension']}"
    + 518                filename = osp.join(self.cache_path, fn)
    + 519
    + 520        # If the url was correctly built and file does not exists, start downloading
    + 521        if url != "":
    + 522            if not self._download_video_impl(url, filename):
    + 523                return "Error"
    + 524
    + 525        return filename
    + 526
    + 527    def _download_video_impl(self, url: str, fullpath_filename: str) -> bool:
    + 528        """Download a stream
    + 529
    + 530        Args:
    + 531            url (str): Complete URL of the stream
    + 532            fullpath_filename (str): Complete File path where to save the stream
    + 533
    + 534        Returns:
    + 535            bool: True if successful, False if error
    + 536        """
    + 537        ret_code = False
    + 538        mb_size = 1024*1024
    + 539        try:
    + 540            print(f"Downloading from URL `{url}` and saving at `{fullpath_filename}`")
    + 541
    + 542            # Check if the file already exists
    + 543            if osp.exists(fullpath_filename):
    + 544                # If the file exists, resume the download from where it left off
    + 545                file_size = osp.getsize(fullpath_filename)
    + 546                self.connection_headers['Range'] = f'bytes={file_size}-'
    + 547                mode = 'ab'  # Append to the existing file
    + 548                print(f"Resuming from {file_size:_} bytes")
    + 549            else:
    + 550                # If the file does not exist, start a new download
    + 551                mode = 'wb'  # Write a new file
    + 552
    + 553            # Make the request to download
    + 554            response = requests.get(
    + 555                url, timeout=(10),
    + 556                stream=True,
    + 557                allow_redirects=True,
    + 558                headers=self.connection_headers
    + 559                )
    + 560            # If there is an answer from the remote server
    + 561            if response.status_code in (200, 206):
    + 562                # Get content type Binary or Text
    + 563                content_type = response.headers.get('content-type', None)
    + 564
    + 565                # Get total playlist byte size
    + 566                total_content_size = int(response.headers.get('content-length', None))
    + 567                total_content_size_mb = total_content_size/mb_size
    + 568
    + 569                # Set downloaded size
    + 570                downloaded_bytes = 0
    + 571                self.download_progress['Total'] = total_content_size
    + 572                self.download_progress['Progress'] = 0
      573
    - 574        Args:
    - 575            string (str): String to be normalized
    + 574                # Set stream blocks
    + 575                block_bytes = int(4*mb_size)     # 4 MB
      576
    - 577        Returns:
    - 578            str: Normalized String
    - 579        """
    - 580        return "".join(x.lower() for x in string if x.isprintable())
    - 581
    - 582    def _validate_url(self, url: str) -> bool:
    - 583        regex = re.compile(
    - 584            r"^(?:http|ftp)s?://"  # http:// or https://
    - 585            r"(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|"  # domain...
    - 586            r"localhost|"  # localhost...
    - 587            r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"  # ...or ip
    - 588            r"(?::\d+)?"  # optional port
    - 589            r"(?:/?|[/?]\S+)$",
    - 590            re.IGNORECASE,
    - 591        )
    - 592
    - 593        return re.match(regex, url) is not None
    - 594
    - 595    def _get_logo_local_path(self, logo_url: str) -> str:
    - 596        """Convert the Logo URL to a local Logo Path
    - 597
    - 598        Args:
    - 599            logoURL (str): The Logo URL
    - 600
    - 601        Returns:
    - 602            [type]: The logo path as a string or None
    - 603        """
    - 604        local_logo_path = None
    - 605        if logo_url is not None:
    - 606            if not self._validate_url(logo_url):
    - 607                logo_url = None
    - 608            else:
    - 609                local_logo_path = osp.join(
    - 610                    self.cache_path,
    - 611                    f"{self._slugify(self.name)}-{self._slugify(osp.split(logo_url)[-1])}"
    - 612                )
    - 613        return local_logo_path
    + 577                print(
    + 578                    f"Ready to download {total_content_size_mb:.1f} MB file ({total_content_size})"
    + 579                    )
    + 580                if content_type.split('/')[0] != "text":
    + 581                    with open(fullpath_filename, mode) as file:
    + 582
    + 583                        # Grab data by block_bytes
    + 584                        for data in response.iter_content(block_bytes, decode_unicode=False):
    + 585                            downloaded_bytes += block_bytes
    + 586                            progress(downloaded_bytes, total_content_size, "Downloading")
    + 587                            self.download_progress['Progress'] = downloaded_bytes
    + 588                            file.write(data)
    + 589
    + 590                    ret_code = True
    + 591
    + 592                    # Delete Range if it was added
    + 593                    try:
    + 594                        del self.connection_headers['Range']
    + 595                    except KeyError:
    + 596                        pass
    + 597                else:
    + 598                    print(f"URL has a file with unexpected content-type {content_type}")
    + 599            else:
    + 600                print(f"HTTP error {response.status_code} while retrieving from {url}")
    + 601        except requests.exceptions.ReadTimeout:
    + 602            print("Read Timeout, try again")
    + 603        except Exception as e:
    + 604            print("Unknown error")
    + 605            print(e)
    + 606
    + 607        return ret_code
    + 608
    + 609    def _slugify(self, string: str) -> str:
    + 610        """Normalize string
    + 611
    + 612        Normalizes string, converts to lowercase, removes non-alpha characters,
    + 613        and converts spaces to hyphens.
      614
    - 615    def authenticate(self):
    - 616        """Login to provider"""
    - 617        # If we have not yet successfully authenticated, attempt authentication
    - 618        if self.state["authenticated"] is False:
    - 619            # Erase any previous data
    - 620            self.auth_data = {}
    - 621            # Loop through 30 seconds
    - 622            i = 0
    - 623            r = None
    - 624            # Prepare the authentication url
    - 625            url = f"{self.server}/player_api.php?username={self.username}&password={self.password}"
    - 626            print("Attempting connection... ", end='')
    - 627            while i < 30:
    - 628                try:
    - 629                    # Request authentication, wait 4 seconds maximum
    - 630                    r = requests.get(url, timeout=(4), headers=self.connection_headers)
    - 631                    i = 31
    - 632                except requests.exceptions.ConnectionError:
    - 633                    time.sleep(1)
    - 634                    print(f"{i} ", end='',flush=True)
    - 635                    i += 1
    - 636
    - 637            if r is not None:
    - 638                # If the answer is ok, process data and change state
    - 639                if r.ok:
    - 640                    print("Connected")
    - 641                    self.auth_data = r.json()
    - 642                    self.authorization = {
    - 643                        "username": self.auth_data["user_info"]["username"],
    - 644                        "password": self.auth_data["user_info"]["password"]
    - 645                    }
    - 646                    # Account expiration date
    - 647                    self.account_expiration = timedelta(
    - 648                        seconds=(
    - 649                            int(self.auth_data["user_info"]["exp_date"])-datetime.now().timestamp()
    - 650                        )
    - 651                    )
    - 652                    # Mark connection authorized
    - 653                    self.state["authenticated"] = True
    - 654                    # Construct the base url for all requests
    - 655                    self.base_url = f"{self.server}/player_api.php?username={self.username}&password={self.password}"
    - 656                    # If there is a secure server connection, construct the base url SSL for all requests
    - 657                    if "https_port" in self.auth_data["server_info"]:
    - 658                        self.base_url_ssl = f"https://{self.auth_data['server_info']['url']}:{self.auth_data['server_info']['https_port']}" \
    - 659                                            f"/player_api.php?username={self.username}&password={self.password}"
    - 660                    print(f"Account expires in {str(self.account_expiration)}")
    - 661                else:
    - 662                    print(f"Provider `{self.name}` could not be loaded. Reason: `{r.status_code} {r.reason}`")
    - 663            else:
    - 664                print(f"\n{self.name}: Provider refused the connection")
    - 665
    - 666    def _load_from_file(self, filename) -> dict:
    - 667        """Try to load the dictionary from file
    - 668
    - 669        Args:
    - 670            filename ([type]): File name containing the data
    - 671
    - 672        Returns:
    - 673            dict: Dictionary if found and no errors, None if file does not exists
    - 674        """
    - 675        # Build the full path
    - 676        full_filename = osp.join(self.cache_path, f"{self._slugify(self.name)}-{filename}")
    + 615        Args:
    + 616            string (str): String to be normalized
    + 617
    + 618        Returns:
    + 619            str: Normalized String
    + 620        """
    + 621        return "".join(x.lower() for x in string if x.isprintable())
    + 622
    + 623    def _validate_url(self, url: str) -> bool:
    + 624        regex = re.compile(
    + 625            r"^(?:http|ftp)s?://"  # http:// or https://
    + 626            r"(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|"  # domain...
    + 627            r"localhost|"  # localhost...
    + 628            r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"  # ...or ip
    + 629            r"(?::\d+)?"  # optional port
    + 630            r"(?:/?|[/?]\S+)$",
    + 631            re.IGNORECASE,
    + 632        )
    + 633
    + 634        return re.match(regex, url) is not None
    + 635
    + 636    def _get_logo_local_path(self, logo_url: str) -> str:
    + 637        """Convert the Logo URL to a local Logo Path
    + 638
    + 639        Args:
    + 640            logoURL (str): The Logo URL
    + 641
    + 642        Returns:
    + 643            [type]: The logo path as a string or None
    + 644        """
    + 645        local_logo_path = None
    + 646        if logo_url is not None:
    + 647            if not self._validate_url(logo_url):
    + 648                logo_url = None
    + 649            else:
    + 650                local_logo_path = osp.join(
    + 651                    self.cache_path,
    + 652                    f"{self._slugify(self.name)}-{self._slugify(osp.split(logo_url)[-1])}"
    + 653                )
    + 654        return local_logo_path
    + 655
    + 656    def authenticate(self):
    + 657        """Login to provider"""
    + 658        # If we have not yet successfully authenticated, attempt authentication
    + 659        if self.state["authenticated"] is False:
    + 660            # Erase any previous data
    + 661            self.auth_data = {}
    + 662            # Loop through 30 seconds
    + 663            i = 0
    + 664            r = None
    + 665            # Prepare the authentication url
    + 666            url = f"{self.server}/player_api.php?username={self.username}&password={self.password}"
    + 667            print("Attempting connection... ", end='')
    + 668            while i < 30:
    + 669                try:
    + 670                    # Request authentication, wait 4 seconds maximum
    + 671                    r = requests.get(url, timeout=(4), headers=self.connection_headers)
    + 672                    i = 31
    + 673                except (requests.exceptions.ConnectionError, requests.exceptions.ReadTimeout):
    + 674                    time.sleep(1)
    + 675                    print(f"{i} ", end='', flush=True)
    + 676                    i += 1
      677
    - 678        # If the cached file exists, attempt to load it
    - 679        if osp.isfile(full_filename):
    - 680
    - 681            my_data = None
    - 682
    - 683            # Get the enlapsed seconds since last file update
    - 684            file_age_sec = time.time() - osp.getmtime(full_filename)
    - 685            # If the file was updated less than the threshold time,
    - 686            # it means that the file is still fresh, we can load it.
    - 687            # Otherwise skip and return None to force a re-download
    - 688            if self.threshold_time_sec > file_age_sec:
    - 689                # Load the JSON data
    - 690                try:
    - 691                    with open(full_filename, mode="r", encoding="utf-8") as myfile:
    - 692                        my_data = json.load(myfile)
    - 693                        if len(my_data) == 0:
    - 694                            my_data = None
    - 695                except Exception as e:
    - 696                    print(f" - Could not load from file `{full_filename}`: e=`{e}`")
    - 697            return my_data
    - 698
    - 699        return None
    - 700
    - 701    def _save_to_file(self, data_list: dict, filename: str) -> bool:
    - 702        """Save a dictionary to file
    - 703
    - 704        This function will overwrite the file if already exists
    - 705
    - 706        Args:
    - 707            data_list (dict): Dictionary to save
    - 708            filename (str): Name of the file
    + 678            if r is not None:
    + 679                # If the answer is ok, process data and change state
    + 680                if r.ok:
    + 681                    print("Connected")
    + 682                    self.auth_data = r.json()
    + 683                    self.authorization = {
    + 684                        "username": self.auth_data["user_info"]["username"],
    + 685                        "password": self.auth_data["user_info"]["password"]
    + 686                    }
    + 687                    # Account expiration date
    + 688                    self.account_expiration = timedelta(
    + 689                        seconds=(
    + 690                            int(self.auth_data["user_info"]["exp_date"])-datetime.now().timestamp()
    + 691                        )
    + 692                    )
    + 693                    # Mark connection authorized
    + 694                    self.state["authenticated"] = True
    + 695                    # Construct the base url for all requests
    + 696                    self.base_url = f"{self.server}/player_api.php?username={self.username}&password={self.password}"
    + 697                    # If there is a secure server connection, construct the base url SSL for all requests
    + 698                    if "https_port" in self.auth_data["server_info"]:
    + 699                        self.base_url_ssl = f"https://{self.auth_data['server_info']['url']}:{self.auth_data['server_info']['https_port']}" \
    + 700                                            f"/player_api.php?username={self.username}&password={self.password}"
    + 701                    print(f"Account expires in {str(self.account_expiration)}")
    + 702                else:
    + 703                    print(f"Provider `{self.name}` could not be loaded. Reason: `{r.status_code} {r.reason}`")
    + 704            else:
    + 705                print(f"\n{self.name}: Provider refused the connection")
    + 706
    + 707    def _load_from_file(self, filename) -> dict:
    + 708        """Try to load the dictionary from file
      709
    - 710        Returns:
    - 711            bool: True if successfull, False if error
    - 712        """
    - 713        if data_list is None:
    - 714            return False
    - 715
    - 716        full_filename = osp.join(self.cache_path, f"{self._slugify(self.name)}-{filename}")
    - 717        try:
    - 718            with open(full_filename, mode="wt", encoding="utf-8") as file:
    - 719                json.dump(data_list, file, ensure_ascii=False)
    - 720            return True
    - 721        except Exception as e:
    - 722            print(f" - Could not save to file `{full_filename}`: e=`{e}`")
    - 723            return False
    - 724        # if data_list is not None:
    - 725
    - 726        #     #Build the full path
    - 727        #     full_filename = osp.join(self.cache_path, f"{self._slugify(self.name)}-{filename}")
    - 728        #     # If the path makes sense, save the file
    - 729        #     json_data = json.dumps(data_list, ensure_ascii=False)
    - 730        #     try:
    - 731        #         with open(full_filename, mode="wt", encoding="utf-8") as myfile:
    - 732        #             myfile.write(json_data)
    - 733        #     except Exception as e:
    - 734        #         print(f" - Could not save to file `{full_filename}`: e=`{e}`")
    - 735        #         return False
    - 736
    - 737        #     return True
    - 738        # else:
    - 739        #     return False
    - 740
    - 741    def load_iptv(self) -> bool:
    - 742        """Load XTream IPTV
    - 743
    - 744        - Add all Live TV to XTream.channels
    - 745        - Add all VOD to XTream.movies
    - 746        - Add all Series to XTream.series
    - 747          Series contains Seasons and Episodes. Those are not automatically
    - 748          retrieved from the server to reduce the loading time.
    - 749        - Add all groups to XTream.groups
    - 750          Groups are for all three channel types, Live TV, VOD, and Series
    - 751
    - 752        Returns:
    - 753            bool: True if successfull, False if error
    - 754        """
    - 755        # If pyxtream has not authenticated the connection, return empty
    - 756        if self.state["authenticated"] is False:
    - 757            print("Warning, cannot load steams since authorization failed")
    - 758            return False
    - 759
    - 760        # If pyxtream has already loaded the data, skip and return success
    - 761        if self.state["loaded"] is True:
    - 762            print("Warning, data has already been loaded.")
    - 763            return True
    - 764
    - 765        for loading_stream_type in (self.live_type, self.vod_type, self.series_type):
    - 766            ## Get GROUPS
    - 767
    - 768            # Try loading local file
    - 769            dt = 0
    - 770            start = timer()
    - 771            all_cat = self._load_from_file(f"all_groups_{loading_stream_type}.json")
    - 772            # If file empty or does not exists, download it from remote
    - 773            if all_cat is None:
    - 774                # Load all Groups and save file locally
    - 775                all_cat = self._load_categories_from_provider(loading_stream_type)
    - 776                if all_cat is not None:
    - 777                    self._save_to_file(all_cat,f"all_groups_{loading_stream_type}.json")
    - 778            dt = timer() - start
    - 779
    - 780            # If we got the GROUPS data, show the statistics and load GROUPS
    - 781            if all_cat is not None:
    - 782                print(f"{self.name}: Loaded {len(all_cat)} {loading_stream_type} Groups in {dt:.3f} seconds")
    - 783                ## Add GROUPS to dictionaries
    + 710        Args:
    + 711            filename ([type]): File name containing the data
    + 712
    + 713        Returns:
    + 714            dict: Dictionary if found and no errors, None if file does not exists
    + 715        """
    + 716        # Build the full path
    + 717        full_filename = osp.join(self.cache_path, f"{self._slugify(self.name)}-{filename}")
    + 718
    + 719        # If the cached file exists, attempt to load it
    + 720        if osp.isfile(full_filename):
    + 721
    + 722            my_data = None
    + 723
    + 724            # Get the elapsed seconds since last file update
    + 725            file_age_sec = time.time() - osp.getmtime(full_filename)
    + 726            # If the file was updated less than the threshold time,
    + 727            # it means that the file is still fresh, we can load it.
    + 728            # Otherwise skip and return None to force a re-download
    + 729            if self.threshold_time_sec > file_age_sec:
    + 730                # Load the JSON data
    + 731                try:
    + 732                    with open(full_filename, mode="r", encoding="utf-8") as myfile:
    + 733                        my_data = json.load(myfile)
    + 734                        if len(my_data) == 0:
    + 735                            my_data = None
    + 736                except Exception as e:
    + 737                    print(f" - Could not load from file `{full_filename}`: e=`{e}`")
    + 738            return my_data
    + 739
    + 740        return None
    + 741
    + 742    def _save_to_file(self, data_list: dict, filename: str) -> bool:
    + 743        """Save a dictionary to file
    + 744
    + 745        This function will overwrite the file if already exists
    + 746
    + 747        Args:
    + 748            data_list (dict): Dictionary to save
    + 749            filename (str): Name of the file
    + 750
    + 751        Returns:
    + 752            bool: True if successful, False if error
    + 753        """
    + 754        if data_list is None:
    + 755            return False
    + 756
    + 757        full_filename = osp.join(self.cache_path, f"{self._slugify(self.name)}-{filename}")
    + 758        try:
    + 759            with open(full_filename, mode="wt", encoding="utf-8") as file:
    + 760                json.dump(data_list, file, ensure_ascii=False)
    + 761            return True
    + 762        except Exception as e:
    + 763            print(f" - Could not save to file `{full_filename}`: e=`{e}`")
    + 764            return False
    + 765
    + 766    def load_iptv(self) -> bool:
    + 767        """Load XTream IPTV
    + 768
    + 769        - Add all Live TV to XTream.channels
    + 770        - Add all VOD to XTream.movies
    + 771        - Add all Series to XTream.series
    + 772          Series contains Seasons and Episodes. Those are not automatically
    + 773          retrieved from the server to reduce the loading time.
    + 774        - Add all groups to XTream.groups
    + 775          Groups are for all three channel types, Live TV, VOD, and Series
    + 776
    + 777        Returns:
    + 778            bool: True if successful, False if error
    + 779        """
    + 780        # If pyxtream has not authenticated the connection, return empty
    + 781        if self.state["authenticated"] is False:
    + 782            print("Warning, cannot load steams since authorization failed")
    + 783            return False
      784
    - 785                # Add the catch-all-errors group
    - 786                if loading_stream_type == self.live_type:
    - 787                    self.groups.append(self.live_catch_all_group)
    - 788                elif loading_stream_type == self.vod_type:
    - 789                    self.groups.append(self.vod_catch_all_group)
    - 790                elif loading_stream_type == self.series_type:
    - 791                    self.groups.append(self.series_catch_all_group)
    - 792
    - 793                for cat_obj in all_cat:
    - 794                    if schemaValidator(cat_obj, SchemaType.GROUP):
    - 795                        # Create Group (Category)
    - 796                        new_group = Group(cat_obj, loading_stream_type)
    - 797                        #  Add to xtream class
    - 798                        self.groups.append(new_group)
    - 799                    else:
    - 800                        # Save what did not pass schema validation
    - 801                        print(cat_obj)
    - 802
    - 803                # Sort Categories
    - 804                self.groups.sort(key=lambda x: x.name)
    - 805            else:
    - 806                print(f" - Could not load {loading_stream_type} Groups")
    - 807                break
    - 808
    - 809            ## Get Streams
    - 810
    - 811            # Try loading local file
    - 812            dt = 0
    - 813            start = timer()
    - 814            all_streams = self._load_from_file(f"all_stream_{loading_stream_type}.json")
    - 815            # If file empty or does not exists, download it from remote
    - 816            if all_streams is None:
    - 817                # Load all Streams and save file locally
    - 818                all_streams = self._load_streams_from_provider(loading_stream_type)
    - 819                self._save_to_file(all_streams,f"all_stream_{loading_stream_type}.json")
    - 820            dt = timer() - start
    - 821
    - 822            # If we got the STREAMS data, show the statistics and load Streams
    - 823            if all_streams is not None:
    - 824                print(f"{self.name}: Loaded {len(all_streams)} {loading_stream_type} Streams in {dt:.3f} seconds")
    - 825                ## Add Streams to dictionaries
    + 785        # If pyxtream has already loaded the data, skip and return success
    + 786        if self.state["loaded"] is True:
    + 787            print("Warning, data has already been loaded.")
    + 788            return True
    + 789
    + 790        # Delete skipped channels from cache
    + 791        full_filename = osp.join(self.cache_path, "skipped_streams.json")
    + 792        try:
    + 793            f = open(full_filename, mode="r+", encoding="utf-8")
    + 794            f.truncate(0)
    + 795            f.close()
    + 796        except FileNotFoundError:
    + 797            pass
    + 798
    + 799        for loading_stream_type in (self.live_type, self.vod_type, self.series_type):
    + 800            # Get GROUPS
    + 801
    + 802            # Try loading local file
    + 803            dt = 0
    + 804            start = timer()
    + 805            all_cat = self._load_from_file(f"all_groups_{loading_stream_type}.json")
    + 806            # If file empty or does not exists, download it from remote
    + 807            if all_cat is None:
    + 808                # Load all Groups and save file locally
    + 809                all_cat = self._load_categories_from_provider(loading_stream_type)
    + 810                if all_cat is not None:
    + 811                    self._save_to_file(all_cat, f"all_groups_{loading_stream_type}.json")
    + 812            dt = timer() - start
    + 813
    + 814            # If we got the GROUPS data, show the statistics and load GROUPS
    + 815            if all_cat is not None:
    + 816                print(f"{self.name}: Loaded {len(all_cat)} {loading_stream_type} Groups in {dt:.3f} seconds")
    + 817                # Add GROUPS to dictionaries
    + 818
    + 819                # Add the catch-all-errors group
    + 820                if loading_stream_type == self.live_type:
    + 821                    self.groups.append(self.live_catch_all_group)
    + 822                elif loading_stream_type == self.vod_type:
    + 823                    self.groups.append(self.vod_catch_all_group)
    + 824                elif loading_stream_type == self.series_type:
    + 825                    self.groups.append(self.series_catch_all_group)
      826
    - 827                skipped_adult_content = 0
    - 828                skipped_no_name_content = 0
    - 829
    - 830                number_of_streams = len(all_streams)
    - 831                current_stream_number = 0
    - 832                # Calculate 1% of total number of streams
    - 833                # This is used to slow down the progress bar
    - 834                one_percent_number_of_streams = number_of_streams/100
    - 835                start = timer()
    - 836                for stream_channel in all_streams:
    - 837                    skip_stream = False
    - 838                    current_stream_number += 1
    - 839
    - 840                    # Show download progress every 1% of total number of streams
    - 841                    if current_stream_number < one_percent_number_of_streams:
    - 842                        progress(
    - 843                            current_stream_number,
    - 844                            number_of_streams,
    - 845                            f"Processing {loading_stream_type} Streams"
    - 846                            )
    - 847                        one_percent_number_of_streams *= 2
    - 848
    - 849                    # Validate JSON scheme
    - 850                    if self.validate_json:
    - 851                        if loading_stream_type == self.series_type:
    - 852                            if not schemaValidator(stream_channel, SchemaType.SERIES_INFO):
    - 853                                print(stream_channel)
    - 854                        elif loading_stream_type == self.live_type:
    - 855                            if not schemaValidator(stream_channel, SchemaType.LIVE):
    - 856                                print(stream_channel)
    - 857                        else:
    - 858                            # vod_type
    - 859                            if not schemaValidator(stream_channel, SchemaType.VOD):
    - 860                                print(stream_channel)
    - 861
    - 862                    # Skip if the name of the stream is empty
    - 863                    if stream_channel["name"] == "":
    - 864                        skip_stream = True
    - 865                        skipped_no_name_content = skipped_no_name_content + 1
    - 866                        self._save_to_file_skipped_streams(stream_channel)
    - 867
    - 868                    # Skip if the user chose to hide adult streams
    - 869                    if self.hide_adult_content and loading_stream_type == self.live_type:
    - 870                        if "is_adult" in stream_channel:
    - 871                            if stream_channel["is_adult"] == "1":
    - 872                                skip_stream = True
    - 873                                skipped_adult_content = skipped_adult_content + 1
    - 874                                self._save_to_file_skipped_streams(stream_channel)
    - 875
    - 876                    if not skip_stream:
    - 877                        # Some channels have no group,
    - 878                        # so let's add them to the catch all group
    - 879                        if stream_channel["category_id"] == "":
    - 880                            stream_channel["category_id"] = "9999"
    - 881                        elif stream_channel["category_id"] != "1":
    - 882                            pass
    - 883
    - 884                        # Find the first occurence of the group that the
    - 885                        # Channel or Stream is pointing to
    - 886                        the_group = next(
    - 887                            (x for x in self.groups if x.group_id == int(stream_channel["category_id"])),
    - 888                            None
    - 889                        )
    - 890
    - 891                        # Set group title
    - 892                        if the_group is not None:
    - 893                            group_title = the_group.name
    - 894                        else:
    - 895                            if loading_stream_type == self.live_type:
    - 896                                group_title = self.live_catch_all_group.name
    - 897                                the_group = self.live_catch_all_group
    - 898                            elif loading_stream_type == self.vod_type:
    - 899                                group_title = self.vod_catch_all_group.name
    - 900                                the_group = self.vod_catch_all_group
    - 901                            elif loading_stream_type == self.series_type:
    - 902                                group_title = self.series_catch_all_group.name
    - 903                                the_group = self.series_catch_all_group
    - 904
    - 905
    - 906                        if loading_stream_type == self.series_type:
    - 907                            # Load all Series
    - 908                            new_series = Serie(self, stream_channel)
    - 909                            # To get all the Episodes for every Season of each
    - 910                            # Series is very time consuming, we will only
    - 911                            # populate the Series once the user click on the
    - 912                            # Series, the Seasons and Episodes will be loaded
    - 913                            # using x.getSeriesInfoByID() function
    - 914
    - 915                        else:
    - 916                            new_channel = Channel(
    - 917                                self,
    - 918                                group_title,
    - 919                                stream_channel
    - 920                            )
    - 921
    - 922                        if new_channel.group_id == "9999":
    - 923                            print(f" - xEverythingElse Channel -> {new_channel.name} - {new_channel.stream_type}")
    + 827                for cat_obj in all_cat:
    + 828                    if schemaValidator(cat_obj, SchemaType.GROUP):
    + 829                        # Create Group (Category)
    + 830                        new_group = Group(cat_obj, loading_stream_type)
    + 831                        #  Add to xtream class
    + 832                        self.groups.append(new_group)
    + 833                    else:
    + 834                        # Save what did not pass schema validation
    + 835                        print(cat_obj)
    + 836
    + 837                # Sort Categories
    + 838                self.groups.sort(key=lambda x: x.name)
    + 839            else:
    + 840                print(f" - Could not load {loading_stream_type} Groups")
    + 841                break
    + 842
    + 843            # Get Streams
    + 844
    + 845            # Try loading local file
    + 846            dt = 0
    + 847            start = timer()
    + 848            all_streams = self._load_from_file(f"all_stream_{loading_stream_type}.json")
    + 849            # If file empty or does not exists, download it from remote
    + 850            if all_streams is None:
    + 851                # Load all Streams and save file locally
    + 852                all_streams = self._load_streams_from_provider(loading_stream_type)
    + 853                self._save_to_file(all_streams, f"all_stream_{loading_stream_type}.json")
    + 854            dt = timer() - start
    + 855
    + 856            # If we got the STREAMS data, show the statistics and load Streams
    + 857            if all_streams is not None:
    + 858                print(f"{self.name}: Loaded {len(all_streams)} {loading_stream_type} Streams in {dt:.3f} seconds")
    + 859                # Add Streams to dictionaries
    + 860
    + 861                skipped_adult_content = 0
    + 862                skipped_no_name_content = 0
    + 863
    + 864                number_of_streams = len(all_streams)
    + 865                current_stream_number = 0
    + 866                # Calculate 1% of total number of streams
    + 867                # This is used to slow down the progress bar
    + 868                one_percent_number_of_streams = number_of_streams/100
    + 869                start = timer()
    + 870                for stream_channel in all_streams:
    + 871                    skip_stream = False
    + 872                    current_stream_number += 1
    + 873
    + 874                    # Show download progress every 1% of total number of streams
    + 875                    if current_stream_number < one_percent_number_of_streams:
    + 876                        progress(
    + 877                            current_stream_number,
    + 878                            number_of_streams,
    + 879                            f"Processing {loading_stream_type} Streams"
    + 880                            )
    + 881                        one_percent_number_of_streams *= 2
    + 882
    + 883                    # Validate JSON scheme
    + 884                    if self.validate_json:
    + 885                        if loading_stream_type == self.series_type:
    + 886                            if not schemaValidator(stream_channel, SchemaType.SERIES_INFO):
    + 887                                print(stream_channel)
    + 888                        elif loading_stream_type == self.live_type:
    + 889                            if not schemaValidator(stream_channel, SchemaType.LIVE):
    + 890                                print(stream_channel)
    + 891                        else:
    + 892                            # vod_type
    + 893                            if not schemaValidator(stream_channel, SchemaType.VOD):
    + 894                                print(stream_channel)
    + 895
    + 896                    # Skip if the name of the stream is empty
    + 897                    if stream_channel["name"] == "":
    + 898                        skip_stream = True
    + 899                        skipped_no_name_content = skipped_no_name_content + 1
    + 900                        self._save_to_file_skipped_streams(stream_channel)
    + 901
    + 902                    # Skip if the user chose to hide adult streams
    + 903                    if self.hide_adult_content and loading_stream_type == self.live_type:
    + 904                        if "is_adult" in stream_channel:
    + 905                            if stream_channel["is_adult"] == "1":
    + 906                                skip_stream = True
    + 907                                skipped_adult_content = skipped_adult_content + 1
    + 908                                self._save_to_file_skipped_streams(stream_channel)
    + 909
    + 910                    if not skip_stream:
    + 911                        # Some channels have no group,
    + 912                        # so let's add them to the catch all group
    + 913                        if not stream_channel["category_id"]:
    + 914                            stream_channel["category_id"] = "9999"
    + 915                        elif stream_channel["category_id"] != "1":
    + 916                            pass
    + 917
    + 918                        # Find the first occurrence of the group that the
    + 919                        # Channel or Stream is pointing to
    + 920                        the_group = next(
    + 921                            (x for x in self.groups if x.group_id == int(stream_channel["category_id"])),
    + 922                            None
    + 923                        )
      924
    - 925                        # Save the new channel to the local list of channels
    - 926                        if loading_stream_type == self.live_type:
    - 927                            self.channels.append(new_channel)
    - 928                        elif loading_stream_type == self.vod_type:
    - 929                            self.movies.append(new_channel)
    - 930                            if new_channel.age_days_from_added < 31:
    - 931                                self.movies_30days.append(new_channel)
    - 932                            if new_channel.age_days_from_added < 7:
    - 933                                self.movies_7days.append(new_channel)
    - 934                        else:
    - 935                            self.series.append(new_series)
    - 936
    - 937                        # Add stream to the specific Group
    - 938                        if the_group is not None:
    - 939                            if loading_stream_type != self.series_type:
    - 940                                the_group.channels.append(new_channel)
    - 941                            else:
    - 942                                the_group.series.append(new_series)
    - 943                        else:
    - 944                            print(f" - Group not found `{stream_channel['name']}`")
    - 945                print("\n")
    - 946                # Print information of which streams have been skipped
    - 947                if self.hide_adult_content:
    - 948                    print(f" - Skipped {skipped_adult_content} adult {loading_stream_type} streams")
    - 949                if skipped_no_name_content > 0:
    - 950                    print(f" - Skipped {skipped_no_name_content} "
    - 951                          "unprintable {loading_stream_type} streams")
    - 952            else:
    - 953                print(f" - Could not load {loading_stream_type} Streams")
    + 925                        # Set group title
    + 926                        if the_group is not None:
    + 927                            group_title = the_group.name
    + 928                        else:
    + 929                            if loading_stream_type == self.live_type:
    + 930                                group_title = self.live_catch_all_group.name
    + 931                                the_group = self.live_catch_all_group
    + 932                            elif loading_stream_type == self.vod_type:
    + 933                                group_title = self.vod_catch_all_group.name
    + 934                                the_group = self.vod_catch_all_group
    + 935                            elif loading_stream_type == self.series_type:
    + 936                                group_title = self.series_catch_all_group.name
    + 937                                the_group = self.series_catch_all_group
    + 938
    + 939                        if loading_stream_type == self.series_type:
    + 940                            # Load all Series
    + 941                            new_series = Serie(self, stream_channel)
    + 942                            # To get all the Episodes for every Season of each
    + 943                            # Series is very time consuming, we will only
    + 944                            # populate the Series once the user click on the
    + 945                            # Series, the Seasons and Episodes will be loaded
    + 946                            # using x.getSeriesInfoByID() function
    + 947
    + 948                        else:
    + 949                            new_channel = Channel(
    + 950                                self,
    + 951                                group_title,
    + 952                                stream_channel
    + 953                            )
      954
    - 955            self.state["loaded"] = True
    - 956
    - 957    def _save_to_file_skipped_streams(self, stream_channel: Channel):
    - 958
    - 959        # Build the full path
    - 960        full_filename = osp.join(self.cache_path, "skipped_streams.json")
    - 961
    - 962        # If the path makes sense, save the file
    - 963        json_data = json.dumps(stream_channel, ensure_ascii=False)
    - 964        try:
    - 965            with open(full_filename, mode="a", encoding="utf-8") as myfile:
    - 966                myfile.writelines(json_data)
    - 967            return True
    - 968        except Exception as e:
    - 969            print(f" - Could not save to skipped stream file `{full_filename}`: e=`{e}`")
    - 970        return False
    - 971
    - 972    def get_series_info_by_id(self, get_series: dict):
    - 973        """Get Seasons and Episodes for a Series
    - 974
    - 975        Args:
    - 976            get_series (dict): Series dictionary
    - 977        """
    - 978
    - 979        series_seasons = self._load_series_info_by_id_from_provider(get_series.series_id)
    - 980
    - 981        if series_seasons["seasons"] is None:
    - 982            series_seasons["seasons"] = [{"name": "Season 1", "cover": series_seasons["info"]["cover"]}]
    - 983
    - 984        for series_info in series_seasons["seasons"]:
    - 985            season_name = series_info["name"]
    - 986            season_key = series_info['season_number']
    - 987            season = Season(season_name)
    - 988            get_series.seasons[season_name] = season
    - 989            if "episodes" in series_seasons.keys():
    - 990                for series_season in series_seasons["episodes"].keys():
    - 991                    for episode_info in series_seasons["episodes"][str(series_season)]:
    - 992                        new_episode_channel = Episode(
    - 993                            self, series_info, "Testing", episode_info
    - 994                        )
    - 995                        season.episodes[episode_info["title"]] = new_episode_channel
    - 996
    - 997    def _handle_request_exception(self, exception: requests.exceptions.RequestException):
    - 998        """Handle different types of request exceptions."""
    - 999        if isinstance(exception, requests.exceptions.ConnectionError):
    -1000            print(" - Connection Error: Possible network problem \
    -1001                  (e.g. DNS failure, refused connection, etc)")
    -1002        elif isinstance(exception, requests.exceptions.HTTPError):
    -1003            print(" - HTTP Error")
    -1004        elif isinstance(exception, requests.exceptions.TooManyRedirects):
    -1005            print(" - TooManyRedirects")
    -1006        elif isinstance(exception, requests.exceptions.ReadTimeout):
    -1007            print(" - Timeout while loading data")
    -1008        else:
    -1009            print(f" - An unexpected error occurred: {exception}")
    -1010
    -1011    def _get_request(self, url: str, timeout: Tuple[int, int] = (2, 15)) -> Optional[dict]:
    -1012        """Generic GET Request with Error handling
    + 955                        if new_channel.group_id == "9999":
    + 956                            print(f" - xEverythingElse Channel -> {new_channel.name} - {new_channel.stream_type}")
    + 957
    + 958                        # Save the new channel to the local list of channels
    + 959                        if loading_stream_type == self.live_type:
    + 960                            self.channels.append(new_channel)
    + 961                        elif loading_stream_type == self.vod_type:
    + 962                            self.movies.append(new_channel)
    + 963                            if new_channel.age_days_from_added < 31:
    + 964                                self.movies_30days.append(new_channel)
    + 965                            if new_channel.age_days_from_added < 7:
    + 966                                self.movies_7days.append(new_channel)
    + 967                        else:
    + 968                            self.series.append(new_series)
    + 969
    + 970                        # Add stream to the specific Group
    + 971                        if the_group is not None:
    + 972                            if loading_stream_type != self.series_type:
    + 973                                the_group.channels.append(new_channel)
    + 974                            else:
    + 975                                the_group.series.append(new_series)
    + 976                        else:
    + 977                            print(f" - Group not found `{stream_channel['name']}`")
    + 978                print("\n")
    + 979                # Print information of which streams have been skipped
    + 980                if self.hide_adult_content:
    + 981                    print(f" - Skipped {skipped_adult_content} adult {loading_stream_type} streams")
    + 982                if skipped_no_name_content > 0:
    + 983                    print(f" - Skipped {skipped_no_name_content} "
    + 984                          "unprintable {loading_stream_type} streams")
    + 985            else:
    + 986                print(f" - Could not load {loading_stream_type} Streams")
    + 987
    + 988            self.state["loaded"] = True
    + 989        return True
    + 990
    + 991    def _save_to_file_skipped_streams(self, stream_channel: Channel):
    + 992
    + 993        # Build the full path
    + 994        full_filename = osp.join(self.cache_path, "skipped_streams.json")
    + 995
    + 996        # If the path makes sense, save the file
    + 997        json_data = json.dumps(stream_channel, ensure_ascii=False)
    + 998        try:
    + 999            with open(full_filename, mode="a", encoding="utf-8") as myfile:
    +1000                myfile.writelines(json_data)
    +1001                myfile.write('\n')
    +1002            return True
    +1003        except Exception as e:
    +1004            print(f" - Could not save to skipped stream file `{full_filename}`: e=`{e}`")
    +1005        return False
    +1006
    +1007    def get_series_info_by_id(self, get_series: dict):
    +1008        """Get Seasons and Episodes for a Series
    +1009
    +1010        Args:
    +1011            get_series (dict): Series dictionary
    +1012        """
     1013
    -1014        Args:
    -1015            URL (str): The URL where to GET content
    -1016            timeout (Tuple[int, int], optional): Connection and Downloading Timeout.
    -1017                                                 Defaults to (2,15).
    -1018
    -1019        Returns:
    -1020            Optional[dict]: JSON dictionary of the loaded data, or None
    -1021        """
    -1022        for attempt in range(10):
    -1023            time.sleep(1)
    -1024            try:
    -1025                response = requests.get(url, timeout=timeout, headers=self.connection_headers)
    -1026                response.raise_for_status()  # Raise an HTTPError for bad responses (4xx and 5xx)
    -1027                return response.json()
    -1028            except requests.exceptions.RequestException as e:
    -1029                self._handle_request_exception(e)
    -1030
    -1031        return None
    -1032        # i = 0
    -1033        # while i < 10:
    -1034        #     time.sleep(1)
    -1035        #     try:
    -1036        #         r = requests.get(url, timeout=timeout, headers=self.connection_headers)
    -1037        #         i = 20
    -1038        #         if r.status_code == 200:
    -1039        #             return r.json()
    -1040        #     except requests.exceptions.ConnectionError:
    -1041        #         print(" - Connection Error: Possible network problem (e.g. DNS failure, refused connection, etc)")
    -1042        #         i += 1
    -1043
    -1044        #     except requests.exceptions.HTTPError:
    -1045        #         print(" - HTTP Error")
    -1046        #         i += 1
    -1047
    -1048        #     except requests.exceptions.TooManyRedirects:
    -1049        #         print(" - TooManyRedirects")
    -1050        #         i += 1
    -1051
    -1052        #     except requests.exceptions.ReadTimeout:
    -1053        #         print(" - Timeout while loading data")
    -1054        #         i += 1
    -1055
    -1056        # return None
    -1057
    -1058    # GET Stream Categories
    -1059    def _load_categories_from_provider(self, stream_type: str):
    -1060        """Get from provider all category for specific stream type from provider
    -1061
    -1062        Args:
    -1063            stream_type (str): Stream type can be Live, VOD, Series
    -1064
    -1065        Returns:
    -1066            [type]: JSON if successfull, otherwise None
    -1067        """
    -1068        url = ""
    -1069        if stream_type == self.live_type:
    -1070            url = self.get_live_categories_URL()
    -1071        elif stream_type == self.vod_type:
    -1072            url = self.get_vod_cat_URL()
    -1073        elif stream_type == self.series_type:
    -1074            url = self.get_series_cat_URL()
    -1075        else:
    -1076            url = ""
    -1077
    -1078        return self._get_request(url)
    -1079
    -1080    # GET Streams
    -1081    def _load_streams_from_provider(self, stream_type: str):
    -1082        """Get from provider all streams for specific stream type
    +1014        series_seasons = self._load_series_info_by_id_from_provider(get_series.series_id)
    +1015
    +1016        if series_seasons["seasons"] is None:
    +1017            series_seasons["seasons"] = [
    +1018                {"name": "Season 1", "cover": series_seasons["info"]["cover"]}
    +1019                ]
    +1020
    +1021        for series_info in series_seasons["seasons"]:
    +1022            season_name = series_info["name"]
    +1023            season = Season(season_name)
    +1024            get_series.seasons[season_name] = season
    +1025            if "episodes" in series_seasons.keys():
    +1026                for series_season in series_seasons["episodes"].keys():
    +1027                    for episode_info in series_seasons["episodes"][str(series_season)]:
    +1028                        new_episode_channel = Episode(
    +1029                            self, series_info, "Testing", episode_info
    +1030                        )
    +1031                        season.episodes[episode_info["title"]] = new_episode_channel
    +1032
    +1033    def _handle_request_exception(self, exception: requests.exceptions.RequestException):
    +1034        """Handle different types of request exceptions."""
    +1035        if isinstance(exception, requests.exceptions.ConnectionError):
    +1036            print(" - Connection Error: Possible network problem \
    +1037                  (e.g. DNS failure, refused connection, etc)")
    +1038        elif isinstance(exception, requests.exceptions.HTTPError):
    +1039            print(" - HTTP Error")
    +1040        elif isinstance(exception, requests.exceptions.TooManyRedirects):
    +1041            print(" - TooManyRedirects")
    +1042        elif isinstance(exception, requests.exceptions.ReadTimeout):
    +1043            print(" - Timeout while loading data")
    +1044        else:
    +1045            print(f" - An unexpected error occurred: {exception}")
    +1046
    +1047    def _get_request(self, url: str, timeout: Tuple[int, int] = (2, 15)) -> Optional[dict]:
    +1048        """Generic GET Request with Error handling
    +1049
    +1050        Args:
    +1051            URL (str): The URL where to GET content
    +1052            timeout (Tuple[int, int], optional): Connection and Downloading Timeout.
    +1053                                                 Defaults to (2,15).
    +1054
    +1055        Returns:
    +1056            Optional[dict]: JSON dictionary of the loaded data, or None
    +1057        """
    +1058
    +1059        kb_size = 1024
    +1060        all_data = []
    +1061        down_stats = {"bytes": 0, "kbytes": 0, "mbytes": 0, "start": 0.0, "delta_sec": 0.0}
    +1062
    +1063        for attempt in range(10):
    +1064            try:
    +1065                response = requests.get(
    +1066                    url,
    +1067                    stream=True,
    +1068                    timeout=timeout,
    +1069                    headers=self.connection_headers
    +1070                    )
    +1071                response.raise_for_status()  # Raise an HTTPError for bad responses (4xx and 5xx)
    +1072                break
    +1073            except requests.exceptions.RequestException as e:
    +1074                self._handle_request_exception(e)
    +1075                return None
    +1076
    +1077        # If there is an answer from the remote server
    +1078        if response.status_code in (200, 206):
    +1079            down_stats["start"] = time.perf_counter()
    +1080
    +1081            # Set downloaded size
    +1082            down_stats["bytes"] = 0
     1083
    -1084        Args:
    -1085            stream_type (str): Stream type can be Live, VOD, Series
    +1084            # Set stream blocks
    +1085            block_bytes = int(1*kb_size*kb_size)     # 4 MB
     1086
    -1087        Returns:
    -1088            [type]: JSON if successfull, otherwise None
    -1089        """
    -1090        url = ""
    -1091        if stream_type == self.live_type:
    -1092            url = self.get_live_streams_URL()
    -1093        elif stream_type == self.vod_type:
    -1094            url = self.get_vod_streams_URL()
    -1095        elif stream_type == self.series_type:
    -1096            url = self.get_series_URL()
    -1097        else:
    -1098            url = ""
    -1099
    -1100        return self._get_request(url)
    -1101
    -1102    # GET Streams by Category
    -1103    def _load_streams_by_category_from_provider(self, stream_type: str, category_id):
    -1104        """Get from provider all streams for specific stream type with category/group ID
    -1105
    -1106        Args:
    -1107            stream_type (str): Stream type can be Live, VOD, Series
    -1108            category_id ([type]): Category/Group ID.
    -1109
    -1110        Returns:
    -1111            [type]: JSON if successfull, otherwise None
    -1112        """
    -1113        url = ""
    -1114
    -1115        if stream_type == self.live_type:
    -1116            url = self.get_live_streams_URL_by_category(category_id)
    -1117        elif stream_type == self.vod_type:
    -1118            url = self.get_vod_streams_URL_by_category(category_id)
    -1119        elif stream_type == self.series_type:
    -1120            url = self.get_series_URL_by_category(category_id)
    -1121        else:
    -1122            url = ""
    -1123
    -1124        return self._get_request(url)
    -1125
    -1126    # GET SERIES Info
    -1127    def _load_series_info_by_id_from_provider(self, series_id: str):
    -1128        """Gets informations about a Serie
    -1129
    -1130        Args:
    -1131            series_id (str): Serie ID as described in Group
    +1087            # Grab data by block_bytes
    +1088            for data in response.iter_content(block_bytes, decode_unicode=False):
    +1089                down_stats["bytes"] += len(data)
    +1090                down_stats["kbytes"] = down_stats["bytes"]/kb_size
    +1091                down_stats["mbytes"] = down_stats["bytes"]/kb_size/kb_size
    +1092                down_stats["delta_sec"] = time.perf_counter() - down_stats["start"]
    +1093                download_speed_average = down_stats["kbytes"]//down_stats["delta_sec"]
    +1094                sys.stdout.write(
    +1095                    f'\rDownloading {down_stats["kbytes"]:.1f} MB at {download_speed_average:.0f} kB/s'
    +1096                    )
    +1097                sys.stdout.flush()
    +1098                all_data.append(data)
    +1099            print(" - Done")
    +1100            full_content = b''.join(all_data)
    +1101            return json.loads(full_content)
    +1102
    +1103        print(f"HTTP error {response.status_code} while retrieving from {url}")
    +1104
    +1105        return None
    +1106
    +1107    # GET Stream Categories
    +1108    def _load_categories_from_provider(self, stream_type: str):
    +1109        """Get from provider all category for specific stream type from provider
    +1110
    +1111        Args:
    +1112            stream_type (str): Stream type can be Live, VOD, Series
    +1113
    +1114        Returns:
    +1115            [type]: JSON if successful, otherwise None
    +1116        """
    +1117        url = ""
    +1118        if stream_type == self.live_type:
    +1119            url = self.get_live_categories_URL()
    +1120        elif stream_type == self.vod_type:
    +1121            url = self.get_vod_cat_URL()
    +1122        elif stream_type == self.series_type:
    +1123            url = self.get_series_cat_URL()
    +1124        else:
    +1125            url = ""
    +1126
    +1127        return self._get_request(url)
    +1128
    +1129    # GET Streams
    +1130    def _load_streams_from_provider(self, stream_type: str):
    +1131        """Get from provider all streams for specific stream type
     1132
    -1133        Returns:
    -1134            [type]: JSON if successfull, otherwise None
    -1135        """
    -1136        return self._get_request(self.get_series_info_URL_by_ID(series_id))
    -1137
    -1138    # The seasons array, might be filled or might be completely empty.
    -1139    # If it is not empty, it will contain the cover, overview and the air date
    -1140    # of the selected season.
    -1141    # In your APP if you want to display the series, you have to take that
    -1142    # from the episodes array.
    -1143
    -1144    # GET VOD Info
    -1145    def vodInfoByID(self, vod_id):
    -1146        return self._get_request(self.get_VOD_info_URL_by_ID(vod_id))
    -1147
    -1148    # GET short_epg for LIVE Streams (same as stalker portal,
    -1149    # prints the next X EPG that will play soon)
    -1150    def liveEpgByStream(self, stream_id):
    -1151        return self._get_request(self.get_live_epg_URL_by_stream(stream_id))
    -1152
    -1153    def liveEpgByStreamAndLimit(self, stream_id, limit):
    -1154        return self._get_request(self.get_live_epg_URL_by_stream_and_limit(stream_id, limit))
    -1155
    -1156    #  GET ALL EPG for LIVE Streams (same as stalker portal,
    -1157    # but it will print all epg listings regardless of the day)
    -1158    def allLiveEpgByStream(self, stream_id):
    -1159        return self._get_request(self.get_all_live_epg_URL_by_stream(stream_id))
    -1160
    -1161    # Full EPG List for all Streams
    -1162    def allEpg(self):
    -1163        return self._get_request(self.get_all_epg_URL())
    -1164
    -1165    ## URL-builder methods
    -1166    def get_live_categories_URL(self) -> str:
    -1167        return f"{self.base_url}&action=get_live_categories"
    -1168
    -1169    def get_live_streams_URL(self) -> str:
    -1170        return f"{self.base_url}&action=get_live_streams"
    -1171
    -1172    def get_live_streams_URL_by_category(self, category_id) -> str:
    -1173        return f"{self.base_url}&action=get_live_streams&category_id={category_id}"
    +1133        Args:
    +1134            stream_type (str): Stream type can be Live, VOD, Series
    +1135
    +1136        Returns:
    +1137            [type]: JSON if successful, otherwise None
    +1138        """
    +1139        url = ""
    +1140        if stream_type == self.live_type:
    +1141            url = self.get_live_streams_URL()
    +1142        elif stream_type == self.vod_type:
    +1143            url = self.get_vod_streams_URL()
    +1144        elif stream_type == self.series_type:
    +1145            url = self.get_series_URL()
    +1146        else:
    +1147            url = ""
    +1148
    +1149        return self._get_request(url)
    +1150
    +1151    # GET Streams by Category
    +1152    def _load_streams_by_category_from_provider(self, stream_type: str, category_id):
    +1153        """Get from provider all streams for specific stream type with category/group ID
    +1154
    +1155        Args:
    +1156            stream_type (str): Stream type can be Live, VOD, Series
    +1157            category_id ([type]): Category/Group ID.
    +1158
    +1159        Returns:
    +1160            [type]: JSON if successful, otherwise None
    +1161        """
    +1162        url = ""
    +1163
    +1164        if stream_type == self.live_type:
    +1165            url = self.get_live_streams_URL_by_category(category_id)
    +1166        elif stream_type == self.vod_type:
    +1167            url = self.get_vod_streams_URL_by_category(category_id)
    +1168        elif stream_type == self.series_type:
    +1169            url = self.get_series_URL_by_category(category_id)
    +1170        else:
    +1171            url = ""
    +1172
    +1173        return self._get_request(url)
     1174
    -1175    def get_vod_cat_URL(self) -> str:
    -1176        return f"{self.base_url}&action=get_vod_categories"
    -1177
    -1178    def get_vod_streams_URL(self) -> str:
    -1179        return f"{self.base_url}&action=get_vod_streams"
    -1180
    -1181    def get_vod_streams_URL_by_category(self, category_id) -> str:
    -1182        return f"{self.base_url}&action=get_vod_streams&category_id={category_id}"
    -1183
    -1184    def get_series_cat_URL(self) -> str:
    -1185        return f"{self.base_url}&action=get_series_categories"
    -1186
    -1187    def get_series_URL(self) -> str:
    -1188        return f"{self.base_url}&action=get_series"
    -1189
    -1190    def get_series_URL_by_category(self, category_id) -> str:
    -1191        return f"{self.base_url}&action=get_series&category_id={category_id}"
    -1192
    -1193    def get_series_info_URL_by_ID(self, series_id) -> str:
    -1194        return f"{self.base_url}&action=get_series_info&series_id={series_id}"
    -1195
    -1196    def get_VOD_info_URL_by_ID(self, vod_id) -> str:
    -1197        return f"{self.base_url}&action=get_vod_info&vod_id={vod_id}"
    -1198
    -1199    def get_live_epg_URL_by_stream(self, stream_id) -> str:
    -1200        return f"{self.base_url}&action=get_short_epg&stream_id={stream_id}"
    -1201
    -1202    def get_live_epg_URL_by_stream_and_limit(self, stream_id, limit) -> str:
    -1203        return f"{self.base_url}&action=get_short_epg&stream_id={stream_id}&limit={limit}"
    -1204
    -1205    def get_all_live_epg_URL_by_stream(self, stream_id) -> str:
    -1206        return f"{self.base_url}&action=get_simple_data_table&stream_id={stream_id}"
    -1207
    -1208    def get_all_epg_URL(self) -> str:
    -1209        return f"{self.server}/xmltv.php?username={self.username}&password={self.password}"
    +1175    # GET SERIES Info
    +1176    def _load_series_info_by_id_from_provider(self, series_id: str, return_type: str = "DICT"):
    +1177        """Gets information about a Serie
    +1178
    +1179        Args:
    +1180            series_id (str): Serie ID as described in Group
    +1181            return_type (str, optional): Output format, 'DICT' or 'JSON'. Defaults to "DICT".
    +1182
    +1183        Returns:
    +1184            [type]: JSON if successful, otherwise None
    +1185        """
    +1186        data = self._get_request(self.get_series_info_URL_by_ID(series_id))
    +1187        if return_type == "JSON":
    +1188            return json.dumps(data, ensure_ascii=False)
    +1189        return data
    +1190
    +1191    # The seasons array, might be filled or might be completely empty.
    +1192    # If it is not empty, it will contain the cover, overview and the air date
    +1193    # of the selected season.
    +1194    # In your APP if you want to display the series, you have to take that
    +1195    # from the episodes array.
    +1196
    +1197    # GET VOD Info
    +1198    def vodInfoByID(self, vod_id):
    +1199        return self._get_request(self.get_VOD_info_URL_by_ID(vod_id))
    +1200
    +1201    # GET short_epg for LIVE Streams (same as stalker portal,
    +1202    # prints the next X EPG that will play soon)
    +1203    def liveEpgByStream(self, stream_id):
    +1204        return self._get_request(self.get_live_epg_URL_by_stream(stream_id))
    +1205
    +1206    def liveEpgByStreamAndLimit(self, stream_id, limit):
    +1207        return self._get_request(self.get_live_epg_URL_by_stream_and_limit(stream_id, limit))
    +1208
    +1209    #  GET ALL EPG for LIVE Streams (same as stalker portal,
    +1210    # but it will print all epg listings regardless of the day)
    +1211    def allLiveEpgByStream(self, stream_id):
    +1212        return self._get_request(self.get_all_live_epg_URL_by_stream(stream_id))
    +1213
    +1214    # Full EPG List for all Streams
    +1215    def allEpg(self):
    +1216        return self._get_request(self.get_all_epg_URL())
    +1217
    +1218    # URL-builder methods
    +1219    def get_live_categories_URL(self) -> str:
    +1220        return f"{self.base_url}&action=get_live_categories"
    +1221
    +1222    def get_live_streams_URL(self) -> str:
    +1223        return f"{self.base_url}&action=get_live_streams"
    +1224
    +1225    def get_live_streams_URL_by_category(self, category_id) -> str:
    +1226        return f"{self.base_url}&action=get_live_streams&category_id={category_id}"
    +1227
    +1228    def get_vod_cat_URL(self) -> str:
    +1229        return f"{self.base_url}&action=get_vod_categories"
    +1230
    +1231    def get_vod_streams_URL(self) -> str:
    +1232        return f"{self.base_url}&action=get_vod_streams"
    +1233
    +1234    def get_vod_streams_URL_by_category(self, category_id) -> str:
    +1235        return f"{self.base_url}&action=get_vod_streams&category_id={category_id}"
    +1236
    +1237    def get_series_cat_URL(self) -> str:
    +1238        return f"{self.base_url}&action=get_series_categories"
    +1239
    +1240    def get_series_URL(self) -> str:
    +1241        return f"{self.base_url}&action=get_series"
    +1242
    +1243    def get_series_URL_by_category(self, category_id) -> str:
    +1244        return f"{self.base_url}&action=get_series&category_id={category_id}"
    +1245
    +1246    def get_series_info_URL_by_ID(self, series_id) -> str:
    +1247        return f"{self.base_url}&action=get_series_info&series_id={series_id}"
    +1248
    +1249    def get_VOD_info_URL_by_ID(self, vod_id) -> str:
    +1250        return f"{self.base_url}&action=get_vod_info&vod_id={vod_id}"
    +1251
    +1252    def get_live_epg_URL_by_stream(self, stream_id) -> str:
    +1253        return f"{self.base_url}&action=get_short_epg&stream_id={stream_id}"
    +1254
    +1255    def get_live_epg_URL_by_stream_and_limit(self, stream_id, limit) -> str:
    +1256        return f"{self.base_url}&action=get_short_epg&stream_id={stream_id}&limit={limit}"
    +1257
    +1258    def get_all_live_epg_URL_by_stream(self, stream_id) -> str:
    +1259        return f"{self.base_url}&action=get_simple_data_table&stream_id={stream_id}"
    +1260
    +1261    def get_all_epg_URL(self) -> str:
    +1262        return f"{self.server}/xmltv.php?username={self.username}&password={self.password}"
     
    @@ -3780,95 +3926,102 @@

    - XTream( provider_name: str, provider_username: str, provider_password: str, provider_url: str, headers: dict = None, hide_adult_content: bool = False, cache_path: str = '', reload_time_sec: int = 28800, validate_json: bool = False, debug_flask: bool = True) + XTream( provider_name: str, provider_username: str, provider_password: str, provider_url: str, headers: dict = None, hide_adult_content: bool = False, cache_path: str = '', reload_time_sec: int = 28800, validate_json: bool = False, enable_flask: bool = False, debug_flask: bool = True)
    -
    324    def __init__(
    -325        self,
    -326        provider_name: str,
    -327        provider_username: str,
    -328        provider_password: str,
    -329        provider_url: str,
    -330        headers: dict = None,
    -331        hide_adult_content: bool = False,
    -332        cache_path: str = "",
    -333        reload_time_sec: int = 60*60*8,
    -334        validate_json: bool = False,
    -335        debug_flask: bool = True
    -336        ):
    -337        """Initialize Xtream Class
    -338
    -339        Args:
    -340            provider_name     (str):            Name of the IPTV provider
    -341            provider_username (str):            User name of the IPTV provider
    -342            provider_password (str):            Password of the IPTV provider
    -343            provider_url      (str):            URL of the IPTV provider
    -344            headers           (dict):           Requests Headers
    -345            hide_adult_content(bool, optional): When `True` hide stream that are marked for adult
    -346            cache_path        (str, optional):  Location where to save loaded files.
    -347                                                Defaults to empty string.
    -348            reload_time_sec   (int, optional):  Number of seconds before automatic reloading
    -349                                                (-1 to turn it OFF)
    -350            debug_flask       (bool, optional): Enable the debug mode in Flask
    -351            validate_json     (bool, optional): Check Xtream API provided JSON for validity
    -352
    -353        Returns: XTream Class Instance
    -354
    -355        - Note 1: If it fails to authorize with provided username and password,
    -356                auth_data will be an empty dictionary.
    -357        - Note 2: The JSON validation option will take considerable amount of time and it should be 
    -358                  used only as a debug tool. The Xtream API JSON from the provider passes through a
    -359                  schema that represent the best available understanding of how the Xtream API 
    -360                  works.
    -361        """
    -362        self.server = provider_url
    -363        self.username = provider_username
    -364        self.password = provider_password
    -365        self.name = provider_name
    -366        self.cache_path = cache_path
    -367        self.hide_adult_content = hide_adult_content
    -368        self.threshold_time_sec = reload_time_sec
    -369        self.validate_json = validate_json
    -370
    -371        # get the pyxtream local path
    -372        self.app_fullpath = osp.dirname(osp.realpath(__file__))
    -373
    -374        # prepare location of local html template
    -375        self.html_template_folder = osp.join(self.app_fullpath,"html")
    -376
    -377        # if the cache_path is specified, test that it is a directory
    -378        if self.cache_path != "":
    -379            # If the cache_path is not a directory, clear it
    -380            if not osp.isdir(self.cache_path):
    -381                print(" - Cache Path is not a directory, using default '~/.xtream-cache/'")
    -382                self.cache_path == ""
    -383
    -384        # If the cache_path is still empty, use default
    -385        if self.cache_path == "":
    -386            self.cache_path = osp.expanduser("~/.xtream-cache/")
    -387            if not osp.isdir(self.cache_path):
    -388                makedirs(self.cache_path, exist_ok=True)
    -389            print(f"pyxtream cache path located at {self.cache_path}")
    -390
    -391        if headers is not None:
    -392            self.connection_headers = headers
    -393        else:
    -394            self.connection_headers = {'User-Agent':"Wget/1.20.3 (linux-gnu)"}
    -395
    -396        self.authenticate()
    +            
    349    def __init__(
    +350        self,
    +351        provider_name: str,
    +352        provider_username: str,
    +353        provider_password: str,
    +354        provider_url: str,
    +355        headers: dict = None,
    +356        hide_adult_content: bool = False,
    +357        cache_path: str = "",
    +358        reload_time_sec: int = 60*60*8,
    +359        validate_json: bool = False,
    +360        enable_flask: bool = False,
    +361        debug_flask: bool = True
    +362            ):
    +363        """Initialize Xtream Class
    +364
    +365        Args:
    +366            provider_name     (str):            Name of the IPTV provider
    +367            provider_username (str):            User name of the IPTV provider
    +368            provider_password (str):            Password of the IPTV provider
    +369            provider_url      (str):            URL of the IPTV provider
    +370            headers           (dict):           Requests Headers
    +371            hide_adult_content(bool, optional): When `True` hide stream that are marked for adult
    +372            cache_path        (str, optional):  Location where to save loaded files.
    +373                                                Defaults to empty string.
    +374            reload_time_sec   (int, optional):  Number of seconds before automatic reloading
    +375                                                (-1 to turn it OFF)
    +376            validate_json     (bool, optional): Check Xtream API provided JSON for validity
    +377            enable_flask      (bool, optional): Enable Flask
    +378            debug_flask       (bool, optional): Enable the debug mode in Flask
    +379
    +380        Returns: XTream Class Instance
    +381
    +382        - Note 1: If it fails to authorize with provided username and password,
    +383                auth_data will be an empty dictionary.
    +384        - Note 2: The JSON validation option will take considerable amount of time and it should be
    +385                  used only as a debug tool. The Xtream API JSON from the provider passes through a
    +386                  schema that represent the best available understanding of how the Xtream API
    +387                  works.
    +388        """
    +389        self.server = provider_url
    +390        self.username = provider_username
    +391        self.password = provider_password
    +392        self.name = provider_name
    +393        self.cache_path = cache_path
    +394        self.hide_adult_content = hide_adult_content
    +395        self.threshold_time_sec = reload_time_sec
    +396        self.validate_json = validate_json
     397
    -398        if self.threshold_time_sec > 0:
    -399            print(f"Reload timer is ON and set to {self.threshold_time_sec} seconds")
    -400        else:
    -401            print("Reload timer is OFF")
    -402
    -403        if self.state['authenticated']:
    -404            if USE_FLASK:
    -405                self.flaskapp = FlaskWrap('pyxtream', self, self.html_template_folder, debug=debug_flask)
    -406                self.flaskapp.start()
    +398        # get the pyxtream local path
    +399        self.app_fullpath = osp.dirname(osp.realpath(__file__))
    +400
    +401        # prepare location of local html template
    +402        self.html_template_folder = osp.join(self.app_fullpath, "html")
    +403
    +404        # if the cache_path is specified, test that it is a directory
    +405        if self.cache_path != "":
    +406            # If the cache_path is not a directory, clear it
    +407            if not osp.isdir(self.cache_path):
    +408                print(" - Cache Path is not a directory, using default '~/.xtream-cache/'")
    +409                self.cache_path = ""
    +410
    +411        # If the cache_path is still empty, use default
    +412        if self.cache_path == "":
    +413            self.cache_path = osp.expanduser("~/.xtream-cache/")
    +414            if not osp.isdir(self.cache_path):
    +415                makedirs(self.cache_path, exist_ok=True)
    +416            print(f"pyxtream cache path located at {self.cache_path}")
    +417
    +418        if headers is not None:
    +419            self.connection_headers = headers
    +420        else:
    +421            self.connection_headers = {'User-Agent': "Wget/1.20.3 (linux-gnu)"}
    +422
    +423        self.authenticate()
    +424
    +425        if self.threshold_time_sec > 0:
    +426            print(f"Reload timer is ON and set to {self.threshold_time_sec} seconds")
    +427        else:
    +428            print("Reload timer is OFF")
    +429
    +430        if self.state['authenticated']:
    +431            if USE_FLASK and enable_flask:
    +432                print("Starting Web Interface")
    +433                self.flaskapp = FlaskWrap(
    +434                    'pyxtream', self, self.html_template_folder, debug=debug_flask
    +435                    )
    +436                self.flaskapp.start()
    +437            else:
    +438                print("Web interface not running")
     
    @@ -3885,17 +4038,18 @@

    Defaults to empty string. reload_time_sec (int, optional): Number of seconds before automatic reloading (-1 to turn it OFF) - debug_flask (bool, optional): Enable the debug mode in Flask - validate_json (bool, optional): Check Xtream API provided JSON for validity

    + validate_json (bool, optional): Check Xtream API provided JSON for validity + enable_flask (bool, optional): Enable Flask + debug_flask (bool, optional): Enable the debug mode in Flask

    Returns: XTream Class Instance

    • Note 1: If it fails to authorize with provided username and password, auth_data will be an empty dictionary.
    • -
    • Note 2: The JSON validation option will take considerable amount of time and it should be +
    • Note 2: The JSON validation option will take considerable amount of time and it should be used only as a debug tool. The Xtream API JSON from the provider passes through a -schema that represent the best available understanding of how the Xtream API +schema that represent the best available understanding of how the Xtream API works.

    @@ -3961,6 +4115,53 @@

    +

    +
    +
    + base_url = +'' + + +
    + + + + +
    +
    +
    + base_url_ssl = +'' + + +
    + + + + +
    +
    +
    + cache_path = +'' + + +
    + + + + +
    +
    +
    + account_expiration: datetime.timedelta + + +
    + + + +
    @@ -4013,7 +4214,7 @@

    authorization = -{} +{'username': '', 'password': ''}
    @@ -4178,24 +4379,26 @@

    -
    +
    - cache_path + validate_json: bool = +True
    - +
    -
    +
    - validate_json + download_progress: dict = +{'StreamId': 0, 'Total': 0, 'Progress': 0}
    - + @@ -4221,82 +4424,106 @@

    +

    +
    + +
    + + def + get_download_progress(self, stream_id: int = None): + + + +
    + +
    440    def get_download_progress(self, stream_id: int = None):
    +441        # TODO: Add check for stream specific ID
    +442        return json.dumps(self.download_progress)
    +
    + + + + +
    +
    + +
    + + def + get_last_7days(self): + + + +
    + +
    444    def get_last_7days(self):
    +445        return json.dumps(self.movies_7days, default=lambda x: x.export_json())
    +
    + + + +
    def - search_stream( self, keyword: str, ignore_case: bool = True, return_type: str = 'LIST', stream_type: list = ('series', 'movies', 'channels')) -> list: + search_stream( self, keyword: str, ignore_case: bool = True, return_type: str = 'LIST', stream_type: list = ('series', 'movies', 'channels'), added_after: datetime.datetime = None) -> list:
    -
    408    def search_stream(self, keyword: str,
    -409                      ignore_case: bool = True,
    -410                      return_type: str = "LIST",
    -411                      stream_type: list = ("series", "movies", "channels")) -> list:
    -412        """Search for streams
    -413
    -414        Args:
    -415            keyword (str): Keyword to search for. Supports REGEX
    -416            ignore_case (bool, optional): True to ignore case during search. Defaults to "True".
    -417            return_type (str, optional): Output format, 'LIST' or 'JSON'. Defaults to "LIST".
    -418            stream_type (list, optional): Search within specific stream type.
    -419
    -420        Returns:
    -421            list: List with all the results, it could be empty.
    -422        """
    -423
    -424        search_result = []
    -425        regex_flags = re.IGNORECASE if ignore_case else 0
    -426        regex = re.compile(keyword, regex_flags)
    -427        # if ignore_case:
    -428        #     regex = re.compile(keyword, re.IGNORECASE)
    -429        # else:
    -430        #     regex = re.compile(keyword)
    -431
    -432        # if "movies" in stream_type:
    -433        #     print(f"Checking {len(self.movies)} movies")
    -434        #     for stream in self.movies:
    -435        #         if re.match(regex, stream.name) is not None:
    -436        #             search_result.append(stream.export_json())
    -437
    -438        # if "channels" in stream_type:
    -439        #     print(f"Checking {len(self.channels)} channels")
    -440        #     for stream in self.channels:
    -441        #         if re.match(regex, stream.name) is not None:
    -442        #             search_result.append(stream.export_json())
    -443
    -444        # if "series" in stream_type:
    -445        #     print(f"Checking {len(self.series)} series")
    -446        #     for stream in self.series:
    -447        #         if re.match(regex, stream.name) is not None:
    -448        #             search_result.append(stream.export_json())
    -449
    -450        stream_collections = {
    -451            "movies": self.movies,
    -452            "channels": self.channels,
    -453            "series": self.series
    -454        }
    -455
    -456        for stream_type_name in stream_type:
    -457            if stream_type_name in stream_collections:
    -458                collection = stream_collections[stream_type_name]
    -459                print(f"Checking {len(collection)} {stream_type_name}")
    -460                for stream in collection:
    -461                    if re.match(regex, stream.name) is not None:
    -462                        search_result.append(stream.export_json())
    -463            else:
    -464                print(f"`{stream_type_name}` not found in collection")
    -465
    -466        if return_type == "JSON":
    -467            # if search_result is not None:
    -468            print(f"Found {len(search_result)} results `{keyword}`")
    -469            return json.dumps(search_result, ensure_ascii=False)
    -470
    -471        return search_result
    +            
    447    def search_stream(self, keyword: str,
    +448                      ignore_case: bool = True,
    +449                      return_type: str = "LIST",
    +450                      stream_type: list = ("series", "movies", "channels"),
    +451                      added_after: datetime = None) -> list:
    +452        """Search for streams
    +453
    +454        Args:
    +455            keyword (str): Keyword to search for. Supports REGEX
    +456            ignore_case (bool, optional): True to ignore case during search. Defaults to "True".
    +457            return_type (str, optional): Output format, 'LIST' or 'JSON'. Defaults to "LIST".
    +458            stream_type (list, optional): Search within specific stream type.
    +459            added_after (datetime, optional): Search for items that have been added after a certain date.
    +460
    +461        Returns:
    +462            list: List with all the results, it could be empty.
    +463        """
    +464
    +465        search_result = []
    +466        regex_flags = re.IGNORECASE if ignore_case else 0
    +467        regex = re.compile(keyword, regex_flags)
    +468
    +469        stream_collections = {
    +470            "movies": self.movies,
    +471            "channels": self.channels,
    +472            "series": self.series
    +473        }
    +474
    +475        for stream_type_name in stream_type:
    +476            if stream_type_name in stream_collections:
    +477                collection = stream_collections[stream_type_name]
    +478                print(f"Checking {len(collection)} {stream_type_name}")
    +479                for stream in collection:
    +480                    if stream.name and re.match(regex, stream.name) is not None:
    +481                        if added_after is None:
    +482                            # Add all matches
    +483                            search_result.append(stream.export_json())
    +484                        else:
    +485                            # Only add if it is more recent
    +486                            pass
    +487            else:
    +488                print(f"`{stream_type_name}` not found in collection")
    +489
    +490        if return_type == "JSON":
    +491            # if search_result is not None:
    +492            print(f"Found {len(search_result)} results `{keyword}`")
    +493            return json.dumps(search_result, ensure_ascii=False)
    +494
    +495        return search_result
     
    @@ -4306,7 +4533,8 @@

    keyword (str): Keyword to search for. Supports REGEX ignore_case (bool, optional): True to ignore case during search. Defaults to "True". return_type (str, optional): Output format, 'LIST' or 'JSON'. Defaults to "LIST". - stream_type (list, optional): Search within specific stream type.

    + stream_type (list, optional): Search within specific stream type. + added_after (datetime, optional): Search for items that have been added after a certain date.

    Returns: list: List with all the results, it could be empty.

    @@ -4325,37 +4553,42 @@

    -
    473    def download_video(self, stream_id: int) -> str:
    -474        """Download Video from Stream ID
    -475
    -476        Args:
    -477            stream_id (int): Stirng identifing the stream ID
    -478
    -479        Returns:
    -480            str: Absolute Path Filename where the file was saved. Empty if could not download
    -481        """
    -482        url = ""
    -483        filename = ""
    -484        for stream in self.movies:
    -485            if stream.id == stream_id:
    -486                url = stream.url
    -487                fn = f"{self._slugify(stream.name)}.{stream.raw['container_extension']}"
    -488                filename = osp.join(self.cache_path,fn)
    -489
    -490        # If the url was correctly built and file does not exists, start downloading
    -491        if url != "":
    -492            #if not osp.isfile(filename):
    -493            if not self._download_video_impl(url,filename):
    -494                return "Error"
    -495
    -496        return filename
    +            
    497    def download_video(self, stream_id: int) -> str:
    +498        """Download Video from Stream ID
    +499
    +500        Args:
    +501            stream_id (int): String identifying the stream ID
    +502
    +503        Returns:
    +504            str: Absolute Path Filename where the file was saved. Empty if could not download
    +505        """
    +506        url = ""
    +507        filename = ""
    +508        for series_stream in self.series:
    +509            if series_stream.series_id == stream_id:
    +510                episode_object: Episode = series_stream.episodes["1"]
    +511                url = f"{series_stream.url}/{episode_object.id}."\
    +512                      f"{episode_object.container_extension}"
    +513
    +514        for stream in self.movies:
    +515            if stream.id == stream_id:
    +516                url = stream.url
    +517                fn = f"{self._slugify(stream.name)}.{stream.raw['container_extension']}"
    +518                filename = osp.join(self.cache_path, fn)
    +519
    +520        # If the url was correctly built and file does not exists, start downloading
    +521        if url != "":
    +522            if not self._download_video_impl(url, filename):
    +523                return "Error"
    +524
    +525        return filename
     

    Download Video from Stream ID

    Args: - stream_id (int): Stirng identifing the stream ID

    + stream_id (int): String identifying the stream ID

    Returns: str: Absolute Path Filename where the file was saved. Empty if could not download

    @@ -4374,56 +4607,56 @@

    -
    615    def authenticate(self):
    -616        """Login to provider"""
    -617        # If we have not yet successfully authenticated, attempt authentication
    -618        if self.state["authenticated"] is False:
    -619            # Erase any previous data
    -620            self.auth_data = {}
    -621            # Loop through 30 seconds
    -622            i = 0
    -623            r = None
    -624            # Prepare the authentication url
    -625            url = f"{self.server}/player_api.php?username={self.username}&password={self.password}"
    -626            print("Attempting connection... ", end='')
    -627            while i < 30:
    -628                try:
    -629                    # Request authentication, wait 4 seconds maximum
    -630                    r = requests.get(url, timeout=(4), headers=self.connection_headers)
    -631                    i = 31
    -632                except requests.exceptions.ConnectionError:
    -633                    time.sleep(1)
    -634                    print(f"{i} ", end='',flush=True)
    -635                    i += 1
    -636
    -637            if r is not None:
    -638                # If the answer is ok, process data and change state
    -639                if r.ok:
    -640                    print("Connected")
    -641                    self.auth_data = r.json()
    -642                    self.authorization = {
    -643                        "username": self.auth_data["user_info"]["username"],
    -644                        "password": self.auth_data["user_info"]["password"]
    -645                    }
    -646                    # Account expiration date
    -647                    self.account_expiration = timedelta(
    -648                        seconds=(
    -649                            int(self.auth_data["user_info"]["exp_date"])-datetime.now().timestamp()
    -650                        )
    -651                    )
    -652                    # Mark connection authorized
    -653                    self.state["authenticated"] = True
    -654                    # Construct the base url for all requests
    -655                    self.base_url = f"{self.server}/player_api.php?username={self.username}&password={self.password}"
    -656                    # If there is a secure server connection, construct the base url SSL for all requests
    -657                    if "https_port" in self.auth_data["server_info"]:
    -658                        self.base_url_ssl = f"https://{self.auth_data['server_info']['url']}:{self.auth_data['server_info']['https_port']}" \
    -659                                            f"/player_api.php?username={self.username}&password={self.password}"
    -660                    print(f"Account expires in {str(self.account_expiration)}")
    -661                else:
    -662                    print(f"Provider `{self.name}` could not be loaded. Reason: `{r.status_code} {r.reason}`")
    -663            else:
    -664                print(f"\n{self.name}: Provider refused the connection")
    +            
    656    def authenticate(self):
    +657        """Login to provider"""
    +658        # If we have not yet successfully authenticated, attempt authentication
    +659        if self.state["authenticated"] is False:
    +660            # Erase any previous data
    +661            self.auth_data = {}
    +662            # Loop through 30 seconds
    +663            i = 0
    +664            r = None
    +665            # Prepare the authentication url
    +666            url = f"{self.server}/player_api.php?username={self.username}&password={self.password}"
    +667            print("Attempting connection... ", end='')
    +668            while i < 30:
    +669                try:
    +670                    # Request authentication, wait 4 seconds maximum
    +671                    r = requests.get(url, timeout=(4), headers=self.connection_headers)
    +672                    i = 31
    +673                except (requests.exceptions.ConnectionError, requests.exceptions.ReadTimeout):
    +674                    time.sleep(1)
    +675                    print(f"{i} ", end='', flush=True)
    +676                    i += 1
    +677
    +678            if r is not None:
    +679                # If the answer is ok, process data and change state
    +680                if r.ok:
    +681                    print("Connected")
    +682                    self.auth_data = r.json()
    +683                    self.authorization = {
    +684                        "username": self.auth_data["user_info"]["username"],
    +685                        "password": self.auth_data["user_info"]["password"]
    +686                    }
    +687                    # Account expiration date
    +688                    self.account_expiration = timedelta(
    +689                        seconds=(
    +690                            int(self.auth_data["user_info"]["exp_date"])-datetime.now().timestamp()
    +691                        )
    +692                    )
    +693                    # Mark connection authorized
    +694                    self.state["authenticated"] = True
    +695                    # Construct the base url for all requests
    +696                    self.base_url = f"{self.server}/player_api.php?username={self.username}&password={self.password}"
    +697                    # If there is a secure server connection, construct the base url SSL for all requests
    +698                    if "https_port" in self.auth_data["server_info"]:
    +699                        self.base_url_ssl = f"https://{self.auth_data['server_info']['url']}:{self.auth_data['server_info']['https_port']}" \
    +700                                            f"/player_api.php?username={self.username}&password={self.password}"
    +701                    print(f"Account expires in {str(self.account_expiration)}")
    +702                else:
    +703                    print(f"Provider `{self.name}` could not be loaded. Reason: `{r.status_code} {r.reason}`")
    +704            else:
    +705                print(f"\n{self.name}: Provider refused the connection")
     
    @@ -4443,221 +4676,230 @@

    -
    741    def load_iptv(self) -> bool:
    -742        """Load XTream IPTV
    -743
    -744        - Add all Live TV to XTream.channels
    -745        - Add all VOD to XTream.movies
    -746        - Add all Series to XTream.series
    -747          Series contains Seasons and Episodes. Those are not automatically
    -748          retrieved from the server to reduce the loading time.
    -749        - Add all groups to XTream.groups
    -750          Groups are for all three channel types, Live TV, VOD, and Series
    -751
    -752        Returns:
    -753            bool: True if successfull, False if error
    -754        """
    -755        # If pyxtream has not authenticated the connection, return empty
    -756        if self.state["authenticated"] is False:
    -757            print("Warning, cannot load steams since authorization failed")
    -758            return False
    -759
    -760        # If pyxtream has already loaded the data, skip and return success
    -761        if self.state["loaded"] is True:
    -762            print("Warning, data has already been loaded.")
    -763            return True
    -764
    -765        for loading_stream_type in (self.live_type, self.vod_type, self.series_type):
    -766            ## Get GROUPS
    -767
    -768            # Try loading local file
    -769            dt = 0
    -770            start = timer()
    -771            all_cat = self._load_from_file(f"all_groups_{loading_stream_type}.json")
    -772            # If file empty or does not exists, download it from remote
    -773            if all_cat is None:
    -774                # Load all Groups and save file locally
    -775                all_cat = self._load_categories_from_provider(loading_stream_type)
    -776                if all_cat is not None:
    -777                    self._save_to_file(all_cat,f"all_groups_{loading_stream_type}.json")
    -778            dt = timer() - start
    -779
    -780            # If we got the GROUPS data, show the statistics and load GROUPS
    -781            if all_cat is not None:
    -782                print(f"{self.name}: Loaded {len(all_cat)} {loading_stream_type} Groups in {dt:.3f} seconds")
    -783                ## Add GROUPS to dictionaries
    +            
    766    def load_iptv(self) -> bool:
    +767        """Load XTream IPTV
    +768
    +769        - Add all Live TV to XTream.channels
    +770        - Add all VOD to XTream.movies
    +771        - Add all Series to XTream.series
    +772          Series contains Seasons and Episodes. Those are not automatically
    +773          retrieved from the server to reduce the loading time.
    +774        - Add all groups to XTream.groups
    +775          Groups are for all three channel types, Live TV, VOD, and Series
    +776
    +777        Returns:
    +778            bool: True if successful, False if error
    +779        """
    +780        # If pyxtream has not authenticated the connection, return empty
    +781        if self.state["authenticated"] is False:
    +782            print("Warning, cannot load steams since authorization failed")
    +783            return False
     784
    -785                # Add the catch-all-errors group
    -786                if loading_stream_type == self.live_type:
    -787                    self.groups.append(self.live_catch_all_group)
    -788                elif loading_stream_type == self.vod_type:
    -789                    self.groups.append(self.vod_catch_all_group)
    -790                elif loading_stream_type == self.series_type:
    -791                    self.groups.append(self.series_catch_all_group)
    -792
    -793                for cat_obj in all_cat:
    -794                    if schemaValidator(cat_obj, SchemaType.GROUP):
    -795                        # Create Group (Category)
    -796                        new_group = Group(cat_obj, loading_stream_type)
    -797                        #  Add to xtream class
    -798                        self.groups.append(new_group)
    -799                    else:
    -800                        # Save what did not pass schema validation
    -801                        print(cat_obj)
    -802
    -803                # Sort Categories
    -804                self.groups.sort(key=lambda x: x.name)
    -805            else:
    -806                print(f" - Could not load {loading_stream_type} Groups")
    -807                break
    -808
    -809            ## Get Streams
    -810
    -811            # Try loading local file
    -812            dt = 0
    -813            start = timer()
    -814            all_streams = self._load_from_file(f"all_stream_{loading_stream_type}.json")
    -815            # If file empty or does not exists, download it from remote
    -816            if all_streams is None:
    -817                # Load all Streams and save file locally
    -818                all_streams = self._load_streams_from_provider(loading_stream_type)
    -819                self._save_to_file(all_streams,f"all_stream_{loading_stream_type}.json")
    -820            dt = timer() - start
    -821
    -822            # If we got the STREAMS data, show the statistics and load Streams
    -823            if all_streams is not None:
    -824                print(f"{self.name}: Loaded {len(all_streams)} {loading_stream_type} Streams in {dt:.3f} seconds")
    -825                ## Add Streams to dictionaries
    +785        # If pyxtream has already loaded the data, skip and return success
    +786        if self.state["loaded"] is True:
    +787            print("Warning, data has already been loaded.")
    +788            return True
    +789
    +790        # Delete skipped channels from cache
    +791        full_filename = osp.join(self.cache_path, "skipped_streams.json")
    +792        try:
    +793            f = open(full_filename, mode="r+", encoding="utf-8")
    +794            f.truncate(0)
    +795            f.close()
    +796        except FileNotFoundError:
    +797            pass
    +798
    +799        for loading_stream_type in (self.live_type, self.vod_type, self.series_type):
    +800            # Get GROUPS
    +801
    +802            # Try loading local file
    +803            dt = 0
    +804            start = timer()
    +805            all_cat = self._load_from_file(f"all_groups_{loading_stream_type}.json")
    +806            # If file empty or does not exists, download it from remote
    +807            if all_cat is None:
    +808                # Load all Groups and save file locally
    +809                all_cat = self._load_categories_from_provider(loading_stream_type)
    +810                if all_cat is not None:
    +811                    self._save_to_file(all_cat, f"all_groups_{loading_stream_type}.json")
    +812            dt = timer() - start
    +813
    +814            # If we got the GROUPS data, show the statistics and load GROUPS
    +815            if all_cat is not None:
    +816                print(f"{self.name}: Loaded {len(all_cat)} {loading_stream_type} Groups in {dt:.3f} seconds")
    +817                # Add GROUPS to dictionaries
    +818
    +819                # Add the catch-all-errors group
    +820                if loading_stream_type == self.live_type:
    +821                    self.groups.append(self.live_catch_all_group)
    +822                elif loading_stream_type == self.vod_type:
    +823                    self.groups.append(self.vod_catch_all_group)
    +824                elif loading_stream_type == self.series_type:
    +825                    self.groups.append(self.series_catch_all_group)
     826
    -827                skipped_adult_content = 0
    -828                skipped_no_name_content = 0
    -829
    -830                number_of_streams = len(all_streams)
    -831                current_stream_number = 0
    -832                # Calculate 1% of total number of streams
    -833                # This is used to slow down the progress bar
    -834                one_percent_number_of_streams = number_of_streams/100
    -835                start = timer()
    -836                for stream_channel in all_streams:
    -837                    skip_stream = False
    -838                    current_stream_number += 1
    -839
    -840                    # Show download progress every 1% of total number of streams
    -841                    if current_stream_number < one_percent_number_of_streams:
    -842                        progress(
    -843                            current_stream_number,
    -844                            number_of_streams,
    -845                            f"Processing {loading_stream_type} Streams"
    -846                            )
    -847                        one_percent_number_of_streams *= 2
    -848
    -849                    # Validate JSON scheme
    -850                    if self.validate_json:
    -851                        if loading_stream_type == self.series_type:
    -852                            if not schemaValidator(stream_channel, SchemaType.SERIES_INFO):
    -853                                print(stream_channel)
    -854                        elif loading_stream_type == self.live_type:
    -855                            if not schemaValidator(stream_channel, SchemaType.LIVE):
    -856                                print(stream_channel)
    -857                        else:
    -858                            # vod_type
    -859                            if not schemaValidator(stream_channel, SchemaType.VOD):
    -860                                print(stream_channel)
    -861
    -862                    # Skip if the name of the stream is empty
    -863                    if stream_channel["name"] == "":
    -864                        skip_stream = True
    -865                        skipped_no_name_content = skipped_no_name_content + 1
    -866                        self._save_to_file_skipped_streams(stream_channel)
    -867
    -868                    # Skip if the user chose to hide adult streams
    -869                    if self.hide_adult_content and loading_stream_type == self.live_type:
    -870                        if "is_adult" in stream_channel:
    -871                            if stream_channel["is_adult"] == "1":
    -872                                skip_stream = True
    -873                                skipped_adult_content = skipped_adult_content + 1
    -874                                self._save_to_file_skipped_streams(stream_channel)
    -875
    -876                    if not skip_stream:
    -877                        # Some channels have no group,
    -878                        # so let's add them to the catch all group
    -879                        if stream_channel["category_id"] == "":
    -880                            stream_channel["category_id"] = "9999"
    -881                        elif stream_channel["category_id"] != "1":
    -882                            pass
    -883
    -884                        # Find the first occurence of the group that the
    -885                        # Channel or Stream is pointing to
    -886                        the_group = next(
    -887                            (x for x in self.groups if x.group_id == int(stream_channel["category_id"])),
    -888                            None
    -889                        )
    -890
    -891                        # Set group title
    -892                        if the_group is not None:
    -893                            group_title = the_group.name
    -894                        else:
    -895                            if loading_stream_type == self.live_type:
    -896                                group_title = self.live_catch_all_group.name
    -897                                the_group = self.live_catch_all_group
    -898                            elif loading_stream_type == self.vod_type:
    -899                                group_title = self.vod_catch_all_group.name
    -900                                the_group = self.vod_catch_all_group
    -901                            elif loading_stream_type == self.series_type:
    -902                                group_title = self.series_catch_all_group.name
    -903                                the_group = self.series_catch_all_group
    -904
    -905
    -906                        if loading_stream_type == self.series_type:
    -907                            # Load all Series
    -908                            new_series = Serie(self, stream_channel)
    -909                            # To get all the Episodes for every Season of each
    -910                            # Series is very time consuming, we will only
    -911                            # populate the Series once the user click on the
    -912                            # Series, the Seasons and Episodes will be loaded
    -913                            # using x.getSeriesInfoByID() function
    -914
    -915                        else:
    -916                            new_channel = Channel(
    -917                                self,
    -918                                group_title,
    -919                                stream_channel
    -920                            )
    -921
    -922                        if new_channel.group_id == "9999":
    -923                            print(f" - xEverythingElse Channel -> {new_channel.name} - {new_channel.stream_type}")
    +827                for cat_obj in all_cat:
    +828                    if schemaValidator(cat_obj, SchemaType.GROUP):
    +829                        # Create Group (Category)
    +830                        new_group = Group(cat_obj, loading_stream_type)
    +831                        #  Add to xtream class
    +832                        self.groups.append(new_group)
    +833                    else:
    +834                        # Save what did not pass schema validation
    +835                        print(cat_obj)
    +836
    +837                # Sort Categories
    +838                self.groups.sort(key=lambda x: x.name)
    +839            else:
    +840                print(f" - Could not load {loading_stream_type} Groups")
    +841                break
    +842
    +843            # Get Streams
    +844
    +845            # Try loading local file
    +846            dt = 0
    +847            start = timer()
    +848            all_streams = self._load_from_file(f"all_stream_{loading_stream_type}.json")
    +849            # If file empty or does not exists, download it from remote
    +850            if all_streams is None:
    +851                # Load all Streams and save file locally
    +852                all_streams = self._load_streams_from_provider(loading_stream_type)
    +853                self._save_to_file(all_streams, f"all_stream_{loading_stream_type}.json")
    +854            dt = timer() - start
    +855
    +856            # If we got the STREAMS data, show the statistics and load Streams
    +857            if all_streams is not None:
    +858                print(f"{self.name}: Loaded {len(all_streams)} {loading_stream_type} Streams in {dt:.3f} seconds")
    +859                # Add Streams to dictionaries
    +860
    +861                skipped_adult_content = 0
    +862                skipped_no_name_content = 0
    +863
    +864                number_of_streams = len(all_streams)
    +865                current_stream_number = 0
    +866                # Calculate 1% of total number of streams
    +867                # This is used to slow down the progress bar
    +868                one_percent_number_of_streams = number_of_streams/100
    +869                start = timer()
    +870                for stream_channel in all_streams:
    +871                    skip_stream = False
    +872                    current_stream_number += 1
    +873
    +874                    # Show download progress every 1% of total number of streams
    +875                    if current_stream_number < one_percent_number_of_streams:
    +876                        progress(
    +877                            current_stream_number,
    +878                            number_of_streams,
    +879                            f"Processing {loading_stream_type} Streams"
    +880                            )
    +881                        one_percent_number_of_streams *= 2
    +882
    +883                    # Validate JSON scheme
    +884                    if self.validate_json:
    +885                        if loading_stream_type == self.series_type:
    +886                            if not schemaValidator(stream_channel, SchemaType.SERIES_INFO):
    +887                                print(stream_channel)
    +888                        elif loading_stream_type == self.live_type:
    +889                            if not schemaValidator(stream_channel, SchemaType.LIVE):
    +890                                print(stream_channel)
    +891                        else:
    +892                            # vod_type
    +893                            if not schemaValidator(stream_channel, SchemaType.VOD):
    +894                                print(stream_channel)
    +895
    +896                    # Skip if the name of the stream is empty
    +897                    if stream_channel["name"] == "":
    +898                        skip_stream = True
    +899                        skipped_no_name_content = skipped_no_name_content + 1
    +900                        self._save_to_file_skipped_streams(stream_channel)
    +901
    +902                    # Skip if the user chose to hide adult streams
    +903                    if self.hide_adult_content and loading_stream_type == self.live_type:
    +904                        if "is_adult" in stream_channel:
    +905                            if stream_channel["is_adult"] == "1":
    +906                                skip_stream = True
    +907                                skipped_adult_content = skipped_adult_content + 1
    +908                                self._save_to_file_skipped_streams(stream_channel)
    +909
    +910                    if not skip_stream:
    +911                        # Some channels have no group,
    +912                        # so let's add them to the catch all group
    +913                        if not stream_channel["category_id"]:
    +914                            stream_channel["category_id"] = "9999"
    +915                        elif stream_channel["category_id"] != "1":
    +916                            pass
    +917
    +918                        # Find the first occurrence of the group that the
    +919                        # Channel or Stream is pointing to
    +920                        the_group = next(
    +921                            (x for x in self.groups if x.group_id == int(stream_channel["category_id"])),
    +922                            None
    +923                        )
     924
    -925                        # Save the new channel to the local list of channels
    -926                        if loading_stream_type == self.live_type:
    -927                            self.channels.append(new_channel)
    -928                        elif loading_stream_type == self.vod_type:
    -929                            self.movies.append(new_channel)
    -930                            if new_channel.age_days_from_added < 31:
    -931                                self.movies_30days.append(new_channel)
    -932                            if new_channel.age_days_from_added < 7:
    -933                                self.movies_7days.append(new_channel)
    -934                        else:
    -935                            self.series.append(new_series)
    -936
    -937                        # Add stream to the specific Group
    -938                        if the_group is not None:
    -939                            if loading_stream_type != self.series_type:
    -940                                the_group.channels.append(new_channel)
    -941                            else:
    -942                                the_group.series.append(new_series)
    -943                        else:
    -944                            print(f" - Group not found `{stream_channel['name']}`")
    -945                print("\n")
    -946                # Print information of which streams have been skipped
    -947                if self.hide_adult_content:
    -948                    print(f" - Skipped {skipped_adult_content} adult {loading_stream_type} streams")
    -949                if skipped_no_name_content > 0:
    -950                    print(f" - Skipped {skipped_no_name_content} "
    -951                          "unprintable {loading_stream_type} streams")
    -952            else:
    -953                print(f" - Could not load {loading_stream_type} Streams")
    +925                        # Set group title
    +926                        if the_group is not None:
    +927                            group_title = the_group.name
    +928                        else:
    +929                            if loading_stream_type == self.live_type:
    +930                                group_title = self.live_catch_all_group.name
    +931                                the_group = self.live_catch_all_group
    +932                            elif loading_stream_type == self.vod_type:
    +933                                group_title = self.vod_catch_all_group.name
    +934                                the_group = self.vod_catch_all_group
    +935                            elif loading_stream_type == self.series_type:
    +936                                group_title = self.series_catch_all_group.name
    +937                                the_group = self.series_catch_all_group
    +938
    +939                        if loading_stream_type == self.series_type:
    +940                            # Load all Series
    +941                            new_series = Serie(self, stream_channel)
    +942                            # To get all the Episodes for every Season of each
    +943                            # Series is very time consuming, we will only
    +944                            # populate the Series once the user click on the
    +945                            # Series, the Seasons and Episodes will be loaded
    +946                            # using x.getSeriesInfoByID() function
    +947
    +948                        else:
    +949                            new_channel = Channel(
    +950                                self,
    +951                                group_title,
    +952                                stream_channel
    +953                            )
     954
    -955            self.state["loaded"] = True
    +955                        if new_channel.group_id == "9999":
    +956                            print(f" - xEverythingElse Channel -> {new_channel.name} - {new_channel.stream_type}")
    +957
    +958                        # Save the new channel to the local list of channels
    +959                        if loading_stream_type == self.live_type:
    +960                            self.channels.append(new_channel)
    +961                        elif loading_stream_type == self.vod_type:
    +962                            self.movies.append(new_channel)
    +963                            if new_channel.age_days_from_added < 31:
    +964                                self.movies_30days.append(new_channel)
    +965                            if new_channel.age_days_from_added < 7:
    +966                                self.movies_7days.append(new_channel)
    +967                        else:
    +968                            self.series.append(new_series)
    +969
    +970                        # Add stream to the specific Group
    +971                        if the_group is not None:
    +972                            if loading_stream_type != self.series_type:
    +973                                the_group.channels.append(new_channel)
    +974                            else:
    +975                                the_group.series.append(new_series)
    +976                        else:
    +977                            print(f" - Group not found `{stream_channel['name']}`")
    +978                print("\n")
    +979                # Print information of which streams have been skipped
    +980                if self.hide_adult_content:
    +981                    print(f" - Skipped {skipped_adult_content} adult {loading_stream_type} streams")
    +982                if skipped_no_name_content > 0:
    +983                    print(f" - Skipped {skipped_no_name_content} "
    +984                          "unprintable {loading_stream_type} streams")
    +985            else:
    +986                print(f" - Could not load {loading_stream_type} Streams")
    +987
    +988            self.state["loaded"] = True
    +989        return True
     
    @@ -4674,7 +4916,7 @@

    Returns: - bool: True if successfull, False if error

    + bool: True if successful, False if error

    @@ -4690,30 +4932,31 @@

    -
    972    def get_series_info_by_id(self, get_series: dict):
    -973        """Get Seasons and Episodes for a Series
    -974
    -975        Args:
    -976            get_series (dict): Series dictionary
    -977        """
    -978
    -979        series_seasons = self._load_series_info_by_id_from_provider(get_series.series_id)
    -980
    -981        if series_seasons["seasons"] is None:
    -982            series_seasons["seasons"] = [{"name": "Season 1", "cover": series_seasons["info"]["cover"]}]
    -983
    -984        for series_info in series_seasons["seasons"]:
    -985            season_name = series_info["name"]
    -986            season_key = series_info['season_number']
    -987            season = Season(season_name)
    -988            get_series.seasons[season_name] = season
    -989            if "episodes" in series_seasons.keys():
    -990                for series_season in series_seasons["episodes"].keys():
    -991                    for episode_info in series_seasons["episodes"][str(series_season)]:
    -992                        new_episode_channel = Episode(
    -993                            self, series_info, "Testing", episode_info
    -994                        )
    -995                        season.episodes[episode_info["title"]] = new_episode_channel
    +            
    1007    def get_series_info_by_id(self, get_series: dict):
    +1008        """Get Seasons and Episodes for a Series
    +1009
    +1010        Args:
    +1011            get_series (dict): Series dictionary
    +1012        """
    +1013
    +1014        series_seasons = self._load_series_info_by_id_from_provider(get_series.series_id)
    +1015
    +1016        if series_seasons["seasons"] is None:
    +1017            series_seasons["seasons"] = [
    +1018                {"name": "Season 1", "cover": series_seasons["info"]["cover"]}
    +1019                ]
    +1020
    +1021        for series_info in series_seasons["seasons"]:
    +1022            season_name = series_info["name"]
    +1023            season = Season(season_name)
    +1024            get_series.seasons[season_name] = season
    +1025            if "episodes" in series_seasons.keys():
    +1026                for series_season in series_seasons["episodes"].keys():
    +1027                    for episode_info in series_seasons["episodes"][str(series_season)]:
    +1028                        new_episode_channel = Episode(
    +1029                            self, series_info, "Testing", episode_info
    +1030                        )
    +1031                        season.episodes[episode_info["title"]] = new_episode_channel
     
    @@ -4736,8 +4979,8 @@

    -
    1145    def vodInfoByID(self, vod_id):
    -1146        return self._get_request(self.get_VOD_info_URL_by_ID(vod_id))
    +            
    1198    def vodInfoByID(self, vod_id):
    +1199        return self._get_request(self.get_VOD_info_URL_by_ID(vod_id))
     
    @@ -4755,8 +4998,8 @@

    -
    1150    def liveEpgByStream(self, stream_id):
    -1151        return self._get_request(self.get_live_epg_URL_by_stream(stream_id))
    +            
    1203    def liveEpgByStream(self, stream_id):
    +1204        return self._get_request(self.get_live_epg_URL_by_stream(stream_id))
     
    @@ -4774,8 +5017,8 @@

    -
    1153    def liveEpgByStreamAndLimit(self, stream_id, limit):
    -1154        return self._get_request(self.get_live_epg_URL_by_stream_and_limit(stream_id, limit))
    +            
    1206    def liveEpgByStreamAndLimit(self, stream_id, limit):
    +1207        return self._get_request(self.get_live_epg_URL_by_stream_and_limit(stream_id, limit))
     
    @@ -4793,8 +5036,8 @@

    -
    1158    def allLiveEpgByStream(self, stream_id):
    -1159        return self._get_request(self.get_all_live_epg_URL_by_stream(stream_id))
    +            
    1211    def allLiveEpgByStream(self, stream_id):
    +1212        return self._get_request(self.get_all_live_epg_URL_by_stream(stream_id))
     
    @@ -4812,8 +5055,8 @@

    -
    1162    def allEpg(self):
    -1163        return self._get_request(self.get_all_epg_URL())
    +            
    1215    def allEpg(self):
    +1216        return self._get_request(self.get_all_epg_URL())
     
    @@ -4831,8 +5074,8 @@

    -
    1166    def get_live_categories_URL(self) -> str:
    -1167        return f"{self.base_url}&action=get_live_categories"
    +            
    1219    def get_live_categories_URL(self) -> str:
    +1220        return f"{self.base_url}&action=get_live_categories"
     
    @@ -4850,8 +5093,8 @@

    -
    1169    def get_live_streams_URL(self) -> str:
    -1170        return f"{self.base_url}&action=get_live_streams"
    +            
    1222    def get_live_streams_URL(self) -> str:
    +1223        return f"{self.base_url}&action=get_live_streams"
     
    @@ -4869,8 +5112,8 @@

    -
    1172    def get_live_streams_URL_by_category(self, category_id) -> str:
    -1173        return f"{self.base_url}&action=get_live_streams&category_id={category_id}"
    +            
    1225    def get_live_streams_URL_by_category(self, category_id) -> str:
    +1226        return f"{self.base_url}&action=get_live_streams&category_id={category_id}"
     
    @@ -4888,8 +5131,8 @@

    -
    1175    def get_vod_cat_URL(self) -> str:
    -1176        return f"{self.base_url}&action=get_vod_categories"
    +            
    1228    def get_vod_cat_URL(self) -> str:
    +1229        return f"{self.base_url}&action=get_vod_categories"
     
    @@ -4907,8 +5150,8 @@

    -
    1178    def get_vod_streams_URL(self) -> str:
    -1179        return f"{self.base_url}&action=get_vod_streams"
    +            
    1231    def get_vod_streams_URL(self) -> str:
    +1232        return f"{self.base_url}&action=get_vod_streams"
     
    @@ -4926,8 +5169,8 @@

    -
    1181    def get_vod_streams_URL_by_category(self, category_id) -> str:
    -1182        return f"{self.base_url}&action=get_vod_streams&category_id={category_id}"
    +            
    1234    def get_vod_streams_URL_by_category(self, category_id) -> str:
    +1235        return f"{self.base_url}&action=get_vod_streams&category_id={category_id}"
     
    @@ -4945,8 +5188,8 @@

    -
    1184    def get_series_cat_URL(self) -> str:
    -1185        return f"{self.base_url}&action=get_series_categories"
    +            
    1237    def get_series_cat_URL(self) -> str:
    +1238        return f"{self.base_url}&action=get_series_categories"
     
    @@ -4964,8 +5207,8 @@

    -
    1187    def get_series_URL(self) -> str:
    -1188        return f"{self.base_url}&action=get_series"
    +            
    1240    def get_series_URL(self) -> str:
    +1241        return f"{self.base_url}&action=get_series"
     
    @@ -4983,8 +5226,8 @@

    -
    1190    def get_series_URL_by_category(self, category_id) -> str:
    -1191        return f"{self.base_url}&action=get_series&category_id={category_id}"
    +            
    1243    def get_series_URL_by_category(self, category_id) -> str:
    +1244        return f"{self.base_url}&action=get_series&category_id={category_id}"
     
    @@ -5002,8 +5245,8 @@

    -
    1193    def get_series_info_URL_by_ID(self, series_id) -> str:
    -1194        return f"{self.base_url}&action=get_series_info&series_id={series_id}"
    +            
    1246    def get_series_info_URL_by_ID(self, series_id) -> str:
    +1247        return f"{self.base_url}&action=get_series_info&series_id={series_id}"
     
    @@ -5021,8 +5264,8 @@

    -
    1196    def get_VOD_info_URL_by_ID(self, vod_id) -> str:
    -1197        return f"{self.base_url}&action=get_vod_info&vod_id={vod_id}"
    +            
    1249    def get_VOD_info_URL_by_ID(self, vod_id) -> str:
    +1250        return f"{self.base_url}&action=get_vod_info&vod_id={vod_id}"
     
    @@ -5040,8 +5283,8 @@

    -
    1199    def get_live_epg_URL_by_stream(self, stream_id) -> str:
    -1200        return f"{self.base_url}&action=get_short_epg&stream_id={stream_id}"
    +            
    1252    def get_live_epg_URL_by_stream(self, stream_id) -> str:
    +1253        return f"{self.base_url}&action=get_short_epg&stream_id={stream_id}"
     
    @@ -5059,8 +5302,8 @@

    -
    1202    def get_live_epg_URL_by_stream_and_limit(self, stream_id, limit) -> str:
    -1203        return f"{self.base_url}&action=get_short_epg&stream_id={stream_id}&limit={limit}"
    +            
    1255    def get_live_epg_URL_by_stream_and_limit(self, stream_id, limit) -> str:
    +1256        return f"{self.base_url}&action=get_short_epg&stream_id={stream_id}&limit={limit}"
     
    @@ -5078,8 +5321,8 @@

    -
    1205    def get_all_live_epg_URL_by_stream(self, stream_id) -> str:
    -1206        return f"{self.base_url}&action=get_simple_data_table&stream_id={stream_id}"
    +            
    1258    def get_all_live_epg_URL_by_stream(self, stream_id) -> str:
    +1259        return f"{self.base_url}&action=get_simple_data_table&stream_id={stream_id}"
     
    @@ -5097,8 +5340,8 @@

    -
    1208    def get_all_epg_URL(self) -> str:
    -1209        return f"{self.server}/xmltv.php?username={self.username}&password={self.password}"
    +            
    1261    def get_all_epg_URL(self) -> str:
    +1262        return f"{self.server}/xmltv.php?username={self.username}&password={self.password}"
     
    diff --git a/docs/pyxtream/rest_api.html b/docs/pyxtream/rest_api.html index bd528ce..0a10e49 100644 --- a/docs/pyxtream/rest_api.html +++ b/docs/pyxtream/rest_api.html @@ -36,6 +36,9 @@

    API Documentation

  • EndpointAction
  • +
  • + response +
  • function_name
  • @@ -105,91 +108,120 @@

    -
     1# Import Flask to control IPTV via REST API
    - 2from threading import Thread
    - 3
    - 4from flask import Flask
    - 5from flask import Response as FlaskResponse
    - 6from flask import request as FlaskRequest
    - 7import logging
    - 8from os import path
    - 9
    -10
    -11class EndpointAction(object):
    -12
    -13    def __init__(self, action, function_name):
    -14        self.function_name = function_name
    -15        self.action = action
    -16
    -17    def __call__(self, **args):
    -18
    -19        if args != {}:
    -20
    -21            #Stream Search
    -22            if self.function_name == "stream_search":
    -23                regex_term = r"^.*{}.*$".format(args['term'])
    -24                answer = self.action(regex_term,  return_type = 'JSON')
    -25
    -26            # Download stream
    -27            elif self.function_name == "download_stream":
    -28                answer = self.action(int(args['stream_id']))
    -29
    -30            else:
    -31                print(args)
    -32                answer = "Hello"
    -33
    -34            self.response = FlaskResponse(answer, status=200, headers={})
    -35            self.response.headers["Content-Type"] = "text/json; charset=utf-8"
    -36        else:
    -37            answer = self.action
    -38            self.response = FlaskResponse(answer, status=200, headers={})
    -39            self.response.headers["Content-Type"] = "text/html; charset=utf-8"
    -40
    -41        return self.response
    -42
    -43class FlaskWrap(Thread):
    -44
    -45    home_template = """
    -46<!DOCTYPE html><html lang="en"><head></head><body>pyxtream API</body></html>
    -47    """
    -48
    -49    host: str = ""
    -50    port: int = 0
    -51
    -52    def __init__(self, name, xtream: object, html_template_folder: str = None, host: str = "0.0.0.0", port: int = 5000, debug: bool = True):
    -53
    -54        log = logging.getLogger('werkzeug')
    -55        log.setLevel(logging.ERROR)
    -56
    -57        self.host = host
    -58        self.port = port
    -59        self.debug = debug
    -60
    -61        self.app = Flask(name)
    -62        self.xt = xtream
    -63        Thread.__init__(self)
    -64
    -65        # Configure Thread
    -66        self.name ="pyxtream REST API"
    -67        self.daemon = True
    -68
    -69        # Load HTML Home Template if any
    -70        if html_template_folder is not None:
    -71            self.home_template_file_name = path.join(html_template_folder,"index.html")
    -72            if path.isfile(self.home_template_file_name):
    -73                with open(self.home_template_file_name,'r', encoding="utf-8") as home_html:
    -74                    self.home_template = home_html.read()
    -75
    -76        # Add all endpoints
    -77        self.add_endpoint(endpoint='/', endpoint_name='home', handler=[self.home_template,""])
    -78        self.add_endpoint(endpoint='/stream_search/<term>', endpoint_name='stream_search', handler=[self.xt.search_stream,"stream_search"])
    -79        self.add_endpoint(endpoint='/download_stream/<stream_id>/', endpoint_name='download_stream', handler=[self.xt.download_video,"download_stream"])
    -80
    -81    def run(self):
    -82        self.app.run(debug=self.debug, use_reloader=False, host=self.host, port=self.port)
    -83
    -84    def add_endpoint(self, endpoint=None, endpoint_name=None, handler=None):
    -85        self.app.add_url_rule(endpoint, endpoint_name, EndpointAction(*handler))
    +                        
      1# Import Flask to control IPTV via REST API
    +  2from threading import Thread
    +  3import logging
    +  4from os import path
    +  5from flask import Flask
    +  6from flask import Response as FlaskResponse
    +  7
    +  8
    +  9class EndpointAction(object):
    + 10
    + 11    response: FlaskResponse
    + 12
    + 13    def __init__(self, action, function_name):
    + 14        self.function_name = function_name
    + 15        self.action = action
    + 16
    + 17    def __call__(self, **args):
    + 18        content_types = {
    + 19            'html': "text/html; charset=utf-8",
    + 20            'json': "text/json; charset=utf-8"
    + 21        }
    + 22
    + 23        handlers = {
    + 24            # Add handlers here
    + 25            "stream_search_generic": lambda: self._handle_search(args['term']),
    + 26            "stream_search_with_type": lambda: self._handle_search(args['term'], args.get('type')),
    + 27            "download_stream": lambda: self.action(int(args['stream_id'])),
    + 28            "get_download_progress": lambda: self.action(int(args['stream_id'])),
    + 29            "get_last_7days": lambda: self.action(),
    + 30            "home": lambda: self.action,
    + 31            "get_series": lambda: self.action(int(args['series_id']), "JSON")
    + 32        }
    + 33
    + 34        answer = handlers[self.function_name]()
    + 35        content_type = content_types['json'] if self.function_name not in ('home') else content_types['html']
    + 36
    + 37        self.response = FlaskResponse(answer, status=200, headers={"Content-Type": content_type})
    + 38        return self.response
    + 39
    + 40    def _handle_search(self, term, stream_type=None):
    + 41        regex_term = r"^.*{}.*$".format(term)
    + 42        if stream_type:
    + 43            stream_type = [stream_type] if stream_type else ("series", "movies", "channels")
    + 44            return self.action(regex_term, return_type='JSON', stream_type=stream_type)
    + 45        return self.action(regex_term, return_type='JSON')
    + 46
    + 47
    + 48class FlaskWrap(Thread):
    + 49
    + 50    home_template = """
    + 51<!DOCTYPE html><html lang="en"><head></head><body>pyxtream API</body></html>
    + 52    """
    + 53
    + 54    host: str = ""
    + 55    port: int = 0
    + 56
    + 57    def __init__(self, name, xtream: object, html_template_folder: str = None,
    + 58                 host: str = "0.0.0.0", port: int = 5000, debug: bool = True
    + 59                 ):
    + 60
    + 61        log = logging.getLogger('werkzeug')
    + 62        log.setLevel(logging.ERROR)
    + 63
    + 64        self.host = host
    + 65        self.port = port
    + 66        self.debug = debug
    + 67
    + 68        self.app = Flask(name)
    + 69        self.xt = xtream
    + 70        Thread.__init__(self)
    + 71
    + 72        # Configure Thread
    + 73        self.name = "pyxtream REST API"
    + 74        self.daemon = True
    + 75
    + 76        # Load HTML Home Template if any
    + 77        if html_template_folder is not None:
    + 78            self.home_template_file_name = path.join(html_template_folder, "index.html")
    + 79            if path.isfile(self.home_template_file_name):
    + 80                with open(self.home_template_file_name, 'r', encoding="utf-8") as home_html:
    + 81                    self.home_template = home_html.read()
    + 82
    + 83        # Add all endpoints
    + 84        self.add_endpoint(endpoint='/', endpoint_name='home', handler=[self.home_template, "home"])
    + 85        self.add_endpoint(endpoint='/stream_search/<term>',
    + 86                          endpoint_name='stream_search_generic',
    + 87                          handler=[self.xt.search_stream, 'stream_search_generic']
    + 88                          )
    + 89        self.add_endpoint(endpoint='/stream_search/<term>/<type>',
    + 90                          endpoint_name='stream_search_with_type',
    + 91                          handler=[self.xt.search_stream, 'stream_search_with_type']
    + 92                          )
    + 93        self.add_endpoint(endpoint='/download_stream/<stream_id>/',
    + 94                          endpoint_name='download_stream',
    + 95                          handler=[self.xt.download_video, "download_stream"]
    + 96                          )
    + 97        self.add_endpoint(endpoint='/get_download_progress/<stream_id>/',
    + 98                          endpoint_name='get_download_progress',
    + 99                          handler=[self.xt.get_download_progress, "get_download_progress"]
    +100                          )
    +101        self.add_endpoint(endpoint='/get_last_7days',
    +102                          endpoint_name='get_last_7days',
    +103                          handler=[self.xt.get_last_7days, "get_last_7days"]
    +104                          )
    +105        self.add_endpoint(endpoint='/get_series/<series_id>',
    +106                          endpoint_name='get_series',
    +107                          handler=[self.xt._load_series_info_by_id_from_provider, "get_series"]
    +108                          )
    +109
    +110    def run(self):
    +111        self.app.run(debug=self.debug, use_reloader=False, host=self.host, port=self.port)
    +112
    +113    def add_endpoint(self, endpoint=None, endpoint_name=None, handler=None):
    +114        self.app.add_url_rule(endpoint, endpoint_name, EndpointAction(*handler))
     
    @@ -205,37 +237,43 @@

    -
    13class EndpointAction(object):
    +            
    11class EndpointAction(object):
    +12
    +13    response: FlaskResponse
     14
    -15    def __init__(self, action, function_name):
    +15    def __init__(self, action, function_name):
     16        self.function_name = function_name
     17        self.action = action
     18
    -19    def __call__(self, **args):
    -20
    -21        if args != {}:
    -22
    -23            #Stream Search
    -24            if self.function_name == "stream_search":
    -25                regex_term = r"^.*{}.*$".format(args['term'])
    -26                answer = self.action(regex_term,  return_type = 'JSON')
    -27
    -28            # Download stream
    -29            elif self.function_name == "download_stream":
    -30                answer = self.action(int(args['stream_id']))
    -31
    -32            else:
    -33                print(args)
    -34                answer = "Hello"
    +19    def __call__(self, **args):
    +20        content_types = {
    +21            'html': "text/html; charset=utf-8",
    +22            'json': "text/json; charset=utf-8"
    +23        }
    +24
    +25        handlers = {
    +26            # Add handlers here
    +27            "stream_search_generic": lambda: self._handle_search(args['term']),
    +28            "stream_search_with_type": lambda: self._handle_search(args['term'], args.get('type')),
    +29            "download_stream": lambda: self.action(int(args['stream_id'])),
    +30            "get_download_progress": lambda: self.action(int(args['stream_id'])),
    +31            "get_last_7days": lambda: self.action(),
    +32            "home": lambda: self.action,
    +33            "get_series": lambda: self.action(int(args['series_id']), "JSON")
    +34        }
     35
    -36            self.response = FlaskResponse(answer, status=200, headers={})
    -37            self.response.headers["Content-Type"] = "text/json; charset=utf-8"
    -38        else:
    -39            answer = self.action
    -40            self.response = FlaskResponse(answer, status=200, headers={})
    -41            self.response.headers["Content-Type"] = "text/html; charset=utf-8"
    -42
    -43        return self.response
    +36        answer = handlers[self.function_name]()
    +37        content_type = content_types['json'] if self.function_name not in ('home') else content_types['html']
    +38
    +39        self.response = FlaskResponse(answer, status=200, headers={"Content-Type": content_type})
    +40        return self.response
    +41
    +42    def _handle_search(self, term, stream_type=None):
    +43        regex_term = r"^.*{}.*$".format(term)
    +44        if stream_type:
    +45            stream_type = [stream_type] if stream_type else ("series", "movies", "channels")
    +46            return self.action(regex_term, return_type='JSON', stream_type=stream_type)
    +47        return self.action(regex_term, return_type='JSON')
     
    @@ -251,7 +289,7 @@

    -
    15    def __init__(self, action, function_name):
    +            
    15    def __init__(self, action, function_name):
     16        self.function_name = function_name
     17        self.action = action
     
    @@ -259,6 +297,17 @@

    +

    +
    +
    + response: flask.wrappers.Response + + +
    + + + +
    @@ -294,49 +343,73 @@

    -
    45class FlaskWrap(Thread):
    -46
    -47    home_template = """
    -48<!DOCTYPE html><html lang="en"><head></head><body>pyxtream API</body></html>
    -49    """
    -50
    -51    host: str = ""
    -52    port: int = 0
    -53
    -54    def __init__(self, name, xtream: object, html_template_folder: str = None, host: str = "0.0.0.0", port: int = 5000, debug: bool = True):
    -55
    -56        log = logging.getLogger('werkzeug')
    -57        log.setLevel(logging.ERROR)
    -58
    -59        self.host = host
    -60        self.port = port
    -61        self.debug = debug
    -62
    -63        self.app = Flask(name)
    -64        self.xt = xtream
    -65        Thread.__init__(self)
    -66
    -67        # Configure Thread
    -68        self.name ="pyxtream REST API"
    -69        self.daemon = True
    -70
    -71        # Load HTML Home Template if any
    -72        if html_template_folder is not None:
    -73            self.home_template_file_name = path.join(html_template_folder,"index.html")
    -74            if path.isfile(self.home_template_file_name):
    -75                with open(self.home_template_file_name,'r', encoding="utf-8") as home_html:
    -76                    self.home_template = home_html.read()
    -77
    -78        # Add all endpoints
    -79        self.add_endpoint(endpoint='/', endpoint_name='home', handler=[self.home_template,""])
    -80        self.add_endpoint(endpoint='/stream_search/<term>', endpoint_name='stream_search', handler=[self.xt.search_stream,"stream_search"])
    -81        self.add_endpoint(endpoint='/download_stream/<stream_id>/', endpoint_name='download_stream', handler=[self.xt.download_video,"download_stream"])
    -82
    -83    def run(self):
    -84        self.app.run(debug=self.debug, use_reloader=False, host=self.host, port=self.port)
    -85
    -86    def add_endpoint(self, endpoint=None, endpoint_name=None, handler=None):
    -87        self.app.add_url_rule(endpoint, endpoint_name, EndpointAction(*handler))
    +            
     50class FlaskWrap(Thread):
    + 51
    + 52    home_template = """
    + 53<!DOCTYPE html><html lang="en"><head></head><body>pyxtream API</body></html>
    + 54    """
    + 55
    + 56    host: str = ""
    + 57    port: int = 0
    + 58
    + 59    def __init__(self, name, xtream: object, html_template_folder: str = None,
    + 60                 host: str = "0.0.0.0", port: int = 5000, debug: bool = True
    + 61                 ):
    + 62
    + 63        log = logging.getLogger('werkzeug')
    + 64        log.setLevel(logging.ERROR)
    + 65
    + 66        self.host = host
    + 67        self.port = port
    + 68        self.debug = debug
    + 69
    + 70        self.app = Flask(name)
    + 71        self.xt = xtream
    + 72        Thread.__init__(self)
    + 73
    + 74        # Configure Thread
    + 75        self.name = "pyxtream REST API"
    + 76        self.daemon = True
    + 77
    + 78        # Load HTML Home Template if any
    + 79        if html_template_folder is not None:
    + 80            self.home_template_file_name = path.join(html_template_folder, "index.html")
    + 81            if path.isfile(self.home_template_file_name):
    + 82                with open(self.home_template_file_name, 'r', encoding="utf-8") as home_html:
    + 83                    self.home_template = home_html.read()
    + 84
    + 85        # Add all endpoints
    + 86        self.add_endpoint(endpoint='/', endpoint_name='home', handler=[self.home_template, "home"])
    + 87        self.add_endpoint(endpoint='/stream_search/<term>',
    + 88                          endpoint_name='stream_search_generic',
    + 89                          handler=[self.xt.search_stream, 'stream_search_generic']
    + 90                          )
    + 91        self.add_endpoint(endpoint='/stream_search/<term>/<type>',
    + 92                          endpoint_name='stream_search_with_type',
    + 93                          handler=[self.xt.search_stream, 'stream_search_with_type']
    + 94                          )
    + 95        self.add_endpoint(endpoint='/download_stream/<stream_id>/',
    + 96                          endpoint_name='download_stream',
    + 97                          handler=[self.xt.download_video, "download_stream"]
    + 98                          )
    + 99        self.add_endpoint(endpoint='/get_download_progress/<stream_id>/',
    +100                          endpoint_name='get_download_progress',
    +101                          handler=[self.xt.get_download_progress, "get_download_progress"]
    +102                          )
    +103        self.add_endpoint(endpoint='/get_last_7days',
    +104                          endpoint_name='get_last_7days',
    +105                          handler=[self.xt.get_last_7days, "get_last_7days"]
    +106                          )
    +107        self.add_endpoint(endpoint='/get_series/<series_id>',
    +108                          endpoint_name='get_series',
    +109                          handler=[self.xt._load_series_info_by_id_from_provider, "get_series"]
    +110                          )
    +111
    +112    def run(self):
    +113        self.app.run(debug=self.debug, use_reloader=False, host=self.host, port=self.port)
    +114
    +115    def add_endpoint(self, endpoint=None, endpoint_name=None, handler=None):
    +116        self.app.add_url_rule(endpoint, endpoint_name, EndpointAction(*handler))
     
    @@ -358,34 +431,58 @@

    -
    54    def __init__(self, name, xtream: object, html_template_folder: str = None, host: str = "0.0.0.0", port: int = 5000, debug: bool = True):
    -55
    -56        log = logging.getLogger('werkzeug')
    -57        log.setLevel(logging.ERROR)
    -58
    -59        self.host = host
    -60        self.port = port
    -61        self.debug = debug
    -62
    -63        self.app = Flask(name)
    -64        self.xt = xtream
    -65        Thread.__init__(self)
    -66
    -67        # Configure Thread
    -68        self.name ="pyxtream REST API"
    -69        self.daemon = True
    -70
    -71        # Load HTML Home Template if any
    -72        if html_template_folder is not None:
    -73            self.home_template_file_name = path.join(html_template_folder,"index.html")
    -74            if path.isfile(self.home_template_file_name):
    -75                with open(self.home_template_file_name,'r', encoding="utf-8") as home_html:
    -76                    self.home_template = home_html.read()
    -77
    -78        # Add all endpoints
    -79        self.add_endpoint(endpoint='/', endpoint_name='home', handler=[self.home_template,""])
    -80        self.add_endpoint(endpoint='/stream_search/<term>', endpoint_name='stream_search', handler=[self.xt.search_stream,"stream_search"])
    -81        self.add_endpoint(endpoint='/download_stream/<stream_id>/', endpoint_name='download_stream', handler=[self.xt.download_video,"download_stream"])
    +            
     59    def __init__(self, name, xtream: object, html_template_folder: str = None,
    + 60                 host: str = "0.0.0.0", port: int = 5000, debug: bool = True
    + 61                 ):
    + 62
    + 63        log = logging.getLogger('werkzeug')
    + 64        log.setLevel(logging.ERROR)
    + 65
    + 66        self.host = host
    + 67        self.port = port
    + 68        self.debug = debug
    + 69
    + 70        self.app = Flask(name)
    + 71        self.xt = xtream
    + 72        Thread.__init__(self)
    + 73
    + 74        # Configure Thread
    + 75        self.name = "pyxtream REST API"
    + 76        self.daemon = True
    + 77
    + 78        # Load HTML Home Template if any
    + 79        if html_template_folder is not None:
    + 80            self.home_template_file_name = path.join(html_template_folder, "index.html")
    + 81            if path.isfile(self.home_template_file_name):
    + 82                with open(self.home_template_file_name, 'r', encoding="utf-8") as home_html:
    + 83                    self.home_template = home_html.read()
    + 84
    + 85        # Add all endpoints
    + 86        self.add_endpoint(endpoint='/', endpoint_name='home', handler=[self.home_template, "home"])
    + 87        self.add_endpoint(endpoint='/stream_search/<term>',
    + 88                          endpoint_name='stream_search_generic',
    + 89                          handler=[self.xt.search_stream, 'stream_search_generic']
    + 90                          )
    + 91        self.add_endpoint(endpoint='/stream_search/<term>/<type>',
    + 92                          endpoint_name='stream_search_with_type',
    + 93                          handler=[self.xt.search_stream, 'stream_search_with_type']
    + 94                          )
    + 95        self.add_endpoint(endpoint='/download_stream/<stream_id>/',
    + 96                          endpoint_name='download_stream',
    + 97                          handler=[self.xt.download_video, "download_stream"]
    + 98                          )
    + 99        self.add_endpoint(endpoint='/get_download_progress/<stream_id>/',
    +100                          endpoint_name='get_download_progress',
    +101                          handler=[self.xt.get_download_progress, "get_download_progress"]
    +102                          )
    +103        self.add_endpoint(endpoint='/get_last_7days',
    +104                          endpoint_name='get_last_7days',
    +105                          handler=[self.xt.get_last_7days, "get_last_7days"]
    +106                          )
    +107        self.add_endpoint(endpoint='/get_series/<series_id>',
    +108                          endpoint_name='get_series',
    +109                          handler=[self.xt._load_series_info_by_id_from_provider, "get_series"]
    +110                          )
     
    @@ -491,7 +588,7 @@

    1181    @property
    -1182    def name(self):
    +1182    def name(self):
     1183        """A string used for identification purposes only.
     1184
     1185        It has no semantics. Multiple threads may be given the same name. The
    @@ -521,7 +618,7 @@ 

    1235    @property
    -1236    def daemon(self):
    +1236    def daemon(self):
     1237        """A boolean value indicating whether this thread is a daemon thread.
     1238
     1239        This must be set before start() is called, otherwise RuntimeError is
    @@ -560,8 +657,8 @@ 

    -
    83    def run(self):
    -84        self.app.run(debug=self.debug, use_reloader=False, host=self.host, port=self.port)
    +            
    112    def run(self):
    +113        self.app.run(debug=self.debug, use_reloader=False, host=self.host, port=self.port)
     
    @@ -586,8 +683,8 @@

    -
    86    def add_endpoint(self, endpoint=None, endpoint_name=None, handler=None):
    -87        self.app.add_url_rule(endpoint, endpoint_name, EndpointAction(*handler))
    +            
    115    def add_endpoint(self, endpoint=None, endpoint_name=None, handler=None):
    +116        self.app.add_url_rule(endpoint, endpoint_name, EndpointAction(*handler))
     
    diff --git a/docs/pyxtream/schemaValidator.html b/docs/pyxtream/schemaValidator.html index 8dc3e2a..b238558 100644 --- a/docs/pyxtream/schemaValidator.html +++ b/docs/pyxtream/schemaValidator.html @@ -96,13 +96,13 @@

    -
      1from enum import Enum
    +                        
      1from enum import Enum
       2
    -  3from jsonschema import exceptions, validate
    +  3from jsonschema import exceptions, validate
       4
       5
       6# class syntax
    -  7class SchemaType(Enum):
    +  7class SchemaType(Enum):
       8    SERIES = 1
       9    SERIES_INFO = 2
      10    LIVE = 3
    @@ -110,291 +110,292 @@ 

    12 CHANNEL = 5 13 GROUP = 6 14 - 15series_schema = { - 16 "$schema": "https://json-schema.org/draft/2020-12/schema", - 17 "$id": "https://example.com/product.schema.json", - 18 "title": "Series", - 19 "description": "xtream API Series Schema", - 20 "type": "object", - 21 "properties": { - 22 "seasons": { - 23 "type": "array", - 24 "items": { - 25 "properties": { - 26 "air_date": { - 27 "type": "string", - 28 "format": "date" - 29 }, - 30 "episode_count": { "type": "integer" }, - 31 "id": { "type": "integer" }, - 32 "name": { "type": "string" }, - 33 "overview": { "type": "string" }, - 34 "season_number": { "type": "integer" }, - 35 "cover": { - 36 "type": "string", - 37 "format": "uri", - 38 "qt-uri-protocols": [ - 39 "http", - 40 "https" - 41 ] - 42 }, - 43 "cover_big": { - 44 "type": "string", - 45 "format": "uri", - 46 "qt-uri-protocols": [ - 47 "http", - 48 "https" - 49 ] - 50 }, - 51 }, - 52 "required": [ - 53 "id" - 54 ], - 55 "title": "Season" - 56 } - 57 }, - 58 "info": { - 59 "properties": { - 60 "name": { "type": "string" }, - 61 "cover": { - 62 "type": "string", - 63 "format": "uri", - 64 "qt-uri-protocols": [ - 65 "http", - 66 "https" - 67 ] - 68 }, - 69 "plot": { "type": "string" }, - 70 "cast": { "type": "string" }, - 71 "director": { "type": "string" }, - 72 "genre": { "type": "string" }, - 73 "releaseDate": { "type": "string", "format": "date" }, - 74 "last_modified": { "type": "string", "format": "integer" }, - 75 "rating": { "type": "string", "format": "integer" }, - 76 "rating_5based": { "type": "number" }, - 77 "backdrop_path": { - 78 "type": "array", - 79 "items": { - 80 "type": "string", - 81 "format": "uri", - 82 "qt-uri-protocols": [ - 83 "http", - 84 "https" - 85 ] - 86 } - 87 }, - 88 "youtube_trailed": { "type": "string" }, - 89 "episode_run_time": { "type": "string", "format": "integer" }, - 90 "category_id": { "type": "string", "format": "integer" } - 91 }, - 92 "required": [ - 93 "name" - 94 ], - 95 "title": "Info" - 96 }, - 97 "episodes": { - 98 "patternProperties": { - 99 r"^\d+$": { -100 "type": "array", -101 "items": { -102 "properties": { -103 "id": { "type": "string", "format": "integer" }, -104 "episode_num": {"type": "integer" }, -105 "title": { "type": "string" }, -106 "container_extension": { "type": "string" }, -107 "info": { -108 "type": "object", -109 "items": { -110 "plot": { "type": "string" } -111 } -112 }, -113 "customer_sid": { "type": "string" }, -114 "added": { "type": "string", "format": "integer" }, -115 "season": { "type": "integer" }, -116 "direct_source": { "type": "string" } -117 } -118 } -119 }, -120 } -121 } -122 }, -123 "required": [ -124 "info", -125 "seasons", -126 "episodes" -127 ] -128} -129series_info_schema = { -130 "$schema": "https://json-schema.org/draft/2020-12/schema", -131 "$id": "https://example.com/product.schema.json", -132 "title": "Series", -133 "description": "xtream API Series Info Schema", -134 "type": "object", -135 "properties": { -136 "name": { "type": "string" }, -137 "cover": { -138 "type": "string", -139 "format": "uri", -140 "qt-uri-protocols": [ -141 "http", -142 "https" -143 ] -144 }, -145 "plot": { "type": "string" }, -146 "cast": { "type": "string" }, -147 "director": { "type": "string" }, -148 "genre": { "type": "string" }, -149 "releaseDate": { "type": "string", "format": "date" }, -150 "last_modified": { "type": "string", "format": "integer" }, -151 "rating": { "type": "string", "format": "integer" }, -152 "rating_5based": { "type": "number" }, -153 "backdrop_path": { -154 "anyOf": [ -155 { -156 "type": "array", -157 "items": { -158 "type": "string", -159 "format": "uri", -160 "qt-uri-protocols": [ -161 "http", -162 "https" -163 ] -164 } -165 }, -166 {"type": "string"} -167 ] -168 }, -169 "youtube_trailed": { "type": "string" }, -170 "episode_run_time": { "type": "string", "format": "integer" }, -171 "category_id": { "type": "string", "format": "integer" } -172 }, -173 "required": [ -174 "name", -175 "category_id" -176 ] -177} -178live_schema = { -179 "$schema": "https://json-schema.org/draft/2020-12/schema", -180 "$id": "https://example.com/product.schema.json", -181 "title": "Live", -182 "description": "xtream API Live Schema", -183 "type": "object", -184 "properties": { -185 "num": { "type": "integer" }, -186 "name": { "type": "string" }, -187 "stream_type": { "type": "string" }, -188 "stream_id": { "type": "integer" }, -189 "stream_icon": { -190 "anyOf": [ -191 { -192 "type": "string", -193 "format": "uri", -194 "qt-uri-protocols": [ -195 "http", -196 "https" -197 ] -198 }, -199 { "type": "null" } -200 ] -201 }, -202 "epg_channel_id": { -203 "anyOf": [ -204 { "type": "null" }, -205 { "type": "string" } -206 ] -207 }, -208 "added": { "type": "string", "format": "integer" }, -209 "is_adult": { "type": "string", "format":"number" }, -210 "category_id": { "type": "string" }, -211 "custom_sid": { "type": "string" }, -212 "tv_archive": { "type": "number" }, -213 "direct_source": { "type": "string" }, -214 "tv_archive_duration":{ -215 "anyOf": [ -216 { "type": "number" }, -217 { "type": "string", "format": "integer" } -218 ] -219 } -220 } -221} -222vod_schema = { -223 "$schema": "https://json-schema.org/draft/2020-12/schema", -224 "$id": "https://example.com/product.schema.json", -225 "title": "VOD", -226 "description": "xtream API VOD Schema", -227 "type": "object", -228 "properties": { -229 "num": { "type": "integer" }, -230 "name": { "type": "string" }, -231 "stream_type": { "type": "string" }, -232 "stream_id": { "type": "integer" }, -233 "stream_icon": { -234 "anyOf": [ -235 { -236 "type": "string", -237 "format": "uri", -238 "qt-uri-protocols": [ -239 "http", -240 "https" -241 ] -242 }, -243 { "type": "null" } -244 ] -245 }, -246 "rating": { -247 "anyOf": [ -248 { "type": "null" }, -249 { "type": "string", "format": "integer" }, -250 { "type": "number" } -251 ] -252 }, -253 "rating_5based": { "type": "number" }, -254 "added": { "type": "string", "format": "integer" }, -255 "is_adult": { "type": "string", "format":"number" }, -256 "category_id": { "type": "string" }, -257 "container_extension": { "type": "string" }, -258 "custom_sid": { "type": "string" }, -259 "direct_source": { "type": "string" } -260 } -261} -262channel_schema = {} -263group_schema = { -264 "$schema": "https://json-schema.org/draft/2020-12/schema", -265 "$id": "https://example.com/product.schema.json", -266 "title": "Group", -267 "description": "xtream API Group Schema", -268 "type": "object", -269 "properties": { -270 "category_id": { "type": "string" }, -271 "category_name": { "type": "string" }, -272 "parent_id": { "type": "integer" } -273 } -274} -275 -276def schemaValidator(jsonData: str, schemaType: SchemaType) -> bool: + 15 + 16series_schema = { + 17 "$schema": "https://json-schema.org/draft/2020-12/schema", + 18 "$id": "https://example.com/product.schema.json", + 19 "title": "Series", + 20 "description": "xtream API Series Schema", + 21 "type": "object", + 22 "properties": { + 23 "seasons": { + 24 "type": "array", + 25 "items": { + 26 "properties": { + 27 "air_date": { + 28 "type": "string", + 29 "format": "date" + 30 }, + 31 "episode_count": {"type": "integer"}, + 32 "id": {"type": "integer"}, + 33 "name": {"type": "string"}, + 34 "overview": {"type": "string"}, + 35 "season_number": {"type": "integer"}, + 36 "cover": { + 37 "type": "string", + 38 "format": "uri", + 39 "qt-uri-protocols": [ + 40 "http", + 41 "https" + 42 ] + 43 }, + 44 "cover_big": { + 45 "type": "string", + 46 "format": "uri", + 47 "qt-uri-protocols": [ + 48 "http", + 49 "https" + 50 ] + 51 }, + 52 }, + 53 "required": [ + 54 "id" + 55 ], + 56 "title": "Season" + 57 } + 58 }, + 59 "info": { + 60 "properties": { + 61 "name": {"type": "string"}, + 62 "cover": { + 63 "type": "string", + 64 "format": "uri", + 65 "qt-uri-protocols": [ + 66 "http", + 67 "https" + 68 ] + 69 }, + 70 "plot": {"type": "string"}, + 71 "cast": {"type": "string"}, + 72 "director": {"type": "string"}, + 73 "genre": {"type": "string"}, + 74 "releaseDate": {"type": "string", "format": "date"}, + 75 "last_modified": {"type": "string", "format": "integer"}, + 76 "rating": {"type": "string", "format": "integer"}, + 77 "rating_5based": {"type": "number"}, + 78 "backdrop_path": { + 79 "type": "array", + 80 "items": { + 81 "type": "string", + 82 "format": "uri", + 83 "qt-uri-protocols": [ + 84 "http", + 85 "https" + 86 ] + 87 } + 88 }, + 89 "youtube_trailed": {"type": "string"}, + 90 "episode_run_time": {"type": "string", "format": "integer"}, + 91 "category_id": {"type": "string", "format": "integer"} + 92 }, + 93 "required": [ + 94 "name" + 95 ], + 96 "title": "Info" + 97 }, + 98 "episodes": { + 99 "patternProperties": { +100 r"^\d+$": { +101 "type": "array", +102 "items": { +103 "properties": { +104 "id": {"type": "string", "format": "integer"}, +105 "episode_num": {"type": "integer"}, +106 "title": {"type": "string"}, +107 "container_extension": {"type": "string"}, +108 "info": { +109 "type": "object", +110 "items": { +111 "plot": {"type": "string"} +112 } +113 }, +114 "customer_sid": {"type": "string"}, +115 "added": {"type": "string", "format": "integer"}, +116 "season": {"type": "integer"}, +117 "direct_source": {"type": "string"} +118 } +119 } +120 }, +121 } +122 } +123 }, +124 "required": [ +125 "info", +126 "seasons", +127 "episodes" +128 ] +129} +130series_info_schema = { +131 "$schema": "https://json-schema.org/draft/2020-12/schema", +132 "$id": "https://example.com/product.schema.json", +133 "title": "Series", +134 "description": "xtream API Series Info Schema", +135 "type": "object", +136 "properties": { +137 "name": {"type": "string"}, +138 "cover": { +139 "type": "string", +140 "format": "uri", +141 "qt-uri-protocols": [ +142 "http", +143 "https" +144 ] +145 }, +146 "plot": {"type": "string"}, +147 "cast": {"type": "string"}, +148 "director": {"type": "string"}, +149 "genre": {"type": "string"}, +150 "releaseDate": {"type": "string", "format": "date"}, +151 "last_modified": {"type": "string", "format": "integer"}, +152 "rating": {"type": "string", "format": "integer"}, +153 "rating_5based": {"type": "number"}, +154 "backdrop_path": { +155 "anyOf": [ +156 { +157 "type": "array", +158 "items": { +159 "type": "string", +160 "format": "uri", +161 "qt-uri-protocols": [ +162 "http", +163 "https" +164 ] +165 } +166 }, +167 {"type": "string"} +168 ] +169 }, +170 "youtube_trailed": {"type": "string"}, +171 "episode_run_time": {"type": "string", "format": "integer"}, +172 "category_id": {"type": "string", "format": "integer"} +173 }, +174 "required": [ +175 "name", +176 "category_id" +177 ] +178} +179live_schema = { +180 "$schema": "https://json-schema.org/draft/2020-12/schema", +181 "$id": "https://example.com/product.schema.json", +182 "title": "Live", +183 "description": "xtream API Live Schema", +184 "type": "object", +185 "properties": { +186 "num": {"type": "integer"}, +187 "name": {"type": "string"}, +188 "stream_type": {"type": "string"}, +189 "stream_id": {"type": "integer"}, +190 "stream_icon": { +191 "anyOf": [ +192 { +193 "type": "string", +194 "format": "uri", +195 "qt-uri-protocols": [ +196 "http", +197 "https" +198 ] +199 }, +200 {"type": "null"} +201 ] +202 }, +203 "epg_channel_id": { +204 "anyOf": [ +205 {"type": "null"}, +206 {"type": "string"} +207 ] +208 }, +209 "added": {"type": "string", "format": "integer"}, +210 "is_adult": {"type": "string", "format": "number"}, +211 "category_id": {"type": "string"}, +212 "custom_sid": {"type": "string"}, +213 "tv_archive": {"type": "number"}, +214 "direct_source": {"type": "string"}, +215 "tv_archive_duration": { +216 "anyOf": [ +217 {"type": "number"}, +218 {"type": "string", "format": "integer"} +219 ] +220 } +221 } +222} +223vod_schema = { +224 "$schema": "https://json-schema.org/draft/2020-12/schema", +225 "$id": "https://example.com/product.schema.json", +226 "title": "VOD", +227 "description": "xtream API VOD Schema", +228 "type": "object", +229 "properties": { +230 "num": {"type": "integer"}, +231 "name": {"type": "string"}, +232 "stream_type": {"type": "string"}, +233 "stream_id": {"type": "integer"}, +234 "stream_icon": { +235 "anyOf": [ +236 { +237 "type": "string", +238 "format": "uri", +239 "qt-uri-protocols": [ +240 "http", +241 "https" +242 ] +243 }, +244 {"type": "null"} +245 ] +246 }, +247 "rating": { +248 "anyOf": [ +249 {"type": "null"}, +250 {"type": "string", "format": "integer"}, +251 {"type": "number"} +252 ] +253 }, +254 "rating_5based": {"type": "number"}, +255 "added": {"type": "string", "format": "integer"}, +256 "is_adult": {"type": "string", "format": "number"}, +257 "category_id": {"type": "string"}, +258 "container_extension": {"type": "string"}, +259 "custom_sid": {"type": "string"}, +260 "direct_source": {"type": "string"} +261 } +262} +263channel_schema = {} +264group_schema = { +265 "$schema": "https://json-schema.org/draft/2020-12/schema", +266 "$id": "https://example.com/product.schema.json", +267 "title": "Group", +268 "description": "xtream API Group Schema", +269 "type": "object", +270 "properties": { +271 "category_id": {"type": "string"}, +272 "category_name": {"type": "string"}, +273 "parent_id": {"type": "integer"} +274 } +275} +276 277 -278 if (schemaType == SchemaType.SERIES): -279 json_schema = series_schema -280 elif (schemaType == SchemaType.SERIES_INFO): -281 json_schema = series_info_schema -282 elif (schemaType == SchemaType.LIVE): -283 json_schema = live_schema -284 elif (schemaType == SchemaType.VOD): -285 json_schema = vod_schema -286 elif (schemaType == SchemaType.CHANNEL): -287 json_schema = channel_schema -288 elif (schemaType == SchemaType.GROUP): -289 json_schema = group_schema -290 else: -291 json_schema = "{}" -292 -293 -294 try: -295 validate(instance=jsonData, schema=json_schema) -296 except exceptions.ValidationError as err: -297 print(err) -298 return False -299 return True +278def schemaValidator(jsonData: str, schemaType: SchemaType) -> bool: +279 +280 if (schemaType == SchemaType.SERIES): +281 json_schema = series_schema +282 elif (schemaType == SchemaType.SERIES_INFO): +283 json_schema = series_info_schema +284 elif (schemaType == SchemaType.LIVE): +285 json_schema = live_schema +286 elif (schemaType == SchemaType.VOD): +287 json_schema = vod_schema +288 elif (schemaType == SchemaType.CHANNEL): +289 json_schema = channel_schema +290 elif (schemaType == SchemaType.GROUP): +291 json_schema = group_schema +292 else: +293 json_schema = "{}" +294 +295 try: +296 validate(instance=jsonData, schema=json_schema) +297 except exceptions.ValidationError as err: +298 print(err) +299 return False +300 return True

    @@ -410,7 +411,7 @@

    -
     9class SchemaType(Enum):
    +            
     9class SchemaType(Enum):
     10    SERIES = 1
     11    SERIES_INFO = 2
     12    LIVE = 3
    @@ -583,30 +584,29 @@ 

    -
    278def schemaValidator(jsonData: str, schemaType: SchemaType) -> bool:
    -279
    -280    if (schemaType == SchemaType.SERIES):
    -281        json_schema = series_schema
    -282    elif (schemaType == SchemaType.SERIES_INFO):
    -283        json_schema = series_info_schema
    -284    elif (schemaType == SchemaType.LIVE):
    -285        json_schema = live_schema
    -286    elif (schemaType == SchemaType.VOD):
    -287        json_schema = vod_schema
    -288    elif (schemaType == SchemaType.CHANNEL):
    -289        json_schema = channel_schema
    -290    elif (schemaType == SchemaType.GROUP):
    -291        json_schema = group_schema
    -292    else:
    -293        json_schema = "{}"
    -294
    -295
    -296    try:
    -297        validate(instance=jsonData, schema=json_schema)
    -298    except exceptions.ValidationError as err:
    -299        print(err)
    -300        return False
    -301    return True
    +            
    280def schemaValidator(jsonData: str, schemaType: SchemaType) -> bool:
    +281
    +282    if (schemaType == SchemaType.SERIES):
    +283        json_schema = series_schema
    +284    elif (schemaType == SchemaType.SERIES_INFO):
    +285        json_schema = series_info_schema
    +286    elif (schemaType == SchemaType.LIVE):
    +287        json_schema = live_schema
    +288    elif (schemaType == SchemaType.VOD):
    +289        json_schema = vod_schema
    +290    elif (schemaType == SchemaType.CHANNEL):
    +291        json_schema = channel_schema
    +292    elif (schemaType == SchemaType.GROUP):
    +293        json_schema = group_schema
    +294    else:
    +295        json_schema = "{}"
    +296
    +297    try:
    +298        validate(instance=jsonData, schema=json_schema)
    +299    except exceptions.ValidationError as err:
    +300        print(err)
    +301        return False
    +302    return True
     
    diff --git a/docs/pyxtream/version.html b/docs/pyxtream/version.html index e224733..3e667c7 100644 --- a/docs/pyxtream/version.html +++ b/docs/pyxtream/version.html @@ -51,7 +51,7 @@

    -
    1__version__ = '0.7.1'
    +                        
    1__version__ = '0.7.3'
     2__author__ = 'Claudio Olmi'
     3__author_email__ = 'superolmo2@gmail.com'
     
    diff --git a/docs/search.js b/docs/search.js index fc41633..f638614 100644 --- a/docs/search.js +++ b/docs/search.js @@ -1,6 +1,6 @@ window.pdocSearch = (function(){ /** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o

    \n"}, "pyxtream.progress": {"fullname": "pyxtream.progress", "modulename": "pyxtream.progress", "kind": "module", "doc": "

    \n"}, "pyxtream.progress.progress": {"fullname": "pyxtream.progress.progress", "modulename": "pyxtream.progress", "qualname": "progress", "kind": "function", "doc": "

    \n", "signature": "(count, total, status=''):", "funcdef": "def"}, "pyxtream.pyxtream": {"fullname": "pyxtream.pyxtream", "modulename": "pyxtream.pyxtream", "kind": "module", "doc": "

    pyxtream

    \n\n

    Module handles downloading xtream data.

    \n\n

    Part of this content comes from

    \n\n\n\n
    \n

    _Author_: Claudio Olmi\n _Github_: superolmo

    \n
    \n\n
    \n

    _Note_: It does not support M3U

    \n
    \n"}, "pyxtream.pyxtream.Channel": {"fullname": "pyxtream.pyxtream.Channel", "modulename": "pyxtream.pyxtream", "qualname": "Channel", "kind": "class", "doc": "

    \n"}, "pyxtream.pyxtream.Channel.__init__": {"fullname": "pyxtream.pyxtream.Channel.__init__", "modulename": "pyxtream.pyxtream", "qualname": "Channel.__init__", "kind": "function", "doc": "

    \n", "signature": "(xtream: object, group_title, stream_info)"}, "pyxtream.pyxtream.Channel.info": {"fullname": "pyxtream.pyxtream.Channel.info", "modulename": "pyxtream.pyxtream", "qualname": "Channel.info", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.id": {"fullname": "pyxtream.pyxtream.Channel.id", "modulename": "pyxtream.pyxtream", "qualname": "Channel.id", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.name": {"fullname": "pyxtream.pyxtream.Channel.name", "modulename": "pyxtream.pyxtream", "qualname": "Channel.name", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.logo": {"fullname": "pyxtream.pyxtream.Channel.logo", "modulename": "pyxtream.pyxtream", "qualname": "Channel.logo", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.logo_path": {"fullname": "pyxtream.pyxtream.Channel.logo_path", "modulename": "pyxtream.pyxtream", "qualname": "Channel.logo_path", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.group_title": {"fullname": "pyxtream.pyxtream.Channel.group_title", "modulename": "pyxtream.pyxtream", "qualname": "Channel.group_title", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.title": {"fullname": "pyxtream.pyxtream.Channel.title", "modulename": "pyxtream.pyxtream", "qualname": "Channel.title", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.url": {"fullname": "pyxtream.pyxtream.Channel.url", "modulename": "pyxtream.pyxtream", "qualname": "Channel.url", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.stream_type": {"fullname": "pyxtream.pyxtream.Channel.stream_type", "modulename": "pyxtream.pyxtream", "qualname": "Channel.stream_type", "kind": "variable", "doc": "

    \n", "annotation": ": str", "default_value": "''"}, "pyxtream.pyxtream.Channel.group_id": {"fullname": "pyxtream.pyxtream.Channel.group_id", "modulename": "pyxtream.pyxtream", "qualname": "Channel.group_id", "kind": "variable", "doc": "

    \n", "annotation": ": str", "default_value": "''"}, "pyxtream.pyxtream.Channel.is_adult": {"fullname": "pyxtream.pyxtream.Channel.is_adult", "modulename": "pyxtream.pyxtream", "qualname": "Channel.is_adult", "kind": "variable", "doc": "

    \n", "annotation": ": int", "default_value": "0"}, "pyxtream.pyxtream.Channel.added": {"fullname": "pyxtream.pyxtream.Channel.added", "modulename": "pyxtream.pyxtream", "qualname": "Channel.added", "kind": "variable", "doc": "

    \n", "annotation": ": int", "default_value": "0"}, "pyxtream.pyxtream.Channel.epg_channel_id": {"fullname": "pyxtream.pyxtream.Channel.epg_channel_id", "modulename": "pyxtream.pyxtream", "qualname": "Channel.epg_channel_id", "kind": "variable", "doc": "

    \n", "annotation": ": str", "default_value": "''"}, "pyxtream.pyxtream.Channel.age_days_from_added": {"fullname": "pyxtream.pyxtream.Channel.age_days_from_added", "modulename": "pyxtream.pyxtream", "qualname": "Channel.age_days_from_added", "kind": "variable", "doc": "

    \n", "annotation": ": int", "default_value": "0"}, "pyxtream.pyxtream.Channel.date_now": {"fullname": "pyxtream.pyxtream.Channel.date_now", "modulename": "pyxtream.pyxtream", "qualname": "Channel.date_now", "kind": "variable", "doc": "

    \n", "annotation": ": datetime.datetime"}, "pyxtream.pyxtream.Channel.raw": {"fullname": "pyxtream.pyxtream.Channel.raw", "modulename": "pyxtream.pyxtream", "qualname": "Channel.raw", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.export_json": {"fullname": "pyxtream.pyxtream.Channel.export_json", "modulename": "pyxtream.pyxtream", "qualname": "Channel.export_json", "kind": "function", "doc": "

    \n", "signature": "(self):", "funcdef": "def"}, "pyxtream.pyxtream.Group": {"fullname": "pyxtream.pyxtream.Group", "modulename": "pyxtream.pyxtream", "qualname": "Group", "kind": "class", "doc": "

    \n"}, "pyxtream.pyxtream.Group.__init__": {"fullname": "pyxtream.pyxtream.Group.__init__", "modulename": "pyxtream.pyxtream", "qualname": "Group.__init__", "kind": "function", "doc": "

    \n", "signature": "(group_info: dict, stream_type: str)"}, "pyxtream.pyxtream.Group.name": {"fullname": "pyxtream.pyxtream.Group.name", "modulename": "pyxtream.pyxtream", "qualname": "Group.name", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Group.group_type": {"fullname": "pyxtream.pyxtream.Group.group_type", "modulename": "pyxtream.pyxtream", "qualname": "Group.group_type", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Group.group_id": {"fullname": "pyxtream.pyxtream.Group.group_id", "modulename": "pyxtream.pyxtream", "qualname": "Group.group_id", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Group.raw": {"fullname": "pyxtream.pyxtream.Group.raw", "modulename": "pyxtream.pyxtream", "qualname": "Group.raw", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"fullname": "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname", "modulename": "pyxtream.pyxtream", "qualname": "Group.convert_region_shortname_to_fullname", "kind": "function", "doc": "

    \n", "signature": "(self, shortname):", "funcdef": "def"}, "pyxtream.pyxtream.Group.channels": {"fullname": "pyxtream.pyxtream.Group.channels", "modulename": "pyxtream.pyxtream", "qualname": "Group.channels", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Group.series": {"fullname": "pyxtream.pyxtream.Group.series", "modulename": "pyxtream.pyxtream", "qualname": "Group.series", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Group.region_shortname": {"fullname": "pyxtream.pyxtream.Group.region_shortname", "modulename": "pyxtream.pyxtream", "qualname": "Group.region_shortname", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Group.region_longname": {"fullname": "pyxtream.pyxtream.Group.region_longname", "modulename": "pyxtream.pyxtream", "qualname": "Group.region_longname", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode": {"fullname": "pyxtream.pyxtream.Episode", "modulename": "pyxtream.pyxtream", "qualname": "Episode", "kind": "class", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.__init__": {"fullname": "pyxtream.pyxtream.Episode.__init__", "modulename": "pyxtream.pyxtream", "qualname": "Episode.__init__", "kind": "function", "doc": "

    \n", "signature": "(xtream: object, series_info, group_title, episode_info)"}, "pyxtream.pyxtream.Episode.title": {"fullname": "pyxtream.pyxtream.Episode.title", "modulename": "pyxtream.pyxtream", "qualname": "Episode.title", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Episode.name": {"fullname": "pyxtream.pyxtream.Episode.name", "modulename": "pyxtream.pyxtream", "qualname": "Episode.name", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Episode.info": {"fullname": "pyxtream.pyxtream.Episode.info", "modulename": "pyxtream.pyxtream", "qualname": "Episode.info", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Episode.raw": {"fullname": "pyxtream.pyxtream.Episode.raw", "modulename": "pyxtream.pyxtream", "qualname": "Episode.raw", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Episode.group_title": {"fullname": "pyxtream.pyxtream.Episode.group_title", "modulename": "pyxtream.pyxtream", "qualname": "Episode.group_title", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.id": {"fullname": "pyxtream.pyxtream.Episode.id", "modulename": "pyxtream.pyxtream", "qualname": "Episode.id", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.container_extension": {"fullname": "pyxtream.pyxtream.Episode.container_extension", "modulename": "pyxtream.pyxtream", "qualname": "Episode.container_extension", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.episode_number": {"fullname": "pyxtream.pyxtream.Episode.episode_number", "modulename": "pyxtream.pyxtream", "qualname": "Episode.episode_number", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.av_info": {"fullname": "pyxtream.pyxtream.Episode.av_info", "modulename": "pyxtream.pyxtream", "qualname": "Episode.av_info", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.logo": {"fullname": "pyxtream.pyxtream.Episode.logo", "modulename": "pyxtream.pyxtream", "qualname": "Episode.logo", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.logo_path": {"fullname": "pyxtream.pyxtream.Episode.logo_path", "modulename": "pyxtream.pyxtream", "qualname": "Episode.logo_path", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.url": {"fullname": "pyxtream.pyxtream.Episode.url", "modulename": "pyxtream.pyxtream", "qualname": "Episode.url", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Serie": {"fullname": "pyxtream.pyxtream.Serie", "modulename": "pyxtream.pyxtream", "qualname": "Serie", "kind": "class", "doc": "

    \n"}, "pyxtream.pyxtream.Serie.__init__": {"fullname": "pyxtream.pyxtream.Serie.__init__", "modulename": "pyxtream.pyxtream", "qualname": "Serie.__init__", "kind": "function", "doc": "

    \n", "signature": "(xtream: object, series_info)"}, "pyxtream.pyxtream.Serie.name": {"fullname": "pyxtream.pyxtream.Serie.name", "modulename": "pyxtream.pyxtream", "qualname": "Serie.name", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.logo": {"fullname": "pyxtream.pyxtream.Serie.logo", "modulename": "pyxtream.pyxtream", "qualname": "Serie.logo", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.logo_path": {"fullname": "pyxtream.pyxtream.Serie.logo_path", "modulename": "pyxtream.pyxtream", "qualname": "Serie.logo_path", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.series_id": {"fullname": "pyxtream.pyxtream.Serie.series_id", "modulename": "pyxtream.pyxtream", "qualname": "Serie.series_id", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.plot": {"fullname": "pyxtream.pyxtream.Serie.plot", "modulename": "pyxtream.pyxtream", "qualname": "Serie.plot", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.youtube_trailer": {"fullname": "pyxtream.pyxtream.Serie.youtube_trailer", "modulename": "pyxtream.pyxtream", "qualname": "Serie.youtube_trailer", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.genre": {"fullname": "pyxtream.pyxtream.Serie.genre", "modulename": "pyxtream.pyxtream", "qualname": "Serie.genre", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.raw": {"fullname": "pyxtream.pyxtream.Serie.raw", "modulename": "pyxtream.pyxtream", "qualname": "Serie.raw", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.xtream": {"fullname": "pyxtream.pyxtream.Serie.xtream", "modulename": "pyxtream.pyxtream", "qualname": "Serie.xtream", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Serie.seasons": {"fullname": "pyxtream.pyxtream.Serie.seasons", "modulename": "pyxtream.pyxtream", "qualname": "Serie.seasons", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Serie.episodes": {"fullname": "pyxtream.pyxtream.Serie.episodes", "modulename": "pyxtream.pyxtream", "qualname": "Serie.episodes", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Serie.export_json": {"fullname": "pyxtream.pyxtream.Serie.export_json", "modulename": "pyxtream.pyxtream", "qualname": "Serie.export_json", "kind": "function", "doc": "

    \n", "signature": "(self):", "funcdef": "def"}, "pyxtream.pyxtream.Season": {"fullname": "pyxtream.pyxtream.Season", "modulename": "pyxtream.pyxtream", "qualname": "Season", "kind": "class", "doc": "

    \n"}, "pyxtream.pyxtream.Season.__init__": {"fullname": "pyxtream.pyxtream.Season.__init__", "modulename": "pyxtream.pyxtream", "qualname": "Season.__init__", "kind": "function", "doc": "

    \n", "signature": "(name)"}, "pyxtream.pyxtream.Season.name": {"fullname": "pyxtream.pyxtream.Season.name", "modulename": "pyxtream.pyxtream", "qualname": "Season.name", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Season.episodes": {"fullname": "pyxtream.pyxtream.Season.episodes", "modulename": "pyxtream.pyxtream", "qualname": "Season.episodes", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.XTream": {"fullname": "pyxtream.pyxtream.XTream", "modulename": "pyxtream.pyxtream", "qualname": "XTream", "kind": "class", "doc": "

    \n"}, "pyxtream.pyxtream.XTream.__init__": {"fullname": "pyxtream.pyxtream.XTream.__init__", "modulename": "pyxtream.pyxtream", "qualname": "XTream.__init__", "kind": "function", "doc": "

    Initialize Xtream Class

    \n\n

    Args:\n provider_name (str): Name of the IPTV provider\n provider_username (str): User name of the IPTV provider\n provider_password (str): Password of the IPTV provider\n provider_url (str): URL of the IPTV provider\n headers (dict): Requests Headers\n hide_adult_content(bool, optional): When True hide stream that are marked for adult\n cache_path (str, optional): Location where to save loaded files.\n Defaults to empty string.\n reload_time_sec (int, optional): Number of seconds before automatic reloading\n (-1 to turn it OFF)\n debug_flask (bool, optional): Enable the debug mode in Flask\n validate_json (bool, optional): Check Xtream API provided JSON for validity

    \n\n

    Returns: XTream Class Instance

    \n\n
      \n
    • Note 1: If it fails to authorize with provided username and password,\nauth_data will be an empty dictionary.
    • \n
    • Note 2: The JSON validation option will take considerable amount of time and it should be \nused only as a debug tool. The Xtream API JSON from the provider passes through a\nschema that represent the best available understanding of how the Xtream API \nworks.
    • \n
    \n", "signature": "(\tprovider_name: str,\tprovider_username: str,\tprovider_password: str,\tprovider_url: str,\theaders: dict = None,\thide_adult_content: bool = False,\tcache_path: str = '',\treload_time_sec: int = 28800,\tvalidate_json: bool = False,\tdebug_flask: bool = True)"}, "pyxtream.pyxtream.XTream.name": {"fullname": "pyxtream.pyxtream.XTream.name", "modulename": "pyxtream.pyxtream", "qualname": "XTream.name", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.XTream.server": {"fullname": "pyxtream.pyxtream.XTream.server", "modulename": "pyxtream.pyxtream", "qualname": "XTream.server", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.XTream.secure_server": {"fullname": "pyxtream.pyxtream.XTream.secure_server", "modulename": "pyxtream.pyxtream", "qualname": "XTream.secure_server", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.XTream.username": {"fullname": "pyxtream.pyxtream.XTream.username", "modulename": "pyxtream.pyxtream", "qualname": "XTream.username", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.XTream.password": {"fullname": "pyxtream.pyxtream.XTream.password", "modulename": "pyxtream.pyxtream", "qualname": "XTream.password", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.XTream.live_type": {"fullname": "pyxtream.pyxtream.XTream.live_type", "modulename": "pyxtream.pyxtream", "qualname": "XTream.live_type", "kind": "variable", "doc": "

    \n", "default_value": "'Live'"}, "pyxtream.pyxtream.XTream.vod_type": {"fullname": "pyxtream.pyxtream.XTream.vod_type", "modulename": "pyxtream.pyxtream", "qualname": "XTream.vod_type", "kind": "variable", "doc": "

    \n", "default_value": "'VOD'"}, "pyxtream.pyxtream.XTream.series_type": {"fullname": "pyxtream.pyxtream.XTream.series_type", "modulename": "pyxtream.pyxtream", "qualname": "XTream.series_type", "kind": "variable", "doc": "

    \n", "default_value": "'Series'"}, "pyxtream.pyxtream.XTream.auth_data": {"fullname": "pyxtream.pyxtream.XTream.auth_data", "modulename": "pyxtream.pyxtream", "qualname": "XTream.auth_data", "kind": "variable", "doc": "

    \n", "default_value": "{}"}, "pyxtream.pyxtream.XTream.authorization": {"fullname": "pyxtream.pyxtream.XTream.authorization", "modulename": "pyxtream.pyxtream", "qualname": "XTream.authorization", "kind": "variable", "doc": "

    \n", "default_value": "{}"}, "pyxtream.pyxtream.XTream.groups": {"fullname": "pyxtream.pyxtream.XTream.groups", "modulename": "pyxtream.pyxtream", "qualname": "XTream.groups", "kind": "variable", "doc": "

    \n", "default_value": "[]"}, "pyxtream.pyxtream.XTream.channels": {"fullname": "pyxtream.pyxtream.XTream.channels", "modulename": "pyxtream.pyxtream", "qualname": "XTream.channels", "kind": "variable", "doc": "

    \n", "default_value": "[]"}, "pyxtream.pyxtream.XTream.series": {"fullname": "pyxtream.pyxtream.XTream.series", "modulename": "pyxtream.pyxtream", "qualname": "XTream.series", "kind": "variable", "doc": "

    \n", "default_value": "[]"}, "pyxtream.pyxtream.XTream.movies": {"fullname": "pyxtream.pyxtream.XTream.movies", "modulename": "pyxtream.pyxtream", "qualname": "XTream.movies", "kind": "variable", "doc": "

    \n", "default_value": "[]"}, "pyxtream.pyxtream.XTream.movies_30days": {"fullname": "pyxtream.pyxtream.XTream.movies_30days", "modulename": "pyxtream.pyxtream", "qualname": "XTream.movies_30days", "kind": "variable", "doc": "

    \n", "default_value": "[]"}, "pyxtream.pyxtream.XTream.movies_7days": {"fullname": "pyxtream.pyxtream.XTream.movies_7days", "modulename": "pyxtream.pyxtream", "qualname": "XTream.movies_7days", "kind": "variable", "doc": "

    \n", "default_value": "[]"}, "pyxtream.pyxtream.XTream.connection_headers": {"fullname": "pyxtream.pyxtream.XTream.connection_headers", "modulename": "pyxtream.pyxtream", "qualname": "XTream.connection_headers", "kind": "variable", "doc": "

    \n", "default_value": "{}"}, "pyxtream.pyxtream.XTream.state": {"fullname": "pyxtream.pyxtream.XTream.state", "modulename": "pyxtream.pyxtream", "qualname": "XTream.state", "kind": "variable", "doc": "

    \n", "default_value": "{'authenticated': False, 'loaded': False}"}, "pyxtream.pyxtream.XTream.hide_adult_content": {"fullname": "pyxtream.pyxtream.XTream.hide_adult_content", "modulename": "pyxtream.pyxtream", "qualname": "XTream.hide_adult_content", "kind": "variable", "doc": "

    \n", "default_value": "False"}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"fullname": "pyxtream.pyxtream.XTream.live_catch_all_group", "modulename": "pyxtream.pyxtream", "qualname": "XTream.live_catch_all_group", "kind": "variable", "doc": "

    \n", "default_value": "<pyxtream.pyxtream.Group object>"}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"fullname": "pyxtream.pyxtream.XTream.vod_catch_all_group", "modulename": "pyxtream.pyxtream", "qualname": "XTream.vod_catch_all_group", "kind": "variable", "doc": "

    \n", "default_value": "<pyxtream.pyxtream.Group object>"}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"fullname": "pyxtream.pyxtream.XTream.series_catch_all_group", "modulename": "pyxtream.pyxtream", "qualname": "XTream.series_catch_all_group", "kind": "variable", "doc": "

    \n", "default_value": "<pyxtream.pyxtream.Group object>"}, "pyxtream.pyxtream.XTream.threshold_time_sec": {"fullname": "pyxtream.pyxtream.XTream.threshold_time_sec", "modulename": "pyxtream.pyxtream", "qualname": "XTream.threshold_time_sec", "kind": "variable", "doc": "

    \n", "default_value": "-1"}, "pyxtream.pyxtream.XTream.cache_path": {"fullname": "pyxtream.pyxtream.XTream.cache_path", "modulename": "pyxtream.pyxtream", "qualname": "XTream.cache_path", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.XTream.validate_json": {"fullname": "pyxtream.pyxtream.XTream.validate_json", "modulename": "pyxtream.pyxtream", "qualname": "XTream.validate_json", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.XTream.app_fullpath": {"fullname": "pyxtream.pyxtream.XTream.app_fullpath", "modulename": "pyxtream.pyxtream", "qualname": "XTream.app_fullpath", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.XTream.html_template_folder": {"fullname": "pyxtream.pyxtream.XTream.html_template_folder", "modulename": "pyxtream.pyxtream", "qualname": "XTream.html_template_folder", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.XTream.search_stream": {"fullname": "pyxtream.pyxtream.XTream.search_stream", "modulename": "pyxtream.pyxtream", "qualname": "XTream.search_stream", "kind": "function", "doc": "

    Search for streams

    \n\n

    Args:\n keyword (str): Keyword to search for. Supports REGEX\n ignore_case (bool, optional): True to ignore case during search. Defaults to \"True\".\n return_type (str, optional): Output format, 'LIST' or 'JSON'. Defaults to \"LIST\".\n stream_type (list, optional): Search within specific stream type.

    \n\n

    Returns:\n list: List with all the results, it could be empty.

    \n", "signature": "(\tself,\tkeyword: str,\tignore_case: bool = True,\treturn_type: str = 'LIST',\tstream_type: list = ('series', 'movies', 'channels')) -> list:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.download_video": {"fullname": "pyxtream.pyxtream.XTream.download_video", "modulename": "pyxtream.pyxtream", "qualname": "XTream.download_video", "kind": "function", "doc": "

    Download Video from Stream ID

    \n\n

    Args:\n stream_id (int): Stirng identifing the stream ID

    \n\n

    Returns:\n str: Absolute Path Filename where the file was saved. Empty if could not download

    \n", "signature": "(self, stream_id: int) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.authenticate": {"fullname": "pyxtream.pyxtream.XTream.authenticate", "modulename": "pyxtream.pyxtream", "qualname": "XTream.authenticate", "kind": "function", "doc": "

    Login to provider

    \n", "signature": "(self):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.load_iptv": {"fullname": "pyxtream.pyxtream.XTream.load_iptv", "modulename": "pyxtream.pyxtream", "qualname": "XTream.load_iptv", "kind": "function", "doc": "

    Load XTream IPTV

    \n\n
      \n
    • Add all Live TV to XTream.channels
    • \n
    • Add all VOD to XTream.movies
    • \n
    • Add all Series to XTream.series\nSeries contains Seasons and Episodes. Those are not automatically\nretrieved from the server to reduce the loading time.
    • \n
    • Add all groups to XTream.groups\nGroups are for all three channel types, Live TV, VOD, and Series
    • \n
    \n\n

    Returns:\n bool: True if successfull, False if error

    \n", "signature": "(self) -> bool:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"fullname": "pyxtream.pyxtream.XTream.get_series_info_by_id", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_series_info_by_id", "kind": "function", "doc": "

    Get Seasons and Episodes for a Series

    \n\n

    Args:\n get_series (dict): Series dictionary

    \n", "signature": "(self, get_series: dict):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.vodInfoByID": {"fullname": "pyxtream.pyxtream.XTream.vodInfoByID", "modulename": "pyxtream.pyxtream", "qualname": "XTream.vodInfoByID", "kind": "function", "doc": "

    \n", "signature": "(self, vod_id):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"fullname": "pyxtream.pyxtream.XTream.liveEpgByStream", "modulename": "pyxtream.pyxtream", "qualname": "XTream.liveEpgByStream", "kind": "function", "doc": "

    \n", "signature": "(self, stream_id):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"fullname": "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit", "modulename": "pyxtream.pyxtream", "qualname": "XTream.liveEpgByStreamAndLimit", "kind": "function", "doc": "

    \n", "signature": "(self, stream_id, limit):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"fullname": "pyxtream.pyxtream.XTream.allLiveEpgByStream", "modulename": "pyxtream.pyxtream", "qualname": "XTream.allLiveEpgByStream", "kind": "function", "doc": "

    \n", "signature": "(self, stream_id):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.allEpg": {"fullname": "pyxtream.pyxtream.XTream.allEpg", "modulename": "pyxtream.pyxtream", "qualname": "XTream.allEpg", "kind": "function", "doc": "

    \n", "signature": "(self):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"fullname": "pyxtream.pyxtream.XTream.get_live_categories_URL", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_live_categories_URL", "kind": "function", "doc": "

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"fullname": "pyxtream.pyxtream.XTream.get_live_streams_URL", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_live_streams_URL", "kind": "function", "doc": "

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"fullname": "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_live_streams_URL_by_category", "kind": "function", "doc": "

    \n", "signature": "(self, category_id) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"fullname": "pyxtream.pyxtream.XTream.get_vod_cat_URL", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_vod_cat_URL", "kind": "function", "doc": "

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"fullname": "pyxtream.pyxtream.XTream.get_vod_streams_URL", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_vod_streams_URL", "kind": "function", "doc": "

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"fullname": "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_vod_streams_URL_by_category", "kind": "function", "doc": "

    \n", "signature": "(self, category_id) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"fullname": "pyxtream.pyxtream.XTream.get_series_cat_URL", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_series_cat_URL", "kind": "function", "doc": "

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_series_URL": {"fullname": "pyxtream.pyxtream.XTream.get_series_URL", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_series_URL", "kind": "function", "doc": "

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"fullname": "pyxtream.pyxtream.XTream.get_series_URL_by_category", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_series_URL_by_category", "kind": "function", "doc": "

    \n", "signature": "(self, category_id) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"fullname": "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_series_info_URL_by_ID", "kind": "function", "doc": "

    \n", "signature": "(self, series_id) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"fullname": "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_VOD_info_URL_by_ID", "kind": "function", "doc": "

    \n", "signature": "(self, vod_id) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"fullname": "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_live_epg_URL_by_stream", "kind": "function", "doc": "

    \n", "signature": "(self, stream_id) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"fullname": "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_live_epg_URL_by_stream_and_limit", "kind": "function", "doc": "

    \n", "signature": "(self, stream_id, limit) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"fullname": "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_all_live_epg_URL_by_stream", "kind": "function", "doc": "

    \n", "signature": "(self, stream_id) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"fullname": "pyxtream.pyxtream.XTream.get_all_epg_URL", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_all_epg_URL", "kind": "function", "doc": "

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "pyxtream.rest_api": {"fullname": "pyxtream.rest_api", "modulename": "pyxtream.rest_api", "kind": "module", "doc": "

    \n"}, "pyxtream.rest_api.EndpointAction": {"fullname": "pyxtream.rest_api.EndpointAction", "modulename": "pyxtream.rest_api", "qualname": "EndpointAction", "kind": "class", "doc": "

    \n"}, "pyxtream.rest_api.EndpointAction.__init__": {"fullname": "pyxtream.rest_api.EndpointAction.__init__", "modulename": "pyxtream.rest_api", "qualname": "EndpointAction.__init__", "kind": "function", "doc": "

    \n", "signature": "(action, function_name)"}, "pyxtream.rest_api.EndpointAction.function_name": {"fullname": "pyxtream.rest_api.EndpointAction.function_name", "modulename": "pyxtream.rest_api", "qualname": "EndpointAction.function_name", "kind": "variable", "doc": "

    \n"}, "pyxtream.rest_api.EndpointAction.action": {"fullname": "pyxtream.rest_api.EndpointAction.action", "modulename": "pyxtream.rest_api", "qualname": "EndpointAction.action", "kind": "variable", "doc": "

    \n"}, "pyxtream.rest_api.FlaskWrap": {"fullname": "pyxtream.rest_api.FlaskWrap", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap", "kind": "class", "doc": "

    A class that represents a thread of control.

    \n\n

    This class can be safely subclassed in a limited fashion. There are two ways\nto specify the activity: by passing a callable object to the constructor, or\nby overriding the run() method in a subclass.

    \n", "bases": "threading.Thread"}, "pyxtream.rest_api.FlaskWrap.__init__": {"fullname": "pyxtream.rest_api.FlaskWrap.__init__", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.__init__", "kind": "function", "doc": "

    This constructor should always be called with keyword arguments. Arguments are:

    \n\n

    group should be None; reserved for future extension when a ThreadGroup\nclass is implemented.

    \n\n

    target is the callable object to be invoked by the run()\nmethod. Defaults to None, meaning nothing is called.

    \n\n

    name is the thread name. By default, a unique name is constructed of\nthe form \"Thread-N\" where N is a small decimal number.

    \n\n

    args is a list or tuple of arguments for the target invocation. Defaults to ().

    \n\n

    kwargs is a dictionary of keyword arguments for the target\ninvocation. Defaults to {}.

    \n\n

    If a subclass overrides the constructor, it must make sure to invoke\nthe base class constructor (Thread.__init__()) before doing anything\nelse to the thread.

    \n", "signature": "(\tname,\txtream: object,\thtml_template_folder: str = None,\thost: str = '0.0.0.0',\tport: int = 5000,\tdebug: bool = True)"}, "pyxtream.rest_api.FlaskWrap.home_template": {"fullname": "pyxtream.rest_api.FlaskWrap.home_template", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.home_template", "kind": "variable", "doc": "

    \n", "default_value": "'\\n<!DOCTYPE html><html lang="en"><head></head><body>pyxtream API</body></html>\\n '"}, "pyxtream.rest_api.FlaskWrap.host": {"fullname": "pyxtream.rest_api.FlaskWrap.host", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.host", "kind": "variable", "doc": "

    \n", "annotation": ": str", "default_value": "''"}, "pyxtream.rest_api.FlaskWrap.port": {"fullname": "pyxtream.rest_api.FlaskWrap.port", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.port", "kind": "variable", "doc": "

    \n", "annotation": ": int", "default_value": "0"}, "pyxtream.rest_api.FlaskWrap.debug": {"fullname": "pyxtream.rest_api.FlaskWrap.debug", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.debug", "kind": "variable", "doc": "

    \n"}, "pyxtream.rest_api.FlaskWrap.app": {"fullname": "pyxtream.rest_api.FlaskWrap.app", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.app", "kind": "variable", "doc": "

    \n"}, "pyxtream.rest_api.FlaskWrap.xt": {"fullname": "pyxtream.rest_api.FlaskWrap.xt", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.xt", "kind": "variable", "doc": "

    \n"}, "pyxtream.rest_api.FlaskWrap.name": {"fullname": "pyxtream.rest_api.FlaskWrap.name", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.name", "kind": "variable", "doc": "

    A string used for identification purposes only.

    \n\n

    It has no semantics. Multiple threads may be given the same name. The\ninitial name is set by the constructor.

    \n"}, "pyxtream.rest_api.FlaskWrap.daemon": {"fullname": "pyxtream.rest_api.FlaskWrap.daemon", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.daemon", "kind": "variable", "doc": "

    A boolean value indicating whether this thread is a daemon thread.

    \n\n

    This must be set before start() is called, otherwise RuntimeError is\nraised. Its initial value is inherited from the creating thread; the\nmain thread is not a daemon thread and therefore all threads created in\nthe main thread default to daemon = False.

    \n\n

    The entire Python program exits when only daemon threads are left.

    \n"}, "pyxtream.rest_api.FlaskWrap.run": {"fullname": "pyxtream.rest_api.FlaskWrap.run", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.run", "kind": "function", "doc": "

    Method representing the thread's activity.

    \n\n

    You may override this method in a subclass. The standard run() method\ninvokes the callable object passed to the object's constructor as the\ntarget argument, if any, with sequential and keyword arguments taken\nfrom the args and kwargs arguments, respectively.

    \n", "signature": "(self):", "funcdef": "def"}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"fullname": "pyxtream.rest_api.FlaskWrap.add_endpoint", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.add_endpoint", "kind": "function", "doc": "

    \n", "signature": "(self, endpoint=None, endpoint_name=None, handler=None):", "funcdef": "def"}, "pyxtream.schemaValidator": {"fullname": "pyxtream.schemaValidator", "modulename": "pyxtream.schemaValidator", "kind": "module", "doc": "

    \n"}, "pyxtream.schemaValidator.SchemaType": {"fullname": "pyxtream.schemaValidator.SchemaType", "modulename": "pyxtream.schemaValidator", "qualname": "SchemaType", "kind": "class", "doc": "

    \n", "bases": "enum.Enum"}, "pyxtream.schemaValidator.SchemaType.SERIES": {"fullname": "pyxtream.schemaValidator.SchemaType.SERIES", "modulename": "pyxtream.schemaValidator", "qualname": "SchemaType.SERIES", "kind": "variable", "doc": "

    \n", "default_value": "<SchemaType.SERIES: 1>"}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"fullname": "pyxtream.schemaValidator.SchemaType.SERIES_INFO", "modulename": "pyxtream.schemaValidator", "qualname": "SchemaType.SERIES_INFO", "kind": "variable", "doc": "

    \n", "default_value": "<SchemaType.SERIES_INFO: 2>"}, "pyxtream.schemaValidator.SchemaType.LIVE": {"fullname": "pyxtream.schemaValidator.SchemaType.LIVE", "modulename": "pyxtream.schemaValidator", "qualname": "SchemaType.LIVE", "kind": "variable", "doc": "

    \n", "default_value": "<SchemaType.LIVE: 3>"}, "pyxtream.schemaValidator.SchemaType.VOD": {"fullname": "pyxtream.schemaValidator.SchemaType.VOD", "modulename": "pyxtream.schemaValidator", "qualname": "SchemaType.VOD", "kind": "variable", "doc": "

    \n", "default_value": "<SchemaType.VOD: 4>"}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"fullname": "pyxtream.schemaValidator.SchemaType.CHANNEL", "modulename": "pyxtream.schemaValidator", "qualname": "SchemaType.CHANNEL", "kind": "variable", "doc": "

    \n", "default_value": "<SchemaType.CHANNEL: 5>"}, "pyxtream.schemaValidator.SchemaType.GROUP": {"fullname": "pyxtream.schemaValidator.SchemaType.GROUP", "modulename": "pyxtream.schemaValidator", "qualname": "SchemaType.GROUP", "kind": "variable", "doc": "

    \n", "default_value": "<SchemaType.GROUP: 6>"}, "pyxtream.schemaValidator.series_schema": {"fullname": "pyxtream.schemaValidator.series_schema", "modulename": "pyxtream.schemaValidator", "qualname": "series_schema", "kind": "variable", "doc": "

    \n", "default_value": "{'$schema': 'https://json-schema.org/draft/2020-12/schema', '$id': 'https://example.com/product.schema.json', 'title': 'Series', 'description': 'xtream API Series Schema', 'type': 'object', 'properties': {'seasons': {'type': 'array', 'items': {'properties': {'air_date': {'type': 'string', 'format': 'date'}, 'episode_count': {'type': 'integer'}, 'id': {'type': 'integer'}, 'name': {'type': 'string'}, 'overview': {'type': 'string'}, 'season_number': {'type': 'integer'}, 'cover': {'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}, 'cover_big': {'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}}, 'required': ['id'], 'title': 'Season'}}, 'info': {'properties': {'name': {'type': 'string'}, 'cover': {'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}, 'plot': {'type': 'string'}, 'cast': {'type': 'string'}, 'director': {'type': 'string'}, 'genre': {'type': 'string'}, 'releaseDate': {'type': 'string', 'format': 'date'}, 'last_modified': {'type': 'string', 'format': 'integer'}, 'rating': {'type': 'string', 'format': 'integer'}, 'rating_5based': {'type': 'number'}, 'backdrop_path': {'type': 'array', 'items': {'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}}, 'youtube_trailed': {'type': 'string'}, 'episode_run_time': {'type': 'string', 'format': 'integer'}, 'category_id': {'type': 'string', 'format': 'integer'}}, 'required': ['name'], 'title': 'Info'}, 'episodes': {'patternProperties': {'^\\\\d+$': {'type': 'array', 'items': {'properties': {'id': {'type': 'string', 'format': 'integer'}, 'episode_num': {'type': 'integer'}, 'title': {'type': 'string'}, 'container_extension': {'type': 'string'}, 'info': {'type': 'object', 'items': {'plot': {'type': 'string'}}}, 'customer_sid': {'type': 'string'}, 'added': {'type': 'string', 'format': 'integer'}, 'season': {'type': 'integer'}, 'direct_source': {'type': 'string'}}}}}}}, 'required': ['info', 'seasons', 'episodes']}"}, "pyxtream.schemaValidator.series_info_schema": {"fullname": "pyxtream.schemaValidator.series_info_schema", "modulename": "pyxtream.schemaValidator", "qualname": "series_info_schema", "kind": "variable", "doc": "

    \n", "default_value": "{'$schema': 'https://json-schema.org/draft/2020-12/schema', '$id': 'https://example.com/product.schema.json', 'title': 'Series', 'description': 'xtream API Series Info Schema', 'type': 'object', 'properties': {'name': {'type': 'string'}, 'cover': {'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}, 'plot': {'type': 'string'}, 'cast': {'type': 'string'}, 'director': {'type': 'string'}, 'genre': {'type': 'string'}, 'releaseDate': {'type': 'string', 'format': 'date'}, 'last_modified': {'type': 'string', 'format': 'integer'}, 'rating': {'type': 'string', 'format': 'integer'}, 'rating_5based': {'type': 'number'}, 'backdrop_path': {'anyOf': [{'type': 'array', 'items': {'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}}, {'type': 'string'}]}, 'youtube_trailed': {'type': 'string'}, 'episode_run_time': {'type': 'string', 'format': 'integer'}, 'category_id': {'type': 'string', 'format': 'integer'}}, 'required': ['name', 'category_id']}"}, "pyxtream.schemaValidator.live_schema": {"fullname": "pyxtream.schemaValidator.live_schema", "modulename": "pyxtream.schemaValidator", "qualname": "live_schema", "kind": "variable", "doc": "

    \n", "default_value": "{'$schema': 'https://json-schema.org/draft/2020-12/schema', '$id': 'https://example.com/product.schema.json', 'title': 'Live', 'description': 'xtream API Live Schema', 'type': 'object', 'properties': {'num': {'type': 'integer'}, 'name': {'type': 'string'}, 'stream_type': {'type': 'string'}, 'stream_id': {'type': 'integer'}, 'stream_icon': {'anyOf': [{'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}, {'type': 'null'}]}, 'epg_channel_id': {'anyOf': [{'type': 'null'}, {'type': 'string'}]}, 'added': {'type': 'string', 'format': 'integer'}, 'is_adult': {'type': 'string', 'format': 'number'}, 'category_id': {'type': 'string'}, 'custom_sid': {'type': 'string'}, 'tv_archive': {'type': 'number'}, 'direct_source': {'type': 'string'}, 'tv_archive_duration': {'anyOf': [{'type': 'number'}, {'type': 'string', 'format': 'integer'}]}}}"}, "pyxtream.schemaValidator.vod_schema": {"fullname": "pyxtream.schemaValidator.vod_schema", "modulename": "pyxtream.schemaValidator", "qualname": "vod_schema", "kind": "variable", "doc": "

    \n", "default_value": "{'$schema': 'https://json-schema.org/draft/2020-12/schema', '$id': 'https://example.com/product.schema.json', 'title': 'VOD', 'description': 'xtream API VOD Schema', 'type': 'object', 'properties': {'num': {'type': 'integer'}, 'name': {'type': 'string'}, 'stream_type': {'type': 'string'}, 'stream_id': {'type': 'integer'}, 'stream_icon': {'anyOf': [{'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}, {'type': 'null'}]}, 'rating': {'anyOf': [{'type': 'null'}, {'type': 'string', 'format': 'integer'}, {'type': 'number'}]}, 'rating_5based': {'type': 'number'}, 'added': {'type': 'string', 'format': 'integer'}, 'is_adult': {'type': 'string', 'format': 'number'}, 'category_id': {'type': 'string'}, 'container_extension': {'type': 'string'}, 'custom_sid': {'type': 'string'}, 'direct_source': {'type': 'string'}}}"}, "pyxtream.schemaValidator.channel_schema": {"fullname": "pyxtream.schemaValidator.channel_schema", "modulename": "pyxtream.schemaValidator", "qualname": "channel_schema", "kind": "variable", "doc": "

    \n", "default_value": "{}"}, "pyxtream.schemaValidator.group_schema": {"fullname": "pyxtream.schemaValidator.group_schema", "modulename": "pyxtream.schemaValidator", "qualname": "group_schema", "kind": "variable", "doc": "

    \n", "default_value": "{'$schema': 'https://json-schema.org/draft/2020-12/schema', '$id': 'https://example.com/product.schema.json', 'title': 'Group', 'description': 'xtream API Group Schema', 'type': 'object', 'properties': {'category_id': {'type': 'string'}, 'category_name': {'type': 'string'}, 'parent_id': {'type': 'integer'}}}"}, "pyxtream.schemaValidator.schemaValidator": {"fullname": "pyxtream.schemaValidator.schemaValidator", "modulename": "pyxtream.schemaValidator", "qualname": "schemaValidator", "kind": "function", "doc": "

    \n", "signature": "(jsonData: str, schemaType: pyxtream.schemaValidator.SchemaType) -> bool:", "funcdef": "def"}, "pyxtream.version": {"fullname": "pyxtream.version", "modulename": "pyxtream.version", "kind": "module", "doc": "

    \n"}}, "docInfo": {"pyxtream": {"qualname": 0, "fullname": 1, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.progress": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.progress.progress": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 29, "bases": 0, "doc": 3}, "pyxtream.pyxtream": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 67}, "pyxtream.pyxtream.Channel": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 26, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.info": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.id": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.name": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.logo": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.logo_path": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.group_title": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.title": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.url": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.stream_type": {"qualname": 3, "fullname": 5, "annotation": 2, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.group_id": {"qualname": 3, "fullname": 5, "annotation": 2, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.is_adult": {"qualname": 3, "fullname": 5, "annotation": 2, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.added": {"qualname": 2, "fullname": 4, "annotation": 2, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.epg_channel_id": {"qualname": 4, "fullname": 6, "annotation": 2, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.age_days_from_added": {"qualname": 5, "fullname": 7, "annotation": 2, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.date_now": {"qualname": 3, "fullname": 5, "annotation": 3, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.raw": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.export_json": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 26, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.name": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.group_type": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.group_id": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.raw": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"qualname": 6, "fullname": 8, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.channels": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.series": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.region_shortname": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.region_longname": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 32, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.title": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.name": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.info": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.raw": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.group_title": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.id": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.container_extension": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.episode_number": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.av_info": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.logo": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.logo_path": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.url": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.name": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.logo": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.logo_path": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.series_id": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.plot": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.youtube_trailer": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.genre": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.raw": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.xtream": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.seasons": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.episodes": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.export_json": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Season": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Season.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 9, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Season.name": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Season.episodes": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 170, "bases": 0, "doc": 202}, "pyxtream.pyxtream.XTream.name": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.server": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.secure_server": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.username": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.password": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.live_type": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 5, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.vod_type": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 5, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.series_type": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 5, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.auth_data": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.authorization": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.groups": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.channels": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.series": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.movies": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.movies_30days": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.movies_7days": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.connection_headers": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.state": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 11, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.hide_adult_content": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 8, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 8, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 8, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.threshold_time_sec": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 2, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.cache_path": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.validate_json": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.app_fullpath": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.html_template_folder": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.search_stream": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 117, "bases": 0, "doc": 69}, "pyxtream.pyxtream.XTream.download_video": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 25, "bases": 0, "doc": 36}, "pyxtream.pyxtream.XTream.authenticate": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 5}, "pyxtream.pyxtream.XTream.load_iptv": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 83}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"qualname": 6, "fullname": 8, "annotation": 0, "default_value": 0, "signature": 22, "bases": 0, "doc": 18}, "pyxtream.pyxtream.XTream.vodInfoByID": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 17, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 17, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 22, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 17, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.allEpg": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"qualname": 7, "fullname": 9, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"qualname": 7, "fullname": 9, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_series_URL": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"qualname": 6, "fullname": 8, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"qualname": 7, "fullname": 9, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"qualname": 7, "fullname": 9, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"qualname": 7, "fullname": 9, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"qualname": 9, "fullname": 11, "annotation": 0, "default_value": 0, "signature": 25, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"qualname": 8, "fullname": 10, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 3}, "pyxtream.rest_api": {"qualname": 0, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.EndpointAction": {"qualname": 1, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.EndpointAction.__init__": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 3}, "pyxtream.rest_api.EndpointAction.function_name": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.EndpointAction.action": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.FlaskWrap": {"qualname": 1, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 2, "doc": 49}, "pyxtream.rest_api.FlaskWrap.__init__": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 102, "bases": 0, "doc": 151}, "pyxtream.rest_api.FlaskWrap.home_template": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 34, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.FlaskWrap.host": {"qualname": 2, "fullname": 5, "annotation": 2, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.FlaskWrap.port": {"qualname": 2, "fullname": 5, "annotation": 2, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.FlaskWrap.debug": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.FlaskWrap.app": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.FlaskWrap.xt": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.FlaskWrap.name": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 33}, "pyxtream.rest_api.FlaskWrap.daemon": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 73}, "pyxtream.rest_api.FlaskWrap.run": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 53}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 42, "bases": 0, "doc": 3}, "pyxtream.schemaValidator": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.SchemaType": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 2, "doc": 3}, "pyxtream.schemaValidator.SchemaType.SERIES": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 7, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 8, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.SchemaType.LIVE": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 7, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.SchemaType.VOD": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 7, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 7, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.SchemaType.GROUP": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 7, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.series_schema": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 746, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.series_info_schema": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 354, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.live_schema": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 314, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.vod_schema": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 306, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.channel_schema": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.group_schema": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 92, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.schemaValidator": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 39, "bases": 0, "doc": 3}, "pyxtream.version": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}}, "length": 153, "save": true}, "index": {"qualname": {"root": {"3": {"0": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.movies_30days": {"tf": 1}}, "df": 1}}}}}, "docs": {}, "df": 0}, "7": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.movies_7days": {"tf": 1}}, "df": 1}}}}}, "docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.pyxtream.Season.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 8, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.progress.progress": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.Channel.logo_path": {"tf": 1}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1}, "pyxtream.pyxtream.XTream.cache_path": {"tf": 1}}, "df": 4}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.password": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Serie.plot": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.port": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.Channel": {"tf": 1}, "pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Channel.info": {"tf": 1}, "pyxtream.pyxtream.Channel.id": {"tf": 1}, "pyxtream.pyxtream.Channel.name": {"tf": 1}, "pyxtream.pyxtream.Channel.logo": {"tf": 1}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1}, "pyxtream.pyxtream.Channel.group_title": {"tf": 1}, "pyxtream.pyxtream.Channel.title": {"tf": 1}, "pyxtream.pyxtream.Channel.url": {"tf": 1}, "pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Channel.is_adult": {"tf": 1}, "pyxtream.pyxtream.Channel.added": {"tf": 1}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}, "pyxtream.pyxtream.Channel.date_now": {"tf": 1}, "pyxtream.pyxtream.Channel.raw": {"tf": 1}, "pyxtream.pyxtream.Channel.export_json": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.channel_schema": {"tf": 1}}, "df": 21, "s": {"docs": {"pyxtream.pyxtream.Group.channels": {"tf": 1}, "pyxtream.pyxtream.XTream.channels": {"tf": 1}}, "df": 2}}}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.Episode.container_extension": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.connection_headers": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}}, "df": 2, "c": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}}, "df": 3}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}}, "df": 1}}}, "y": {"docs": {"pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}}, "df": 3}}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.cache_path": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.pyxtream.Season.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 8}}, "f": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.Channel.info": {"tf": 1}, "pyxtream.pyxtream.Episode.info": {"tf": 1}, "pyxtream.pyxtream.Episode.av_info": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 8}}}, "d": {"docs": {"pyxtream.pyxtream.Channel.id": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1}, "pyxtream.pyxtream.Group.group_id": {"tf": 1}, "pyxtream.pyxtream.Episode.id": {"tf": 1}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}}, "df": 9}, "s": {"docs": {"pyxtream.pyxtream.Channel.is_adult": {"tf": 1}}, "df": 1}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "v": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.name": {"tf": 1}, "pyxtream.pyxtream.Group.name": {"tf": 1}, "pyxtream.pyxtream.Episode.name": {"tf": 1}, "pyxtream.pyxtream.Serie.name": {"tf": 1}, "pyxtream.pyxtream.Season.name": {"tf": 1}, "pyxtream.pyxtream.XTream.name": {"tf": 1}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 8}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"pyxtream.pyxtream.Channel.date_now": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.Episode.episode_number": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.Channel.logo": {"tf": 1}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1}, "pyxtream.pyxtream.Episode.logo": {"tf": 1}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1}, "pyxtream.pyxtream.Serie.logo": {"tf": 1}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1}}, "df": 6}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.region_longname": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.live_type": {"tf": 1}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}}, "df": 10, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}}, "df": 1}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.pyxtream.Channel.group_title": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Group": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.name": {"tf": 1}, "pyxtream.pyxtream.Group.group_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.raw": {"tf": 1}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}, "pyxtream.pyxtream.Group.channels": {"tf": 1}, "pyxtream.pyxtream.Group.series": {"tf": 1}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1}, "pyxtream.pyxtream.Group.region_longname": {"tf": 1}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 19, "s": {"docs": {"pyxtream.pyxtream.XTream.groups": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Serie.genre": {"tf": 1}}, "df": 1}}}, "t": {"docs": {"pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 16}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.group_title": {"tf": 1}, "pyxtream.pyxtream.Channel.title": {"tf": 1}, "pyxtream.pyxtream.Episode.title": {"tf": 1}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1}}, "df": 4}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}}, "df": 1}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.Group.group_type": {"tf": 1}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1}}, "df": 5}}}, "o": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1}}, "df": 1}}}}}}, "h": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 2}}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.Channel.url": {"tf": 1}, "pyxtream.pyxtream.Episode.url": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 17}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.username": {"tf": 1}}, "df": 1}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}}, "df": 5, "s": {"docs": {"pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}}, "df": 4}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.state": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1}}, "df": 2}}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Serie": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.name": {"tf": 1}, "pyxtream.pyxtream.Serie.logo": {"tf": 1}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1}, "pyxtream.pyxtream.Serie.plot": {"tf": 1}, "pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1}, "pyxtream.pyxtream.Serie.genre": {"tf": 1}, "pyxtream.pyxtream.Serie.raw": {"tf": 1}, "pyxtream.pyxtream.Serie.xtream": {"tf": 1}, "pyxtream.pyxtream.Serie.seasons": {"tf": 1}, "pyxtream.pyxtream.Serie.episodes": {"tf": 1}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1}}, "df": 14, "s": {"docs": {"pyxtream.pyxtream.Group.series": {"tf": 1}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1}, "pyxtream.pyxtream.XTream.series": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 14}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.server": {"tf": 1}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Season": {"tf": 1}, "pyxtream.pyxtream.Season.__init__": {"tf": 1}, "pyxtream.pyxtream.Season.name": {"tf": 1}, "pyxtream.pyxtream.Season.episodes": {"tf": 1}}, "df": 4, "s": {"docs": {"pyxtream.pyxtream.Serie.seasons": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {"pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.secure_server": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.channel_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 6, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.SchemaType": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}}, "df": 7}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.schemaValidator": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.is_adult": {"tf": 1}, "pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}}, "df": 2}}}, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.Channel.added": {"tf": 1}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 2}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 1}}, "v": {"docs": {"pyxtream.pyxtream.Episode.av_info": {"tf": 1}}, "df": 1}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.auth_data": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.authorization": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.authenticate": {"tf": 1}}, "df": 1}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 5, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.allEpg": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1}}, "df": 2}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction.action": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 5}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Episode": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.title": {"tf": 1}, "pyxtream.pyxtream.Episode.name": {"tf": 1}, "pyxtream.pyxtream.Episode.info": {"tf": 1}, "pyxtream.pyxtream.Episode.raw": {"tf": 1}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1}, "pyxtream.pyxtream.Episode.id": {"tf": 1}, "pyxtream.pyxtream.Episode.container_extension": {"tf": 1}, "pyxtream.pyxtream.Episode.episode_number": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.av_info": {"tf": 1}, "pyxtream.pyxtream.Episode.logo": {"tf": 1}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1}, "pyxtream.pyxtream.Episode.url": {"tf": 1}}, "df": 14, "s": {"docs": {"pyxtream.pyxtream.Serie.episodes": {"tf": 1}, "pyxtream.pyxtream.Season.episodes": {"tf": 1}}, "df": 2}}}}}}}, "x": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.export_json": {"tf": 1}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1}}, "df": 2}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Episode.container_extension": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}, "pyxtream.rest_api.EndpointAction.action": {"tf": 1}}, "df": 4}}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.date_now": {"tf": 1}}, "df": 1}, "a": {"docs": {"pyxtream.pyxtream.XTream.auth_data": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.debug": {"tf": 1}}, "df": 1}}}}}, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.debug": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.xt": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 12}}}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "w": {"docs": {"pyxtream.pyxtream.Channel.raw": {"tf": 1}, "pyxtream.pyxtream.Group.raw": {"tf": 1}, "pyxtream.pyxtream.Episode.raw": {"tf": 1}, "pyxtream.pyxtream.Serie.raw": {"tf": 1}}, "df": 4}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1}, "pyxtream.pyxtream.Group.region_longname": {"tf": 1}}, "df": 3}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}, "j": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Channel.export_json": {"tf": 1}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1}, "pyxtream.pyxtream.XTream.validate_json": {"tf": 1}}, "df": 3}}}}, "y": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1}}, "df": 1}}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.xt": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Serie.xtream": {"tf": 1}, "pyxtream.pyxtream.XTream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.name": {"tf": 1}, "pyxtream.pyxtream.XTream.server": {"tf": 1}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1}, "pyxtream.pyxtream.XTream.username": {"tf": 1}, "pyxtream.pyxtream.XTream.password": {"tf": 1}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1}, "pyxtream.pyxtream.XTream.auth_data": {"tf": 1}, "pyxtream.pyxtream.XTream.authorization": {"tf": 1}, "pyxtream.pyxtream.XTream.groups": {"tf": 1}, "pyxtream.pyxtream.XTream.channels": {"tf": 1}, "pyxtream.pyxtream.XTream.series": {"tf": 1}, "pyxtream.pyxtream.XTream.movies": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_30days": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_7days": {"tf": 1}, "pyxtream.pyxtream.XTream.connection_headers": {"tf": 1}, "pyxtream.pyxtream.XTream.state": {"tf": 1}, "pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}, "pyxtream.pyxtream.XTream.cache_path": {"tf": 1}, "pyxtream.pyxtream.XTream.validate_json": {"tf": 1}, "pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1}, "pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.allEpg": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 55}}}}}}, "v": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.vod_type": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 8, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.validate_json": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.movies": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_30days": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_7days": {"tf": 1}}, "df": 3}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.connection_headers": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.host": {"tf": 1}}, "df": 1}}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}}, "df": 9}}}}, "fullname": {"root": {"3": {"0": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.movies_30days": {"tf": 1}}, "df": 1}}}}}, "docs": {}, "df": 0}, "7": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.movies_7days": {"tf": 1}}, "df": 1}}}}}, "docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.pyxtream.Season.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 8, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream": {"tf": 1}, "pyxtream.progress": {"tf": 1}, "pyxtream.progress.progress": {"tf": 1}, "pyxtream.pyxtream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.info": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.logo": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.group_title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.url": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.stream_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.is_adult": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.added": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.date_now": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.export_json": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.channels": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.series": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.region_longname": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.info": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.container_extension": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.episode_number": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.av_info": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.logo": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.url": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.logo": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.plot": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.genre": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.xtream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.seasons": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.episodes": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Season": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Season.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Season.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Season.episodes": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.server": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.username": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.password": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.auth_data": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.authorization": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.groups": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.channels": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.series": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.movies": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.movies_30days": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.movies_7days": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.connection_headers": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.state": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.cache_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.validate_json": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.allEpg": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1.4142135623730951}, "pyxtream.rest_api": {"tf": 1}, "pyxtream.rest_api.EndpointAction": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}, "pyxtream.rest_api.EndpointAction.action": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.debug": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.xt": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}, "pyxtream.schemaValidator": {"tf": 1}, "pyxtream.schemaValidator.SchemaType": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.channel_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}, "pyxtream.schemaValidator.schemaValidator": {"tf": 1}, "pyxtream.version": {"tf": 1}}, "df": 153}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.progress": {"tf": 1}, "pyxtream.progress.progress": {"tf": 1.4142135623730951}}, "df": 2}}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.Channel.logo_path": {"tf": 1}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1}, "pyxtream.pyxtream.XTream.cache_path": {"tf": 1}}, "df": 4}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.password": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Serie.plot": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.port": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.Channel": {"tf": 1}, "pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Channel.info": {"tf": 1}, "pyxtream.pyxtream.Channel.id": {"tf": 1}, "pyxtream.pyxtream.Channel.name": {"tf": 1}, "pyxtream.pyxtream.Channel.logo": {"tf": 1}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1}, "pyxtream.pyxtream.Channel.group_title": {"tf": 1}, "pyxtream.pyxtream.Channel.title": {"tf": 1}, "pyxtream.pyxtream.Channel.url": {"tf": 1}, "pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Channel.is_adult": {"tf": 1}, "pyxtream.pyxtream.Channel.added": {"tf": 1}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}, "pyxtream.pyxtream.Channel.date_now": {"tf": 1}, "pyxtream.pyxtream.Channel.raw": {"tf": 1}, "pyxtream.pyxtream.Channel.export_json": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.channel_schema": {"tf": 1}}, "df": 21, "s": {"docs": {"pyxtream.pyxtream.Group.channels": {"tf": 1}, "pyxtream.pyxtream.XTream.channels": {"tf": 1}}, "df": 2}}}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.Episode.container_extension": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.connection_headers": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}}, "df": 2, "c": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}}, "df": 3}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}}, "df": 1}}}, "y": {"docs": {"pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}}, "df": 3}}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.cache_path": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.pyxtream.Season.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 8}}, "f": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.Channel.info": {"tf": 1}, "pyxtream.pyxtream.Episode.info": {"tf": 1}, "pyxtream.pyxtream.Episode.av_info": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 8}}}, "d": {"docs": {"pyxtream.pyxtream.Channel.id": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1}, "pyxtream.pyxtream.Group.group_id": {"tf": 1}, "pyxtream.pyxtream.Episode.id": {"tf": 1}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}}, "df": 9}, "s": {"docs": {"pyxtream.pyxtream.Channel.is_adult": {"tf": 1}}, "df": 1}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "v": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.name": {"tf": 1}, "pyxtream.pyxtream.Group.name": {"tf": 1}, "pyxtream.pyxtream.Episode.name": {"tf": 1}, "pyxtream.pyxtream.Serie.name": {"tf": 1}, "pyxtream.pyxtream.Season.name": {"tf": 1}, "pyxtream.pyxtream.XTream.name": {"tf": 1}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 8}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"pyxtream.pyxtream.Channel.date_now": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.Episode.episode_number": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.Channel.logo": {"tf": 1}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1}, "pyxtream.pyxtream.Episode.logo": {"tf": 1}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1}, "pyxtream.pyxtream.Serie.logo": {"tf": 1}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1}}, "df": 6}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.region_longname": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.live_type": {"tf": 1}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}}, "df": 10, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}}, "df": 1}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.pyxtream.Channel.group_title": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Group": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.name": {"tf": 1}, "pyxtream.pyxtream.Group.group_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.raw": {"tf": 1}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}, "pyxtream.pyxtream.Group.channels": {"tf": 1}, "pyxtream.pyxtream.Group.series": {"tf": 1}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1}, "pyxtream.pyxtream.Group.region_longname": {"tf": 1}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 19, "s": {"docs": {"pyxtream.pyxtream.XTream.groups": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Serie.genre": {"tf": 1}}, "df": 1}}}, "t": {"docs": {"pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 16}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.group_title": {"tf": 1}, "pyxtream.pyxtream.Channel.title": {"tf": 1}, "pyxtream.pyxtream.Episode.title": {"tf": 1}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1}}, "df": 4}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}}, "df": 1}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.Group.group_type": {"tf": 1}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1}}, "df": 5}}}, "o": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1}}, "df": 1}}}}}}, "h": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 2}}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.Channel.url": {"tf": 1}, "pyxtream.pyxtream.Episode.url": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 17}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.username": {"tf": 1}}, "df": 1}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}}, "df": 5, "s": {"docs": {"pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}}, "df": 4}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.state": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1}}, "df": 2}}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Serie": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.name": {"tf": 1}, "pyxtream.pyxtream.Serie.logo": {"tf": 1}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1}, "pyxtream.pyxtream.Serie.plot": {"tf": 1}, "pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1}, "pyxtream.pyxtream.Serie.genre": {"tf": 1}, "pyxtream.pyxtream.Serie.raw": {"tf": 1}, "pyxtream.pyxtream.Serie.xtream": {"tf": 1}, "pyxtream.pyxtream.Serie.seasons": {"tf": 1}, "pyxtream.pyxtream.Serie.episodes": {"tf": 1}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1}}, "df": 14, "s": {"docs": {"pyxtream.pyxtream.Group.series": {"tf": 1}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1}, "pyxtream.pyxtream.XTream.series": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 14}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.server": {"tf": 1}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Season": {"tf": 1}, "pyxtream.pyxtream.Season.__init__": {"tf": 1}, "pyxtream.pyxtream.Season.name": {"tf": 1}, "pyxtream.pyxtream.Season.episodes": {"tf": 1}}, "df": 4, "s": {"docs": {"pyxtream.pyxtream.Serie.seasons": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {"pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.secure_server": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.channel_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 6, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator": {"tf": 1}, "pyxtream.schemaValidator.SchemaType": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.channel_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}, "pyxtream.schemaValidator.schemaValidator": {"tf": 1.4142135623730951}}, "df": 15}}}}}}}}}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.SchemaType": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}}, "df": 7}}}}}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.is_adult": {"tf": 1}, "pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}}, "df": 2}}}, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.Channel.added": {"tf": 1}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 2}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 1}}, "v": {"docs": {"pyxtream.pyxtream.Episode.av_info": {"tf": 1}}, "df": 1}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.auth_data": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.authorization": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.authenticate": {"tf": 1}}, "df": 1}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 5, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.allEpg": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1}}, "df": 2}, "i": {"docs": {"pyxtream.rest_api": {"tf": 1}, "pyxtream.rest_api.EndpointAction": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}, "pyxtream.rest_api.EndpointAction.action": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.debug": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.xt": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 17}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction.action": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 5}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Episode": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.title": {"tf": 1}, "pyxtream.pyxtream.Episode.name": {"tf": 1}, "pyxtream.pyxtream.Episode.info": {"tf": 1}, "pyxtream.pyxtream.Episode.raw": {"tf": 1}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1}, "pyxtream.pyxtream.Episode.id": {"tf": 1}, "pyxtream.pyxtream.Episode.container_extension": {"tf": 1}, "pyxtream.pyxtream.Episode.episode_number": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.av_info": {"tf": 1}, "pyxtream.pyxtream.Episode.logo": {"tf": 1}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1}, "pyxtream.pyxtream.Episode.url": {"tf": 1}}, "df": 14, "s": {"docs": {"pyxtream.pyxtream.Serie.episodes": {"tf": 1}, "pyxtream.pyxtream.Season.episodes": {"tf": 1}}, "df": 2}}}}}}}, "x": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.export_json": {"tf": 1}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1}}, "df": 2}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Episode.container_extension": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}, "pyxtream.rest_api.EndpointAction.action": {"tf": 1}}, "df": 4}}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.date_now": {"tf": 1}}, "df": 1}, "a": {"docs": {"pyxtream.pyxtream.XTream.auth_data": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.debug": {"tf": 1}}, "df": 1}}}}}, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.debug": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.xt": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 12}}}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "w": {"docs": {"pyxtream.pyxtream.Channel.raw": {"tf": 1}, "pyxtream.pyxtream.Group.raw": {"tf": 1}, "pyxtream.pyxtream.Episode.raw": {"tf": 1}, "pyxtream.pyxtream.Serie.raw": {"tf": 1}}, "df": 4}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1}, "pyxtream.pyxtream.Group.region_longname": {"tf": 1}}, "df": 3}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api": {"tf": 1}, "pyxtream.rest_api.EndpointAction": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}, "pyxtream.rest_api.EndpointAction.action": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.debug": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.xt": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 17}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}, "j": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Channel.export_json": {"tf": 1}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1}, "pyxtream.pyxtream.XTream.validate_json": {"tf": 1}}, "df": 3}}}}, "y": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1}}, "df": 1}}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.xt": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Serie.xtream": {"tf": 1}, "pyxtream.pyxtream.XTream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.name": {"tf": 1}, "pyxtream.pyxtream.XTream.server": {"tf": 1}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1}, "pyxtream.pyxtream.XTream.username": {"tf": 1}, "pyxtream.pyxtream.XTream.password": {"tf": 1}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1}, "pyxtream.pyxtream.XTream.auth_data": {"tf": 1}, "pyxtream.pyxtream.XTream.authorization": {"tf": 1}, "pyxtream.pyxtream.XTream.groups": {"tf": 1}, "pyxtream.pyxtream.XTream.channels": {"tf": 1}, "pyxtream.pyxtream.XTream.series": {"tf": 1}, "pyxtream.pyxtream.XTream.movies": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_30days": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_7days": {"tf": 1}, "pyxtream.pyxtream.XTream.connection_headers": {"tf": 1}, "pyxtream.pyxtream.XTream.state": {"tf": 1}, "pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}, "pyxtream.pyxtream.XTream.cache_path": {"tf": 1}, "pyxtream.pyxtream.XTream.validate_json": {"tf": 1}, "pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1}, "pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.allEpg": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 55}}}}}}, "v": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.vod_type": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 8, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.validate_json": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.version": {"tf": 1}}, "df": 1}}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.movies": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_30days": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_7days": {"tf": 1}}, "df": 3}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.connection_headers": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.host": {"tf": 1}}, "df": 1}}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}}, "df": 9}}}}, "annotation": {"root": {"docs": {"pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Channel.is_adult": {"tf": 1}, "pyxtream.pyxtream.Channel.added": {"tf": 1}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}, "pyxtream.pyxtream.Channel.date_now": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}}, "df": 9, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1}}, "df": 4}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.is_adult": {"tf": 1}, "pyxtream.pyxtream.Channel.added": {"tf": 1}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}}, "df": 4}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.date_now": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}}, "default_value": {"root": {"0": {"docs": {"pyxtream.pyxtream.Channel.is_adult": {"tf": 1}, "pyxtream.pyxtream.Channel.added": {"tf": 1}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}}, "df": 4}, "1": {"2": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}}}}}, "docs": {"pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}}, "df": 2}, "2": {"docs": {"pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}}, "df": 1}, "3": {"docs": {"pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}}, "df": 1}, "4": {"docs": {"pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}}, "df": 1}, "5": {"docs": {"pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}}, "df": 1, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 3}}}}}}, "6": {"docs": {"pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}}, "df": 1}, "docs": {"pyxtream.pyxtream.Channel.info": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.logo": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.group_title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.url": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.stream_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.info": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.logo": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.plot": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.genre": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Season.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.server": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.username": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.password": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.auth_data": {"tf": 1}, "pyxtream.pyxtream.XTream.authorization": {"tf": 1}, "pyxtream.pyxtream.XTream.groups": {"tf": 1}, "pyxtream.pyxtream.XTream.channels": {"tf": 1}, "pyxtream.pyxtream.XTream.series": {"tf": 1}, "pyxtream.pyxtream.XTream.movies": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_30days": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_7days": {"tf": 1}, "pyxtream.pyxtream.XTream.connection_headers": {"tf": 1}, "pyxtream.pyxtream.XTream.state": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.series_schema": {"tf": 13.96424004376894}, "pyxtream.schemaValidator.series_info_schema": {"tf": 9.273618495495704}, "pyxtream.schemaValidator.live_schema": {"tf": 9}, "pyxtream.schemaValidator.vod_schema": {"tf": 8.888194417315589}, "pyxtream.schemaValidator.channel_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 4.47213595499958}}, "df": 65, "x": {"2": {"7": {"docs": {"pyxtream.pyxtream.Channel.info": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.logo": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.group_title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.url": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.stream_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.info": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.logo": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.plot": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.genre": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Season.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.server": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.username": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.password": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.state": {"tf": 2}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.series_schema": {"tf": 18.601075237738275}, "pyxtream.schemaValidator.series_info_schema": {"tf": 12.806248474865697}, "pyxtream.schemaValidator.live_schema": {"tf": 11.832159566199232}, "pyxtream.schemaValidator.vod_schema": {"tf": 11.74734012447073}, "pyxtream.schemaValidator.group_schema": {"tf": 6.324555320336759}}, "df": 45}, "docs": {}, "df": 0}, "docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.live_type": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1.4142135623730951}}, "df": 3}}}, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.state": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 2.6457513110645907}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}}, "df": 10}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}, "v": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.vod_type": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.4142135623730951}}, "df": 3}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.series_type": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}}, "df": 5}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}}, "df": 1, "s": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 2}, "pyxtream.schemaValidator.live_schema": {"tf": 2}, "pyxtream.schemaValidator.vod_schema": {"tf": 2}, "pyxtream.schemaValidator.group_schema": {"tf": 2}}, "df": 5, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}}, "df": 6}}}}}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 5}, "pyxtream.schemaValidator.series_info_schema": {"tf": 3.7416573867739413}, "pyxtream.schemaValidator.live_schema": {"tf": 3.1622776601683795}, "pyxtream.schemaValidator.vod_schema": {"tf": 3.1622776601683795}, "pyxtream.schemaValidator.group_schema": {"tf": 1.4142135623730951}}, "df": 5}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.7320508075688772}}, "df": 2}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 3}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 3}}}}}}, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.state": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "i": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 6}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}}, "df": 1}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 3}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 2}}}}, "n": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "f": {"docs": {"pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.4142135623730951}}, "df": 3}}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.state": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}}, "df": 2}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 3.4641016151377544}, "pyxtream.schemaValidator.series_info_schema": {"tf": 2.6457513110645907}, "pyxtream.schemaValidator.live_schema": {"tf": 2}, "pyxtream.schemaValidator.vod_schema": {"tf": 2}}, "df": 4}}}}}}, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 4}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 4}}}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 1}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1.4142135623730951}}, "df": 5}}}}, "t": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 2.6457513110645907}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}}, "df": 10}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 8}}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "/": {"2": {"0": {"2": {"0": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "w": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.4142135623730951}}, "df": 1, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 3, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.7320508075688772}}, "df": 4}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.4142135623730951}}, "df": 2}}}}, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 3, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1}}, "df": 1}}}}}}}}, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.7320508075688772}}, "df": 1}}, "t": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 4, "s": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 4, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.4142135623730951}}, "df": 1}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.4142135623730951}}, "df": 1}}}, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 4}}, "e": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 1}, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2, "s": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "g": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1}}, "df": 1}}, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 2}}}}}}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.4142135623730951}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 3}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 3.3166247903554}, "pyxtream.schemaValidator.series_info_schema": {"tf": 2}, "pyxtream.schemaValidator.live_schema": {"tf": 2}, "pyxtream.schemaValidator.vod_schema": {"tf": 2}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}}}, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2.23606797749979}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.live_schema": {"tf": 2}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.group_schema": {"tf": 1.7320508075688772}}, "df": 5}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 2}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}}, "df": 2}}}}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}}, "df": 1}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 2}}}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1.4142135623730951}}, "df": 5}}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}}, "df": 1}}}}}}}}, "j": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 6}, "pyxtream.schemaValidator.series_info_schema": {"tf": 4.123105625617661}, "pyxtream.schemaValidator.live_schema": {"tf": 4.242640687119285}, "pyxtream.schemaValidator.vod_schema": {"tf": 4.242640687119285}, "pyxtream.schemaValidator.group_schema": {"tf": 2}}, "df": 5}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}}, "v": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1.4142135623730951}}, "df": 1}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2.8284271247461903}, "pyxtream.schemaValidator.series_info_schema": {"tf": 2}, "pyxtream.schemaValidator.live_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.4142135623730951}}, "df": 4}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.4142135623730951}}, "df": 3}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}}}}, "y": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}}}}}, "signature": {"root": {"0": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 2}}, "df": 1}, "2": {"8": {"8": {"0": {"0": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"9": {"docs": {"pyxtream.progress.progress": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 2.8284271247461903}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}}, "df": 4}, "docs": {}, "df": 0}, "5": {"0": {"0": {"0": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"pyxtream.progress.progress": {"tf": 4.898979485566356}, "pyxtream.pyxtream.Channel.__init__": {"tf": 4.47213595499958}, "pyxtream.pyxtream.Channel.export_json": {"tf": 3.1622776601683795}, "pyxtream.pyxtream.Group.__init__": {"tf": 4.47213595499958}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 3.7416573867739413}, "pyxtream.pyxtream.Episode.__init__": {"tf": 4.898979485566356}, "pyxtream.pyxtream.Serie.__init__": {"tf": 4}, "pyxtream.pyxtream.Serie.export_json": {"tf": 3.1622776601683795}, "pyxtream.pyxtream.Season.__init__": {"tf": 2.8284271247461903}, "pyxtream.pyxtream.XTream.__init__": {"tf": 11.489125293076057}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 9.539392014169456}, "pyxtream.pyxtream.XTream.download_video": {"tf": 4.47213595499958}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 3.1622776601683795}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 4.242640687119285}, "pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 3.7416573867739413}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 3.7416573867739413}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 4.242640687119285}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 3.7416573867739413}, "pyxtream.pyxtream.XTream.allEpg": {"tf": 3.1622776601683795}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 4}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 4}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 4}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 4}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 4}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 4}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 4.47213595499958}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 4}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 3.4641016151377544}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 3.4641016151377544}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 8.94427190999916}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 3.1622776601683795}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 5.830951894845301}, "pyxtream.schemaValidator.schemaValidator": {"tf": 5.656854249492381}}, "df": 40, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.progress.progress": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}}, "df": 3}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.progress.progress": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}}, "df": 2}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}}, "df": 2}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 3}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.progress.progress": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {"pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 2.23606797749979}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.schemaValidator": {"tf": 1}}, "df": 21, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}}, "df": 10}}}}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"pyxtream.pyxtream.Channel.export_json": {"tf": 1}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.allEpg": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 30}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}}, "df": 5}}}}, "c": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}}, "df": 1}}}}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.schemaValidator": {"tf": 1.4142135623730951}}, "df": 1}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.schemaValidator": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 4}}}}}}, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 4}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}}, "df": 3}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}}, "df": 4}}, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 3}}, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}}, "df": 13}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}}, "df": 3}}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Episode.__init__": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Season.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 5}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1.7320508075688772}}, "df": 3}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}, "y": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.schemaValidator.schemaValidator": {"tf": 1}}, "df": 1}}}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.schemaValidator.schemaValidator": {"tf": 1}}, "df": 5}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}}, "df": 2}}}, "j": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.schemaValidator.schemaValidator": {"tf": 1}}, "df": 1}}}}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1.7320508075688772}}, "df": 1}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}}, "df": 2}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}}}, "bases": {"root": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.schemaValidator.SchemaType": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "doc": {"root": {"1": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}, "2": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}, "docs": {"pyxtream": {"tf": 1.7320508075688772}, "pyxtream.progress": {"tf": 1.7320508075688772}, "pyxtream.progress.progress": {"tf": 1.7320508075688772}, "pyxtream.pyxtream": {"tf": 6.082762530298219}, "pyxtream.pyxtream.Channel": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.__init__": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.info": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.id": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.name": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.logo": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.group_title": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.title": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.url": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.stream_type": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.is_adult": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.added": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.date_now": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.raw": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.export_json": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.__init__": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.name": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.group_type": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.group_id": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.raw": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.channels": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.series": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.region_longname": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.title": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.name": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.info": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.raw": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.id": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.container_extension": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.episode_number": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.av_info": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.logo": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.url": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.name": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.logo": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.plot": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.genre": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.raw": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.xtream": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.seasons": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.episodes": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Season": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Season.__init__": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Season.name": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Season.episodes": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.__init__": {"tf": 5.291502622129181}, "pyxtream.pyxtream.XTream.name": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.server": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.username": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.password": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.auth_data": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.authorization": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.groups": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.channels": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.series": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.movies": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.movies_30days": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.movies_7days": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.connection_headers": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.state": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.cache_path": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.validate_json": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.download_video": {"tf": 2.6457513110645907}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 4.123105625617661}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 2.23606797749979}, "pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.allEpg": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1.7320508075688772}, "pyxtream.rest_api": {"tf": 1.7320508075688772}, "pyxtream.rest_api.EndpointAction": {"tf": 1.7320508075688772}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1.7320508075688772}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1.7320508075688772}, "pyxtream.rest_api.EndpointAction.action": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap": {"tf": 2.449489742783178}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 5.5677643628300215}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.debug": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.xt": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 2.449489742783178}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 3}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 2.449489742783178}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.SchemaType": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.live_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.channel_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.group_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.schemaValidator": {"tf": 1.7320508075688772}, "pyxtream.version": {"tf": 1.7320508075688772}}, "df": 153, "p": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.7320508075688772}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 2}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 3}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 1}}, "df": 2}, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"3": {"docs": {}, "df": 0, "u": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}, "docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}, "y": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 2}, "i": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1.7320508075688772}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 2}}, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1}}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"pyxtream.pyxtream": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1.4142135623730951}}, "df": 1, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 2}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 2}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 3}}}}}}}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 2, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.7320508075688772}}, "df": 3}}}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.7320508075688772}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.__init__": {"tf": 2.23606797749979}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 2.23606797749979}}, "df": 3}}}}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 2.6457513110645907}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.7320508075688772}}, "df": 4, "f": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}, "l": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2.23606797749979}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.7320508075688772}}, "df": 2}}}}}}}, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 3}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 3}, "b": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1.4142135623730951}}, "df": 3}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 5}}, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 3.1622776601683795}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 3}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 2}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 2.449489742783178}}, "df": 9, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 2}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 2}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 2.449489742783178}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 4, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1.4142135623730951}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 3}}}, "o": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 2}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 2.23606797749979}, "pyxtream.rest_api.FlaskWrap": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 2.449489742783178}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 8, "o": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 2}}}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1.7320508075688772}}, "df": 1, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}, "v": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}}, "df": 1}, "w": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": null}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": null}, "pyxtream.rest_api.FlaskWrap.name": {"tf": null}, "pyxtream.rest_api.FlaskWrap.run": {"tf": null}}, "df": 4}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}, "/": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}}, "df": 1}}, "n": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 3}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 2}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}}, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 6}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 6, "m": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 2}}}, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 2.23606797749979}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 2.449489742783178}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 7, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 6}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 2}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1.4142135623730951}}, "df": 2}}}}}}}, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 5}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "d": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 2}}, "df": 1}}, "p": {"docs": {}, "df": 0, "i": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.7320508075688772}}, "df": 1}}, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1.4142135623730951}}, "df": 5}, "y": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 2}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 2.23606797749979}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 3}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}, "b": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 2}}}}}}}}, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.7320508075688772}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1.4142135623730951}}, "df": 1}}}, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1.4142135623730951}}, "df": 1, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}}}}}}, "b": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 3, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2.23606797749979}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 3, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1.7320508075688772}}, "df": 3, "s": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 2}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "d": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 2}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}}, "df": 2}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 2}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1.7320508075688772}}, "df": 2}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 2}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}}}}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}}, "df": 2}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}, "y": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}}, "df": 1, "o": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1, "t": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 4, "e": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 2}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1.4142135623730951}}, "df": 3}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 2}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 5, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 4, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 2}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "v": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 2}}}, "f": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 5}, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "d": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1.7320508075688772}}, "df": 1, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 2.8284271247461903}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 2.23606797749979}}, "df": 3}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 2}}}, "r": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 4}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}}}}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 3, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 3, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 6, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 3}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "y": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 3}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 3}, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 3}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 4, "i": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}}, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.authenticate": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 2.23606797749979}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 2}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}}, "df": 1}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 3}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}}, "df": 2}}}}}}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1.4142135623730951}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}}, "df": 1}}}, "j": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 2}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 3}}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 2}}}}}}, "y": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}}}}, "pipeline": ["trimmer"], "_isPrebuiltIndex": true}; + /** pdoc search index */const docs = {"version": "0.9.5", "fields": ["qualname", "fullname", "annotation", "default_value", "signature", "bases", "doc"], "ref": "fullname", "documentStore": {"docs": {"pyxtream": {"fullname": "pyxtream", "modulename": "pyxtream", "kind": "module", "doc": "

    \n"}, "pyxtream.progress": {"fullname": "pyxtream.progress", "modulename": "pyxtream.progress", "kind": "module", "doc": "

    \n"}, "pyxtream.progress.progress": {"fullname": "pyxtream.progress.progress", "modulename": "pyxtream.progress", "qualname": "progress", "kind": "function", "doc": "

    \n", "signature": "(count, total, status=''):", "funcdef": "def"}, "pyxtream.pyxtream": {"fullname": "pyxtream.pyxtream", "modulename": "pyxtream.pyxtream", "kind": "module", "doc": "

    pyxtream

    \n\n

    Module handles downloading xtream data.

    \n\n

    Part of this content comes from

    \n\n\n\n
    \n

    _Author_: Claudio Olmi\n _Github_: superolmo

    \n
    \n\n
    \n

    _Note_: It does not support M3U

    \n
    \n"}, "pyxtream.pyxtream.Channel": {"fullname": "pyxtream.pyxtream.Channel", "modulename": "pyxtream.pyxtream", "qualname": "Channel", "kind": "class", "doc": "

    \n"}, "pyxtream.pyxtream.Channel.__init__": {"fullname": "pyxtream.pyxtream.Channel.__init__", "modulename": "pyxtream.pyxtream", "qualname": "Channel.__init__", "kind": "function", "doc": "

    \n", "signature": "(xtream: object, group_title, stream_info)"}, "pyxtream.pyxtream.Channel.info": {"fullname": "pyxtream.pyxtream.Channel.info", "modulename": "pyxtream.pyxtream", "qualname": "Channel.info", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.id": {"fullname": "pyxtream.pyxtream.Channel.id", "modulename": "pyxtream.pyxtream", "qualname": "Channel.id", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.name": {"fullname": "pyxtream.pyxtream.Channel.name", "modulename": "pyxtream.pyxtream", "qualname": "Channel.name", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.logo": {"fullname": "pyxtream.pyxtream.Channel.logo", "modulename": "pyxtream.pyxtream", "qualname": "Channel.logo", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.logo_path": {"fullname": "pyxtream.pyxtream.Channel.logo_path", "modulename": "pyxtream.pyxtream", "qualname": "Channel.logo_path", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.group_title": {"fullname": "pyxtream.pyxtream.Channel.group_title", "modulename": "pyxtream.pyxtream", "qualname": "Channel.group_title", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.title": {"fullname": "pyxtream.pyxtream.Channel.title", "modulename": "pyxtream.pyxtream", "qualname": "Channel.title", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.url": {"fullname": "pyxtream.pyxtream.Channel.url", "modulename": "pyxtream.pyxtream", "qualname": "Channel.url", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.stream_type": {"fullname": "pyxtream.pyxtream.Channel.stream_type", "modulename": "pyxtream.pyxtream", "qualname": "Channel.stream_type", "kind": "variable", "doc": "

    \n", "annotation": ": str", "default_value": "''"}, "pyxtream.pyxtream.Channel.group_id": {"fullname": "pyxtream.pyxtream.Channel.group_id", "modulename": "pyxtream.pyxtream", "qualname": "Channel.group_id", "kind": "variable", "doc": "

    \n", "annotation": ": str", "default_value": "''"}, "pyxtream.pyxtream.Channel.is_adult": {"fullname": "pyxtream.pyxtream.Channel.is_adult", "modulename": "pyxtream.pyxtream", "qualname": "Channel.is_adult", "kind": "variable", "doc": "

    \n", "annotation": ": int", "default_value": "0"}, "pyxtream.pyxtream.Channel.added": {"fullname": "pyxtream.pyxtream.Channel.added", "modulename": "pyxtream.pyxtream", "qualname": "Channel.added", "kind": "variable", "doc": "

    \n", "annotation": ": int", "default_value": "0"}, "pyxtream.pyxtream.Channel.epg_channel_id": {"fullname": "pyxtream.pyxtream.Channel.epg_channel_id", "modulename": "pyxtream.pyxtream", "qualname": "Channel.epg_channel_id", "kind": "variable", "doc": "

    \n", "annotation": ": str", "default_value": "''"}, "pyxtream.pyxtream.Channel.age_days_from_added": {"fullname": "pyxtream.pyxtream.Channel.age_days_from_added", "modulename": "pyxtream.pyxtream", "qualname": "Channel.age_days_from_added", "kind": "variable", "doc": "

    \n", "annotation": ": int", "default_value": "0"}, "pyxtream.pyxtream.Channel.date_now": {"fullname": "pyxtream.pyxtream.Channel.date_now", "modulename": "pyxtream.pyxtream", "qualname": "Channel.date_now", "kind": "variable", "doc": "

    \n", "annotation": ": datetime.datetime"}, "pyxtream.pyxtream.Channel.raw": {"fullname": "pyxtream.pyxtream.Channel.raw", "modulename": "pyxtream.pyxtream", "qualname": "Channel.raw", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Channel.export_json": {"fullname": "pyxtream.pyxtream.Channel.export_json", "modulename": "pyxtream.pyxtream", "qualname": "Channel.export_json", "kind": "function", "doc": "

    \n", "signature": "(self):", "funcdef": "def"}, "pyxtream.pyxtream.Group": {"fullname": "pyxtream.pyxtream.Group", "modulename": "pyxtream.pyxtream", "qualname": "Group", "kind": "class", "doc": "

    \n"}, "pyxtream.pyxtream.Group.__init__": {"fullname": "pyxtream.pyxtream.Group.__init__", "modulename": "pyxtream.pyxtream", "qualname": "Group.__init__", "kind": "function", "doc": "

    \n", "signature": "(group_info: dict, stream_type: str)"}, "pyxtream.pyxtream.Group.name": {"fullname": "pyxtream.pyxtream.Group.name", "modulename": "pyxtream.pyxtream", "qualname": "Group.name", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Group.group_type": {"fullname": "pyxtream.pyxtream.Group.group_type", "modulename": "pyxtream.pyxtream", "qualname": "Group.group_type", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Group.group_id": {"fullname": "pyxtream.pyxtream.Group.group_id", "modulename": "pyxtream.pyxtream", "qualname": "Group.group_id", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Group.raw": {"fullname": "pyxtream.pyxtream.Group.raw", "modulename": "pyxtream.pyxtream", "qualname": "Group.raw", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"fullname": "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname", "modulename": "pyxtream.pyxtream", "qualname": "Group.convert_region_shortname_to_fullname", "kind": "function", "doc": "

    \n", "signature": "(self, shortname):", "funcdef": "def"}, "pyxtream.pyxtream.Group.channels": {"fullname": "pyxtream.pyxtream.Group.channels", "modulename": "pyxtream.pyxtream", "qualname": "Group.channels", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Group.series": {"fullname": "pyxtream.pyxtream.Group.series", "modulename": "pyxtream.pyxtream", "qualname": "Group.series", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Group.region_shortname": {"fullname": "pyxtream.pyxtream.Group.region_shortname", "modulename": "pyxtream.pyxtream", "qualname": "Group.region_shortname", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Group.region_longname": {"fullname": "pyxtream.pyxtream.Group.region_longname", "modulename": "pyxtream.pyxtream", "qualname": "Group.region_longname", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode": {"fullname": "pyxtream.pyxtream.Episode", "modulename": "pyxtream.pyxtream", "qualname": "Episode", "kind": "class", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.__init__": {"fullname": "pyxtream.pyxtream.Episode.__init__", "modulename": "pyxtream.pyxtream", "qualname": "Episode.__init__", "kind": "function", "doc": "

    \n", "signature": "(xtream: object, series_info, group_title, episode_info)"}, "pyxtream.pyxtream.Episode.title": {"fullname": "pyxtream.pyxtream.Episode.title", "modulename": "pyxtream.pyxtream", "qualname": "Episode.title", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Episode.name": {"fullname": "pyxtream.pyxtream.Episode.name", "modulename": "pyxtream.pyxtream", "qualname": "Episode.name", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Episode.info": {"fullname": "pyxtream.pyxtream.Episode.info", "modulename": "pyxtream.pyxtream", "qualname": "Episode.info", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Episode.raw": {"fullname": "pyxtream.pyxtream.Episode.raw", "modulename": "pyxtream.pyxtream", "qualname": "Episode.raw", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Episode.group_title": {"fullname": "pyxtream.pyxtream.Episode.group_title", "modulename": "pyxtream.pyxtream", "qualname": "Episode.group_title", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.id": {"fullname": "pyxtream.pyxtream.Episode.id", "modulename": "pyxtream.pyxtream", "qualname": "Episode.id", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.container_extension": {"fullname": "pyxtream.pyxtream.Episode.container_extension", "modulename": "pyxtream.pyxtream", "qualname": "Episode.container_extension", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.episode_number": {"fullname": "pyxtream.pyxtream.Episode.episode_number", "modulename": "pyxtream.pyxtream", "qualname": "Episode.episode_number", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.av_info": {"fullname": "pyxtream.pyxtream.Episode.av_info", "modulename": "pyxtream.pyxtream", "qualname": "Episode.av_info", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.logo": {"fullname": "pyxtream.pyxtream.Episode.logo", "modulename": "pyxtream.pyxtream", "qualname": "Episode.logo", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.logo_path": {"fullname": "pyxtream.pyxtream.Episode.logo_path", "modulename": "pyxtream.pyxtream", "qualname": "Episode.logo_path", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Episode.url": {"fullname": "pyxtream.pyxtream.Episode.url", "modulename": "pyxtream.pyxtream", "qualname": "Episode.url", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Serie": {"fullname": "pyxtream.pyxtream.Serie", "modulename": "pyxtream.pyxtream", "qualname": "Serie", "kind": "class", "doc": "

    \n"}, "pyxtream.pyxtream.Serie.__init__": {"fullname": "pyxtream.pyxtream.Serie.__init__", "modulename": "pyxtream.pyxtream", "qualname": "Serie.__init__", "kind": "function", "doc": "

    \n", "signature": "(xtream: object, series_info)"}, "pyxtream.pyxtream.Serie.name": {"fullname": "pyxtream.pyxtream.Serie.name", "modulename": "pyxtream.pyxtream", "qualname": "Serie.name", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.logo": {"fullname": "pyxtream.pyxtream.Serie.logo", "modulename": "pyxtream.pyxtream", "qualname": "Serie.logo", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.logo_path": {"fullname": "pyxtream.pyxtream.Serie.logo_path", "modulename": "pyxtream.pyxtream", "qualname": "Serie.logo_path", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.series_id": {"fullname": "pyxtream.pyxtream.Serie.series_id", "modulename": "pyxtream.pyxtream", "qualname": "Serie.series_id", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.plot": {"fullname": "pyxtream.pyxtream.Serie.plot", "modulename": "pyxtream.pyxtream", "qualname": "Serie.plot", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.youtube_trailer": {"fullname": "pyxtream.pyxtream.Serie.youtube_trailer", "modulename": "pyxtream.pyxtream", "qualname": "Serie.youtube_trailer", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.genre": {"fullname": "pyxtream.pyxtream.Serie.genre", "modulename": "pyxtream.pyxtream", "qualname": "Serie.genre", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.raw": {"fullname": "pyxtream.pyxtream.Serie.raw", "modulename": "pyxtream.pyxtream", "qualname": "Serie.raw", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Serie.xtream": {"fullname": "pyxtream.pyxtream.Serie.xtream", "modulename": "pyxtream.pyxtream", "qualname": "Serie.xtream", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Serie.seasons": {"fullname": "pyxtream.pyxtream.Serie.seasons", "modulename": "pyxtream.pyxtream", "qualname": "Serie.seasons", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Serie.episodes": {"fullname": "pyxtream.pyxtream.Serie.episodes", "modulename": "pyxtream.pyxtream", "qualname": "Serie.episodes", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Serie.url": {"fullname": "pyxtream.pyxtream.Serie.url", "modulename": "pyxtream.pyxtream", "qualname": "Serie.url", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.Serie.export_json": {"fullname": "pyxtream.pyxtream.Serie.export_json", "modulename": "pyxtream.pyxtream", "qualname": "Serie.export_json", "kind": "function", "doc": "

    \n", "signature": "(self):", "funcdef": "def"}, "pyxtream.pyxtream.Season": {"fullname": "pyxtream.pyxtream.Season", "modulename": "pyxtream.pyxtream", "qualname": "Season", "kind": "class", "doc": "

    \n"}, "pyxtream.pyxtream.Season.__init__": {"fullname": "pyxtream.pyxtream.Season.__init__", "modulename": "pyxtream.pyxtream", "qualname": "Season.__init__", "kind": "function", "doc": "

    \n", "signature": "(name)"}, "pyxtream.pyxtream.Season.name": {"fullname": "pyxtream.pyxtream.Season.name", "modulename": "pyxtream.pyxtream", "qualname": "Season.name", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.Season.episodes": {"fullname": "pyxtream.pyxtream.Season.episodes", "modulename": "pyxtream.pyxtream", "qualname": "Season.episodes", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.XTream": {"fullname": "pyxtream.pyxtream.XTream", "modulename": "pyxtream.pyxtream", "qualname": "XTream", "kind": "class", "doc": "

    \n"}, "pyxtream.pyxtream.XTream.__init__": {"fullname": "pyxtream.pyxtream.XTream.__init__", "modulename": "pyxtream.pyxtream", "qualname": "XTream.__init__", "kind": "function", "doc": "

    Initialize Xtream Class

    \n\n

    Args:\n provider_name (str): Name of the IPTV provider\n provider_username (str): User name of the IPTV provider\n provider_password (str): Password of the IPTV provider\n provider_url (str): URL of the IPTV provider\n headers (dict): Requests Headers\n hide_adult_content(bool, optional): When True hide stream that are marked for adult\n cache_path (str, optional): Location where to save loaded files.\n Defaults to empty string.\n reload_time_sec (int, optional): Number of seconds before automatic reloading\n (-1 to turn it OFF)\n validate_json (bool, optional): Check Xtream API provided JSON for validity\n enable_flask (bool, optional): Enable Flask\n debug_flask (bool, optional): Enable the debug mode in Flask

    \n\n

    Returns: XTream Class Instance

    \n\n
      \n
    • Note 1: If it fails to authorize with provided username and password,\nauth_data will be an empty dictionary.
    • \n
    • Note 2: The JSON validation option will take considerable amount of time and it should be\nused only as a debug tool. The Xtream API JSON from the provider passes through a\nschema that represent the best available understanding of how the Xtream API\nworks.
    • \n
    \n", "signature": "(\tprovider_name: str,\tprovider_username: str,\tprovider_password: str,\tprovider_url: str,\theaders: dict = None,\thide_adult_content: bool = False,\tcache_path: str = '',\treload_time_sec: int = 28800,\tvalidate_json: bool = False,\tenable_flask: bool = False,\tdebug_flask: bool = True)"}, "pyxtream.pyxtream.XTream.name": {"fullname": "pyxtream.pyxtream.XTream.name", "modulename": "pyxtream.pyxtream", "qualname": "XTream.name", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.XTream.server": {"fullname": "pyxtream.pyxtream.XTream.server", "modulename": "pyxtream.pyxtream", "qualname": "XTream.server", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.XTream.secure_server": {"fullname": "pyxtream.pyxtream.XTream.secure_server", "modulename": "pyxtream.pyxtream", "qualname": "XTream.secure_server", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.XTream.username": {"fullname": "pyxtream.pyxtream.XTream.username", "modulename": "pyxtream.pyxtream", "qualname": "XTream.username", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.XTream.password": {"fullname": "pyxtream.pyxtream.XTream.password", "modulename": "pyxtream.pyxtream", "qualname": "XTream.password", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.XTream.base_url": {"fullname": "pyxtream.pyxtream.XTream.base_url", "modulename": "pyxtream.pyxtream", "qualname": "XTream.base_url", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.XTream.base_url_ssl": {"fullname": "pyxtream.pyxtream.XTream.base_url_ssl", "modulename": "pyxtream.pyxtream", "qualname": "XTream.base_url_ssl", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.XTream.cache_path": {"fullname": "pyxtream.pyxtream.XTream.cache_path", "modulename": "pyxtream.pyxtream", "qualname": "XTream.cache_path", "kind": "variable", "doc": "

    \n", "default_value": "''"}, "pyxtream.pyxtream.XTream.account_expiration": {"fullname": "pyxtream.pyxtream.XTream.account_expiration", "modulename": "pyxtream.pyxtream", "qualname": "XTream.account_expiration", "kind": "variable", "doc": "

    \n", "annotation": ": datetime.timedelta"}, "pyxtream.pyxtream.XTream.live_type": {"fullname": "pyxtream.pyxtream.XTream.live_type", "modulename": "pyxtream.pyxtream", "qualname": "XTream.live_type", "kind": "variable", "doc": "

    \n", "default_value": "'Live'"}, "pyxtream.pyxtream.XTream.vod_type": {"fullname": "pyxtream.pyxtream.XTream.vod_type", "modulename": "pyxtream.pyxtream", "qualname": "XTream.vod_type", "kind": "variable", "doc": "

    \n", "default_value": "'VOD'"}, "pyxtream.pyxtream.XTream.series_type": {"fullname": "pyxtream.pyxtream.XTream.series_type", "modulename": "pyxtream.pyxtream", "qualname": "XTream.series_type", "kind": "variable", "doc": "

    \n", "default_value": "'Series'"}, "pyxtream.pyxtream.XTream.auth_data": {"fullname": "pyxtream.pyxtream.XTream.auth_data", "modulename": "pyxtream.pyxtream", "qualname": "XTream.auth_data", "kind": "variable", "doc": "

    \n", "default_value": "{}"}, "pyxtream.pyxtream.XTream.authorization": {"fullname": "pyxtream.pyxtream.XTream.authorization", "modulename": "pyxtream.pyxtream", "qualname": "XTream.authorization", "kind": "variable", "doc": "

    \n", "default_value": "{'username': '', 'password': ''}"}, "pyxtream.pyxtream.XTream.groups": {"fullname": "pyxtream.pyxtream.XTream.groups", "modulename": "pyxtream.pyxtream", "qualname": "XTream.groups", "kind": "variable", "doc": "

    \n", "default_value": "[]"}, "pyxtream.pyxtream.XTream.channels": {"fullname": "pyxtream.pyxtream.XTream.channels", "modulename": "pyxtream.pyxtream", "qualname": "XTream.channels", "kind": "variable", "doc": "

    \n", "default_value": "[]"}, "pyxtream.pyxtream.XTream.series": {"fullname": "pyxtream.pyxtream.XTream.series", "modulename": "pyxtream.pyxtream", "qualname": "XTream.series", "kind": "variable", "doc": "

    \n", "default_value": "[]"}, "pyxtream.pyxtream.XTream.movies": {"fullname": "pyxtream.pyxtream.XTream.movies", "modulename": "pyxtream.pyxtream", "qualname": "XTream.movies", "kind": "variable", "doc": "

    \n", "default_value": "[]"}, "pyxtream.pyxtream.XTream.movies_30days": {"fullname": "pyxtream.pyxtream.XTream.movies_30days", "modulename": "pyxtream.pyxtream", "qualname": "XTream.movies_30days", "kind": "variable", "doc": "

    \n", "default_value": "[]"}, "pyxtream.pyxtream.XTream.movies_7days": {"fullname": "pyxtream.pyxtream.XTream.movies_7days", "modulename": "pyxtream.pyxtream", "qualname": "XTream.movies_7days", "kind": "variable", "doc": "

    \n", "default_value": "[]"}, "pyxtream.pyxtream.XTream.connection_headers": {"fullname": "pyxtream.pyxtream.XTream.connection_headers", "modulename": "pyxtream.pyxtream", "qualname": "XTream.connection_headers", "kind": "variable", "doc": "

    \n", "default_value": "{}"}, "pyxtream.pyxtream.XTream.state": {"fullname": "pyxtream.pyxtream.XTream.state", "modulename": "pyxtream.pyxtream", "qualname": "XTream.state", "kind": "variable", "doc": "

    \n", "default_value": "{'authenticated': False, 'loaded': False}"}, "pyxtream.pyxtream.XTream.hide_adult_content": {"fullname": "pyxtream.pyxtream.XTream.hide_adult_content", "modulename": "pyxtream.pyxtream", "qualname": "XTream.hide_adult_content", "kind": "variable", "doc": "

    \n", "default_value": "False"}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"fullname": "pyxtream.pyxtream.XTream.live_catch_all_group", "modulename": "pyxtream.pyxtream", "qualname": "XTream.live_catch_all_group", "kind": "variable", "doc": "

    \n", "default_value": "<pyxtream.pyxtream.Group object>"}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"fullname": "pyxtream.pyxtream.XTream.vod_catch_all_group", "modulename": "pyxtream.pyxtream", "qualname": "XTream.vod_catch_all_group", "kind": "variable", "doc": "

    \n", "default_value": "<pyxtream.pyxtream.Group object>"}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"fullname": "pyxtream.pyxtream.XTream.series_catch_all_group", "modulename": "pyxtream.pyxtream", "qualname": "XTream.series_catch_all_group", "kind": "variable", "doc": "

    \n", "default_value": "<pyxtream.pyxtream.Group object>"}, "pyxtream.pyxtream.XTream.threshold_time_sec": {"fullname": "pyxtream.pyxtream.XTream.threshold_time_sec", "modulename": "pyxtream.pyxtream", "qualname": "XTream.threshold_time_sec", "kind": "variable", "doc": "

    \n", "default_value": "-1"}, "pyxtream.pyxtream.XTream.validate_json": {"fullname": "pyxtream.pyxtream.XTream.validate_json", "modulename": "pyxtream.pyxtream", "qualname": "XTream.validate_json", "kind": "variable", "doc": "

    \n", "annotation": ": bool", "default_value": "True"}, "pyxtream.pyxtream.XTream.download_progress": {"fullname": "pyxtream.pyxtream.XTream.download_progress", "modulename": "pyxtream.pyxtream", "qualname": "XTream.download_progress", "kind": "variable", "doc": "

    \n", "annotation": ": dict", "default_value": "{'StreamId': 0, 'Total': 0, 'Progress': 0}"}, "pyxtream.pyxtream.XTream.app_fullpath": {"fullname": "pyxtream.pyxtream.XTream.app_fullpath", "modulename": "pyxtream.pyxtream", "qualname": "XTream.app_fullpath", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.XTream.html_template_folder": {"fullname": "pyxtream.pyxtream.XTream.html_template_folder", "modulename": "pyxtream.pyxtream", "qualname": "XTream.html_template_folder", "kind": "variable", "doc": "

    \n"}, "pyxtream.pyxtream.XTream.get_download_progress": {"fullname": "pyxtream.pyxtream.XTream.get_download_progress", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_download_progress", "kind": "function", "doc": "

    \n", "signature": "(self, stream_id: int = None):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_last_7days": {"fullname": "pyxtream.pyxtream.XTream.get_last_7days", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_last_7days", "kind": "function", "doc": "

    \n", "signature": "(self):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.search_stream": {"fullname": "pyxtream.pyxtream.XTream.search_stream", "modulename": "pyxtream.pyxtream", "qualname": "XTream.search_stream", "kind": "function", "doc": "

    Search for streams

    \n\n

    Args:\n keyword (str): Keyword to search for. Supports REGEX\n ignore_case (bool, optional): True to ignore case during search. Defaults to \"True\".\n return_type (str, optional): Output format, 'LIST' or 'JSON'. Defaults to \"LIST\".\n stream_type (list, optional): Search within specific stream type.\n added_after (datetime, optional): Search for items that have been added after a certain date.

    \n\n

    Returns:\n list: List with all the results, it could be empty.

    \n", "signature": "(\tself,\tkeyword: str,\tignore_case: bool = True,\treturn_type: str = 'LIST',\tstream_type: list = ('series', 'movies', 'channels'),\tadded_after: datetime.datetime = None) -> list:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.download_video": {"fullname": "pyxtream.pyxtream.XTream.download_video", "modulename": "pyxtream.pyxtream", "qualname": "XTream.download_video", "kind": "function", "doc": "

    Download Video from Stream ID

    \n\n

    Args:\n stream_id (int): String identifying the stream ID

    \n\n

    Returns:\n str: Absolute Path Filename where the file was saved. Empty if could not download

    \n", "signature": "(self, stream_id: int) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.authenticate": {"fullname": "pyxtream.pyxtream.XTream.authenticate", "modulename": "pyxtream.pyxtream", "qualname": "XTream.authenticate", "kind": "function", "doc": "

    Login to provider

    \n", "signature": "(self):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.load_iptv": {"fullname": "pyxtream.pyxtream.XTream.load_iptv", "modulename": "pyxtream.pyxtream", "qualname": "XTream.load_iptv", "kind": "function", "doc": "

    Load XTream IPTV

    \n\n
      \n
    • Add all Live TV to XTream.channels
    • \n
    • Add all VOD to XTream.movies
    • \n
    • Add all Series to XTream.series\nSeries contains Seasons and Episodes. Those are not automatically\nretrieved from the server to reduce the loading time.
    • \n
    • Add all groups to XTream.groups\nGroups are for all three channel types, Live TV, VOD, and Series
    • \n
    \n\n

    Returns:\n bool: True if successful, False if error

    \n", "signature": "(self) -> bool:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"fullname": "pyxtream.pyxtream.XTream.get_series_info_by_id", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_series_info_by_id", "kind": "function", "doc": "

    Get Seasons and Episodes for a Series

    \n\n

    Args:\n get_series (dict): Series dictionary

    \n", "signature": "(self, get_series: dict):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.vodInfoByID": {"fullname": "pyxtream.pyxtream.XTream.vodInfoByID", "modulename": "pyxtream.pyxtream", "qualname": "XTream.vodInfoByID", "kind": "function", "doc": "

    \n", "signature": "(self, vod_id):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"fullname": "pyxtream.pyxtream.XTream.liveEpgByStream", "modulename": "pyxtream.pyxtream", "qualname": "XTream.liveEpgByStream", "kind": "function", "doc": "

    \n", "signature": "(self, stream_id):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"fullname": "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit", "modulename": "pyxtream.pyxtream", "qualname": "XTream.liveEpgByStreamAndLimit", "kind": "function", "doc": "

    \n", "signature": "(self, stream_id, limit):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"fullname": "pyxtream.pyxtream.XTream.allLiveEpgByStream", "modulename": "pyxtream.pyxtream", "qualname": "XTream.allLiveEpgByStream", "kind": "function", "doc": "

    \n", "signature": "(self, stream_id):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.allEpg": {"fullname": "pyxtream.pyxtream.XTream.allEpg", "modulename": "pyxtream.pyxtream", "qualname": "XTream.allEpg", "kind": "function", "doc": "

    \n", "signature": "(self):", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"fullname": "pyxtream.pyxtream.XTream.get_live_categories_URL", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_live_categories_URL", "kind": "function", "doc": "

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"fullname": "pyxtream.pyxtream.XTream.get_live_streams_URL", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_live_streams_URL", "kind": "function", "doc": "

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"fullname": "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_live_streams_URL_by_category", "kind": "function", "doc": "

    \n", "signature": "(self, category_id) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"fullname": "pyxtream.pyxtream.XTream.get_vod_cat_URL", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_vod_cat_URL", "kind": "function", "doc": "

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"fullname": "pyxtream.pyxtream.XTream.get_vod_streams_URL", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_vod_streams_URL", "kind": "function", "doc": "

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"fullname": "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_vod_streams_URL_by_category", "kind": "function", "doc": "

    \n", "signature": "(self, category_id) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"fullname": "pyxtream.pyxtream.XTream.get_series_cat_URL", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_series_cat_URL", "kind": "function", "doc": "

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_series_URL": {"fullname": "pyxtream.pyxtream.XTream.get_series_URL", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_series_URL", "kind": "function", "doc": "

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"fullname": "pyxtream.pyxtream.XTream.get_series_URL_by_category", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_series_URL_by_category", "kind": "function", "doc": "

    \n", "signature": "(self, category_id) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"fullname": "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_series_info_URL_by_ID", "kind": "function", "doc": "

    \n", "signature": "(self, series_id) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"fullname": "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_VOD_info_URL_by_ID", "kind": "function", "doc": "

    \n", "signature": "(self, vod_id) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"fullname": "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_live_epg_URL_by_stream", "kind": "function", "doc": "

    \n", "signature": "(self, stream_id) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"fullname": "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_live_epg_URL_by_stream_and_limit", "kind": "function", "doc": "

    \n", "signature": "(self, stream_id, limit) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"fullname": "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_all_live_epg_URL_by_stream", "kind": "function", "doc": "

    \n", "signature": "(self, stream_id) -> str:", "funcdef": "def"}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"fullname": "pyxtream.pyxtream.XTream.get_all_epg_URL", "modulename": "pyxtream.pyxtream", "qualname": "XTream.get_all_epg_URL", "kind": "function", "doc": "

    \n", "signature": "(self) -> str:", "funcdef": "def"}, "pyxtream.rest_api": {"fullname": "pyxtream.rest_api", "modulename": "pyxtream.rest_api", "kind": "module", "doc": "

    \n"}, "pyxtream.rest_api.EndpointAction": {"fullname": "pyxtream.rest_api.EndpointAction", "modulename": "pyxtream.rest_api", "qualname": "EndpointAction", "kind": "class", "doc": "

    \n"}, "pyxtream.rest_api.EndpointAction.__init__": {"fullname": "pyxtream.rest_api.EndpointAction.__init__", "modulename": "pyxtream.rest_api", "qualname": "EndpointAction.__init__", "kind": "function", "doc": "

    \n", "signature": "(action, function_name)"}, "pyxtream.rest_api.EndpointAction.response": {"fullname": "pyxtream.rest_api.EndpointAction.response", "modulename": "pyxtream.rest_api", "qualname": "EndpointAction.response", "kind": "variable", "doc": "

    \n", "annotation": ": flask.wrappers.Response"}, "pyxtream.rest_api.EndpointAction.function_name": {"fullname": "pyxtream.rest_api.EndpointAction.function_name", "modulename": "pyxtream.rest_api", "qualname": "EndpointAction.function_name", "kind": "variable", "doc": "

    \n"}, "pyxtream.rest_api.EndpointAction.action": {"fullname": "pyxtream.rest_api.EndpointAction.action", "modulename": "pyxtream.rest_api", "qualname": "EndpointAction.action", "kind": "variable", "doc": "

    \n"}, "pyxtream.rest_api.FlaskWrap": {"fullname": "pyxtream.rest_api.FlaskWrap", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap", "kind": "class", "doc": "

    A class that represents a thread of control.

    \n\n

    This class can be safely subclassed in a limited fashion. There are two ways\nto specify the activity: by passing a callable object to the constructor, or\nby overriding the run() method in a subclass.

    \n", "bases": "threading.Thread"}, "pyxtream.rest_api.FlaskWrap.__init__": {"fullname": "pyxtream.rest_api.FlaskWrap.__init__", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.__init__", "kind": "function", "doc": "

    This constructor should always be called with keyword arguments. Arguments are:

    \n\n

    group should be None; reserved for future extension when a ThreadGroup\nclass is implemented.

    \n\n

    target is the callable object to be invoked by the run()\nmethod. Defaults to None, meaning nothing is called.

    \n\n

    name is the thread name. By default, a unique name is constructed of\nthe form \"Thread-N\" where N is a small decimal number.

    \n\n

    args is a list or tuple of arguments for the target invocation. Defaults to ().

    \n\n

    kwargs is a dictionary of keyword arguments for the target\ninvocation. Defaults to {}.

    \n\n

    If a subclass overrides the constructor, it must make sure to invoke\nthe base class constructor (Thread.__init__()) before doing anything\nelse to the thread.

    \n", "signature": "(\tname,\txtream: object,\thtml_template_folder: str = None,\thost: str = '0.0.0.0',\tport: int = 5000,\tdebug: bool = True)"}, "pyxtream.rest_api.FlaskWrap.home_template": {"fullname": "pyxtream.rest_api.FlaskWrap.home_template", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.home_template", "kind": "variable", "doc": "

    \n", "default_value": "'\\n<!DOCTYPE html><html lang="en"><head></head><body>pyxtream API</body></html>\\n '"}, "pyxtream.rest_api.FlaskWrap.host": {"fullname": "pyxtream.rest_api.FlaskWrap.host", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.host", "kind": "variable", "doc": "

    \n", "annotation": ": str", "default_value": "''"}, "pyxtream.rest_api.FlaskWrap.port": {"fullname": "pyxtream.rest_api.FlaskWrap.port", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.port", "kind": "variable", "doc": "

    \n", "annotation": ": int", "default_value": "0"}, "pyxtream.rest_api.FlaskWrap.debug": {"fullname": "pyxtream.rest_api.FlaskWrap.debug", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.debug", "kind": "variable", "doc": "

    \n"}, "pyxtream.rest_api.FlaskWrap.app": {"fullname": "pyxtream.rest_api.FlaskWrap.app", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.app", "kind": "variable", "doc": "

    \n"}, "pyxtream.rest_api.FlaskWrap.xt": {"fullname": "pyxtream.rest_api.FlaskWrap.xt", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.xt", "kind": "variable", "doc": "

    \n"}, "pyxtream.rest_api.FlaskWrap.name": {"fullname": "pyxtream.rest_api.FlaskWrap.name", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.name", "kind": "variable", "doc": "

    A string used for identification purposes only.

    \n\n

    It has no semantics. Multiple threads may be given the same name. The\ninitial name is set by the constructor.

    \n"}, "pyxtream.rest_api.FlaskWrap.daemon": {"fullname": "pyxtream.rest_api.FlaskWrap.daemon", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.daemon", "kind": "variable", "doc": "

    A boolean value indicating whether this thread is a daemon thread.

    \n\n

    This must be set before start() is called, otherwise RuntimeError is\nraised. Its initial value is inherited from the creating thread; the\nmain thread is not a daemon thread and therefore all threads created in\nthe main thread default to daemon = False.

    \n\n

    The entire Python program exits when only daemon threads are left.

    \n"}, "pyxtream.rest_api.FlaskWrap.run": {"fullname": "pyxtream.rest_api.FlaskWrap.run", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.run", "kind": "function", "doc": "

    Method representing the thread's activity.

    \n\n

    You may override this method in a subclass. The standard run() method\ninvokes the callable object passed to the object's constructor as the\ntarget argument, if any, with sequential and keyword arguments taken\nfrom the args and kwargs arguments, respectively.

    \n", "signature": "(self):", "funcdef": "def"}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"fullname": "pyxtream.rest_api.FlaskWrap.add_endpoint", "modulename": "pyxtream.rest_api", "qualname": "FlaskWrap.add_endpoint", "kind": "function", "doc": "

    \n", "signature": "(self, endpoint=None, endpoint_name=None, handler=None):", "funcdef": "def"}, "pyxtream.schemaValidator": {"fullname": "pyxtream.schemaValidator", "modulename": "pyxtream.schemaValidator", "kind": "module", "doc": "

    \n"}, "pyxtream.schemaValidator.SchemaType": {"fullname": "pyxtream.schemaValidator.SchemaType", "modulename": "pyxtream.schemaValidator", "qualname": "SchemaType", "kind": "class", "doc": "

    \n", "bases": "enum.Enum"}, "pyxtream.schemaValidator.SchemaType.SERIES": {"fullname": "pyxtream.schemaValidator.SchemaType.SERIES", "modulename": "pyxtream.schemaValidator", "qualname": "SchemaType.SERIES", "kind": "variable", "doc": "

    \n", "default_value": "<SchemaType.SERIES: 1>"}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"fullname": "pyxtream.schemaValidator.SchemaType.SERIES_INFO", "modulename": "pyxtream.schemaValidator", "qualname": "SchemaType.SERIES_INFO", "kind": "variable", "doc": "

    \n", "default_value": "<SchemaType.SERIES_INFO: 2>"}, "pyxtream.schemaValidator.SchemaType.LIVE": {"fullname": "pyxtream.schemaValidator.SchemaType.LIVE", "modulename": "pyxtream.schemaValidator", "qualname": "SchemaType.LIVE", "kind": "variable", "doc": "

    \n", "default_value": "<SchemaType.LIVE: 3>"}, "pyxtream.schemaValidator.SchemaType.VOD": {"fullname": "pyxtream.schemaValidator.SchemaType.VOD", "modulename": "pyxtream.schemaValidator", "qualname": "SchemaType.VOD", "kind": "variable", "doc": "

    \n", "default_value": "<SchemaType.VOD: 4>"}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"fullname": "pyxtream.schemaValidator.SchemaType.CHANNEL", "modulename": "pyxtream.schemaValidator", "qualname": "SchemaType.CHANNEL", "kind": "variable", "doc": "

    \n", "default_value": "<SchemaType.CHANNEL: 5>"}, "pyxtream.schemaValidator.SchemaType.GROUP": {"fullname": "pyxtream.schemaValidator.SchemaType.GROUP", "modulename": "pyxtream.schemaValidator", "qualname": "SchemaType.GROUP", "kind": "variable", "doc": "

    \n", "default_value": "<SchemaType.GROUP: 6>"}, "pyxtream.schemaValidator.series_schema": {"fullname": "pyxtream.schemaValidator.series_schema", "modulename": "pyxtream.schemaValidator", "qualname": "series_schema", "kind": "variable", "doc": "

    \n", "default_value": "{'$schema': 'https://json-schema.org/draft/2020-12/schema', '$id': 'https://example.com/product.schema.json', 'title': 'Series', 'description': 'xtream API Series Schema', 'type': 'object', 'properties': {'seasons': {'type': 'array', 'items': {'properties': {'air_date': {'type': 'string', 'format': 'date'}, 'episode_count': {'type': 'integer'}, 'id': {'type': 'integer'}, 'name': {'type': 'string'}, 'overview': {'type': 'string'}, 'season_number': {'type': 'integer'}, 'cover': {'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}, 'cover_big': {'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}}, 'required': ['id'], 'title': 'Season'}}, 'info': {'properties': {'name': {'type': 'string'}, 'cover': {'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}, 'plot': {'type': 'string'}, 'cast': {'type': 'string'}, 'director': {'type': 'string'}, 'genre': {'type': 'string'}, 'releaseDate': {'type': 'string', 'format': 'date'}, 'last_modified': {'type': 'string', 'format': 'integer'}, 'rating': {'type': 'string', 'format': 'integer'}, 'rating_5based': {'type': 'number'}, 'backdrop_path': {'type': 'array', 'items': {'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}}, 'youtube_trailed': {'type': 'string'}, 'episode_run_time': {'type': 'string', 'format': 'integer'}, 'category_id': {'type': 'string', 'format': 'integer'}}, 'required': ['name'], 'title': 'Info'}, 'episodes': {'patternProperties': {'^\\\\d+$': {'type': 'array', 'items': {'properties': {'id': {'type': 'string', 'format': 'integer'}, 'episode_num': {'type': 'integer'}, 'title': {'type': 'string'}, 'container_extension': {'type': 'string'}, 'info': {'type': 'object', 'items': {'plot': {'type': 'string'}}}, 'customer_sid': {'type': 'string'}, 'added': {'type': 'string', 'format': 'integer'}, 'season': {'type': 'integer'}, 'direct_source': {'type': 'string'}}}}}}}, 'required': ['info', 'seasons', 'episodes']}"}, "pyxtream.schemaValidator.series_info_schema": {"fullname": "pyxtream.schemaValidator.series_info_schema", "modulename": "pyxtream.schemaValidator", "qualname": "series_info_schema", "kind": "variable", "doc": "

    \n", "default_value": "{'$schema': 'https://json-schema.org/draft/2020-12/schema', '$id': 'https://example.com/product.schema.json', 'title': 'Series', 'description': 'xtream API Series Info Schema', 'type': 'object', 'properties': {'name': {'type': 'string'}, 'cover': {'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}, 'plot': {'type': 'string'}, 'cast': {'type': 'string'}, 'director': {'type': 'string'}, 'genre': {'type': 'string'}, 'releaseDate': {'type': 'string', 'format': 'date'}, 'last_modified': {'type': 'string', 'format': 'integer'}, 'rating': {'type': 'string', 'format': 'integer'}, 'rating_5based': {'type': 'number'}, 'backdrop_path': {'anyOf': [{'type': 'array', 'items': {'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}}, {'type': 'string'}]}, 'youtube_trailed': {'type': 'string'}, 'episode_run_time': {'type': 'string', 'format': 'integer'}, 'category_id': {'type': 'string', 'format': 'integer'}}, 'required': ['name', 'category_id']}"}, "pyxtream.schemaValidator.live_schema": {"fullname": "pyxtream.schemaValidator.live_schema", "modulename": "pyxtream.schemaValidator", "qualname": "live_schema", "kind": "variable", "doc": "

    \n", "default_value": "{'$schema': 'https://json-schema.org/draft/2020-12/schema', '$id': 'https://example.com/product.schema.json', 'title': 'Live', 'description': 'xtream API Live Schema', 'type': 'object', 'properties': {'num': {'type': 'integer'}, 'name': {'type': 'string'}, 'stream_type': {'type': 'string'}, 'stream_id': {'type': 'integer'}, 'stream_icon': {'anyOf': [{'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}, {'type': 'null'}]}, 'epg_channel_id': {'anyOf': [{'type': 'null'}, {'type': 'string'}]}, 'added': {'type': 'string', 'format': 'integer'}, 'is_adult': {'type': 'string', 'format': 'number'}, 'category_id': {'type': 'string'}, 'custom_sid': {'type': 'string'}, 'tv_archive': {'type': 'number'}, 'direct_source': {'type': 'string'}, 'tv_archive_duration': {'anyOf': [{'type': 'number'}, {'type': 'string', 'format': 'integer'}]}}}"}, "pyxtream.schemaValidator.vod_schema": {"fullname": "pyxtream.schemaValidator.vod_schema", "modulename": "pyxtream.schemaValidator", "qualname": "vod_schema", "kind": "variable", "doc": "

    \n", "default_value": "{'$schema': 'https://json-schema.org/draft/2020-12/schema', '$id': 'https://example.com/product.schema.json', 'title': 'VOD', 'description': 'xtream API VOD Schema', 'type': 'object', 'properties': {'num': {'type': 'integer'}, 'name': {'type': 'string'}, 'stream_type': {'type': 'string'}, 'stream_id': {'type': 'integer'}, 'stream_icon': {'anyOf': [{'type': 'string', 'format': 'uri', 'qt-uri-protocols': ['http', 'https']}, {'type': 'null'}]}, 'rating': {'anyOf': [{'type': 'null'}, {'type': 'string', 'format': 'integer'}, {'type': 'number'}]}, 'rating_5based': {'type': 'number'}, 'added': {'type': 'string', 'format': 'integer'}, 'is_adult': {'type': 'string', 'format': 'number'}, 'category_id': {'type': 'string'}, 'container_extension': {'type': 'string'}, 'custom_sid': {'type': 'string'}, 'direct_source': {'type': 'string'}}}"}, "pyxtream.schemaValidator.channel_schema": {"fullname": "pyxtream.schemaValidator.channel_schema", "modulename": "pyxtream.schemaValidator", "qualname": "channel_schema", "kind": "variable", "doc": "

    \n", "default_value": "{}"}, "pyxtream.schemaValidator.group_schema": {"fullname": "pyxtream.schemaValidator.group_schema", "modulename": "pyxtream.schemaValidator", "qualname": "group_schema", "kind": "variable", "doc": "

    \n", "default_value": "{'$schema': 'https://json-schema.org/draft/2020-12/schema', '$id': 'https://example.com/product.schema.json', 'title': 'Group', 'description': 'xtream API Group Schema', 'type': 'object', 'properties': {'category_id': {'type': 'string'}, 'category_name': {'type': 'string'}, 'parent_id': {'type': 'integer'}}}"}, "pyxtream.schemaValidator.schemaValidator": {"fullname": "pyxtream.schemaValidator.schemaValidator", "modulename": "pyxtream.schemaValidator", "qualname": "schemaValidator", "kind": "function", "doc": "

    \n", "signature": "(jsonData: str, schemaType: pyxtream.schemaValidator.SchemaType) -> bool:", "funcdef": "def"}, "pyxtream.version": {"fullname": "pyxtream.version", "modulename": "pyxtream.version", "kind": "module", "doc": "

    \n"}}, "docInfo": {"pyxtream": {"qualname": 0, "fullname": 1, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.progress": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.progress.progress": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 29, "bases": 0, "doc": 3}, "pyxtream.pyxtream": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 66}, "pyxtream.pyxtream.Channel": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 26, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.info": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.id": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.name": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.logo": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.logo_path": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.group_title": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.title": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.url": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.stream_type": {"qualname": 3, "fullname": 5, "annotation": 2, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.group_id": {"qualname": 3, "fullname": 5, "annotation": 2, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.is_adult": {"qualname": 3, "fullname": 5, "annotation": 2, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.added": {"qualname": 2, "fullname": 4, "annotation": 2, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.epg_channel_id": {"qualname": 4, "fullname": 6, "annotation": 2, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.age_days_from_added": {"qualname": 5, "fullname": 7, "annotation": 2, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.date_now": {"qualname": 3, "fullname": 5, "annotation": 3, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.raw": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Channel.export_json": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 26, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.name": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.group_type": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.group_id": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.raw": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"qualname": 6, "fullname": 8, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.channels": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.series": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.region_shortname": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Group.region_longname": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 32, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.title": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.name": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.info": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.raw": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.group_title": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.id": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.container_extension": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.episode_number": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.av_info": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.logo": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.logo_path": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Episode.url": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.name": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.logo": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.logo_path": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.series_id": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.plot": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.youtube_trailer": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.genre": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.raw": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.xtream": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.seasons": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.episodes": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.url": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Serie.export_json": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Season": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Season.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 9, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Season.name": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.Season.episodes": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 189, "bases": 0, "doc": 209}, "pyxtream.pyxtream.XTream.name": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.server": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.secure_server": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.username": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.password": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.base_url": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.base_url_ssl": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.cache_path": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.account_expiration": {"qualname": 3, "fullname": 5, "annotation": 3, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.live_type": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 5, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.vod_type": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 5, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.series_type": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 5, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.auth_data": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.authorization": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 14, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.groups": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.channels": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.series": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.movies": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.movies_30days": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.movies_7days": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.connection_headers": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.state": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 11, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.hide_adult_content": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 8, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 8, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 8, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.threshold_time_sec": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 2, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.validate_json": {"qualname": 3, "fullname": 5, "annotation": 2, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.download_progress": {"qualname": 3, "fullname": 5, "annotation": 2, "default_value": 16, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.app_fullpath": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.html_template_folder": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_download_progress": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 29, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_last_7days": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.search_stream": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 141, "bases": 0, "doc": 85}, "pyxtream.pyxtream.XTream.download_video": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 25, "bases": 0, "doc": 36}, "pyxtream.pyxtream.XTream.authenticate": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 5}, "pyxtream.pyxtream.XTream.load_iptv": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 83}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"qualname": 6, "fullname": 8, "annotation": 0, "default_value": 0, "signature": 22, "bases": 0, "doc": 18}, "pyxtream.pyxtream.XTream.vodInfoByID": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 17, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 17, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 22, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 17, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.allEpg": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"qualname": 7, "fullname": 9, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"qualname": 7, "fullname": 9, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_series_URL": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"qualname": 6, "fullname": 8, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"qualname": 7, "fullname": 9, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"qualname": 7, "fullname": 9, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"qualname": 7, "fullname": 9, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"qualname": 9, "fullname": 11, "annotation": 0, "default_value": 0, "signature": 25, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"qualname": 8, "fullname": 10, "annotation": 0, "default_value": 0, "signature": 20, "bases": 0, "doc": 3}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"qualname": 5, "fullname": 7, "annotation": 0, "default_value": 0, "signature": 14, "bases": 0, "doc": 3}, "pyxtream.rest_api": {"qualname": 0, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.EndpointAction": {"qualname": 1, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.EndpointAction.__init__": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 15, "bases": 0, "doc": 3}, "pyxtream.rest_api.EndpointAction.response": {"qualname": 2, "fullname": 5, "annotation": 4, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.EndpointAction.function_name": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.EndpointAction.action": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.FlaskWrap": {"qualname": 1, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 2, "doc": 49}, "pyxtream.rest_api.FlaskWrap.__init__": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 102, "bases": 0, "doc": 151}, "pyxtream.rest_api.FlaskWrap.home_template": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 34, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.FlaskWrap.host": {"qualname": 2, "fullname": 5, "annotation": 2, "default_value": 4, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.FlaskWrap.port": {"qualname": 2, "fullname": 5, "annotation": 2, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.FlaskWrap.debug": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.FlaskWrap.app": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.FlaskWrap.xt": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.rest_api.FlaskWrap.name": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 33}, "pyxtream.rest_api.FlaskWrap.daemon": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 73}, "pyxtream.rest_api.FlaskWrap.run": {"qualname": 2, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 53}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"qualname": 3, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 42, "bases": 0, "doc": 3}, "pyxtream.schemaValidator": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.SchemaType": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 2, "doc": 3}, "pyxtream.schemaValidator.SchemaType.SERIES": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 7, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 8, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.SchemaType.LIVE": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 7, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.SchemaType.VOD": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 7, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 7, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.SchemaType.GROUP": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 7, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.series_schema": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 746, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.series_info_schema": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 354, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.live_schema": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 314, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.vod_schema": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 306, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.channel_schema": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 1, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.group_schema": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 92, "signature": 0, "bases": 0, "doc": 3}, "pyxtream.schemaValidator.schemaValidator": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 39, "bases": 0, "doc": 3}, "pyxtream.version": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}}, "length": 161, "save": true}, "index": {"qualname": {"root": {"3": {"0": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.movies_30days": {"tf": 1}}, "df": 1}}}}}, "docs": {}, "df": 0}, "7": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.movies_7days": {"tf": 1}, "pyxtream.pyxtream.XTream.get_last_7days": {"tf": 1}}, "df": 2}}}}}, "docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.pyxtream.Season.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 8, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.progress.progress": {"tf": 1}, "pyxtream.pyxtream.XTream.download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1}}, "df": 3}}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.Channel.logo_path": {"tf": 1}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1}, "pyxtream.pyxtream.XTream.cache_path": {"tf": 1}}, "df": 4}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.password": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Serie.plot": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.port": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.Channel": {"tf": 1}, "pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Channel.info": {"tf": 1}, "pyxtream.pyxtream.Channel.id": {"tf": 1}, "pyxtream.pyxtream.Channel.name": {"tf": 1}, "pyxtream.pyxtream.Channel.logo": {"tf": 1}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1}, "pyxtream.pyxtream.Channel.group_title": {"tf": 1}, "pyxtream.pyxtream.Channel.title": {"tf": 1}, "pyxtream.pyxtream.Channel.url": {"tf": 1}, "pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Channel.is_adult": {"tf": 1}, "pyxtream.pyxtream.Channel.added": {"tf": 1}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}, "pyxtream.pyxtream.Channel.date_now": {"tf": 1}, "pyxtream.pyxtream.Channel.raw": {"tf": 1}, "pyxtream.pyxtream.Channel.export_json": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.channel_schema": {"tf": 1}}, "df": 21, "s": {"docs": {"pyxtream.pyxtream.Group.channels": {"tf": 1}, "pyxtream.pyxtream.XTream.channels": {"tf": 1}}, "df": 2}}}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.Episode.container_extension": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.connection_headers": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.cache_path": {"tf": 1}}, "df": 1}}}, "t": {"docs": {"pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}}, "df": 2, "c": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}}, "df": 3}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}}, "df": 1}}}, "y": {"docs": {"pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}}, "df": 3}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.pyxtream.Season.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 8}}, "f": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.Channel.info": {"tf": 1}, "pyxtream.pyxtream.Episode.info": {"tf": 1}, "pyxtream.pyxtream.Episode.av_info": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 8}}}, "d": {"docs": {"pyxtream.pyxtream.Channel.id": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1}, "pyxtream.pyxtream.Group.group_id": {"tf": 1}, "pyxtream.pyxtream.Episode.id": {"tf": 1}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}}, "df": 9}, "s": {"docs": {"pyxtream.pyxtream.Channel.is_adult": {"tf": 1}}, "df": 1}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "v": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.name": {"tf": 1}, "pyxtream.pyxtream.Group.name": {"tf": 1}, "pyxtream.pyxtream.Episode.name": {"tf": 1}, "pyxtream.pyxtream.Serie.name": {"tf": 1}, "pyxtream.pyxtream.Season.name": {"tf": 1}, "pyxtream.pyxtream.XTream.name": {"tf": 1}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 8}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"pyxtream.pyxtream.Channel.date_now": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.Episode.episode_number": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.Channel.logo": {"tf": 1}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1}, "pyxtream.pyxtream.Episode.logo": {"tf": 1}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1}, "pyxtream.pyxtream.Serie.logo": {"tf": 1}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1}}, "df": 6}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.region_longname": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.live_type": {"tf": 1}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}}, "df": 10, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.get_last_7days": {"tf": 1}}, "df": 1}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.pyxtream.Channel.group_title": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Group": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.name": {"tf": 1}, "pyxtream.pyxtream.Group.group_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.raw": {"tf": 1}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}, "pyxtream.pyxtream.Group.channels": {"tf": 1}, "pyxtream.pyxtream.Group.series": {"tf": 1}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1}, "pyxtream.pyxtream.Group.region_longname": {"tf": 1}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 19, "s": {"docs": {"pyxtream.pyxtream.XTream.groups": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Serie.genre": {"tf": 1}}, "df": 1}}}, "t": {"docs": {"pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.get_last_7days": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 18}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.group_title": {"tf": 1}, "pyxtream.pyxtream.Channel.title": {"tf": 1}, "pyxtream.pyxtream.Episode.title": {"tf": 1}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1}}, "df": 4}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}}, "df": 1}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.Group.group_type": {"tf": 1}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1}}, "df": 5}}}, "o": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1}}, "df": 1}}}}}}, "h": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 2}}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.Channel.url": {"tf": 1}, "pyxtream.pyxtream.Episode.url": {"tf": 1}, "pyxtream.pyxtream.Serie.url": {"tf": 1}, "pyxtream.pyxtream.XTream.base_url": {"tf": 1}, "pyxtream.pyxtream.XTream.base_url_ssl": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 20}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.username": {"tf": 1}}, "df": 1}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}}, "df": 5, "s": {"docs": {"pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}}, "df": 4}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.state": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1}}, "df": 2}}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Serie": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.name": {"tf": 1}, "pyxtream.pyxtream.Serie.logo": {"tf": 1}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1}, "pyxtream.pyxtream.Serie.plot": {"tf": 1}, "pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1}, "pyxtream.pyxtream.Serie.genre": {"tf": 1}, "pyxtream.pyxtream.Serie.raw": {"tf": 1}, "pyxtream.pyxtream.Serie.xtream": {"tf": 1}, "pyxtream.pyxtream.Serie.seasons": {"tf": 1}, "pyxtream.pyxtream.Serie.episodes": {"tf": 1}, "pyxtream.pyxtream.Serie.url": {"tf": 1}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1}}, "df": 15, "s": {"docs": {"pyxtream.pyxtream.Group.series": {"tf": 1}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1}, "pyxtream.pyxtream.XTream.series": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 14}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.server": {"tf": 1}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Season": {"tf": 1}, "pyxtream.pyxtream.Season.__init__": {"tf": 1}, "pyxtream.pyxtream.Season.name": {"tf": 1}, "pyxtream.pyxtream.Season.episodes": {"tf": 1}}, "df": 4, "s": {"docs": {"pyxtream.pyxtream.Serie.seasons": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {"pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.secure_server": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.base_url_ssl": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.channel_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 6, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.SchemaType": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}}, "df": 7}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.schemaValidator": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.is_adult": {"tf": 1}, "pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}}, "df": 2}}}, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.Channel.added": {"tf": 1}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 2}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 1}}, "v": {"docs": {"pyxtream.pyxtream.Episode.av_info": {"tf": 1}}, "df": 1}, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.account_expiration": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction.action": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.auth_data": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.authorization": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.authenticate": {"tf": 1}}, "df": 1}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 5, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.allEpg": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1}}, "df": 2}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 5}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Episode": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.title": {"tf": 1}, "pyxtream.pyxtream.Episode.name": {"tf": 1}, "pyxtream.pyxtream.Episode.info": {"tf": 1}, "pyxtream.pyxtream.Episode.raw": {"tf": 1}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1}, "pyxtream.pyxtream.Episode.id": {"tf": 1}, "pyxtream.pyxtream.Episode.container_extension": {"tf": 1}, "pyxtream.pyxtream.Episode.episode_number": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.av_info": {"tf": 1}, "pyxtream.pyxtream.Episode.logo": {"tf": 1}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1}, "pyxtream.pyxtream.Episode.url": {"tf": 1}}, "df": 14, "s": {"docs": {"pyxtream.pyxtream.Serie.episodes": {"tf": 1}, "pyxtream.pyxtream.Season.episodes": {"tf": 1}}, "df": 2}}}}}}}, "x": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.export_json": {"tf": 1}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1}}, "df": 2}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.account_expiration": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Episode.container_extension": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.response": {"tf": 1}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}, "pyxtream.rest_api.EndpointAction.action": {"tf": 1}}, "df": 5}}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.date_now": {"tf": 1}}, "df": 1}, "a": {"docs": {"pyxtream.pyxtream.XTream.auth_data": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 3}}}}}}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.debug": {"tf": 1}}, "df": 1}}}}}, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.debug": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.xt": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 12}}}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "w": {"docs": {"pyxtream.pyxtream.Channel.raw": {"tf": 1}, "pyxtream.pyxtream.Group.raw": {"tf": 1}, "pyxtream.pyxtream.Episode.raw": {"tf": 1}, "pyxtream.pyxtream.Serie.raw": {"tf": 1}}, "df": 4}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1}, "pyxtream.pyxtream.Group.region_longname": {"tf": 1}}, "df": 3}}}}, "s": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.EndpointAction.response": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}, "j": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Channel.export_json": {"tf": 1}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1}, "pyxtream.pyxtream.XTream.validate_json": {"tf": 1}}, "df": 3}}}}, "y": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1}}, "df": 1}}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.xt": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Serie.xtream": {"tf": 1}, "pyxtream.pyxtream.XTream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.name": {"tf": 1}, "pyxtream.pyxtream.XTream.server": {"tf": 1}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1}, "pyxtream.pyxtream.XTream.username": {"tf": 1}, "pyxtream.pyxtream.XTream.password": {"tf": 1}, "pyxtream.pyxtream.XTream.base_url": {"tf": 1}, "pyxtream.pyxtream.XTream.base_url_ssl": {"tf": 1}, "pyxtream.pyxtream.XTream.cache_path": {"tf": 1}, "pyxtream.pyxtream.XTream.account_expiration": {"tf": 1}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1}, "pyxtream.pyxtream.XTream.auth_data": {"tf": 1}, "pyxtream.pyxtream.XTream.authorization": {"tf": 1}, "pyxtream.pyxtream.XTream.groups": {"tf": 1}, "pyxtream.pyxtream.XTream.channels": {"tf": 1}, "pyxtream.pyxtream.XTream.series": {"tf": 1}, "pyxtream.pyxtream.XTream.movies": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_30days": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_7days": {"tf": 1}, "pyxtream.pyxtream.XTream.connection_headers": {"tf": 1}, "pyxtream.pyxtream.XTream.state": {"tf": 1}, "pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}, "pyxtream.pyxtream.XTream.validate_json": {"tf": 1}, "pyxtream.pyxtream.XTream.download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1}, "pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}, "pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.get_last_7days": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.allEpg": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 61}}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.base_url": {"tf": 1}, "pyxtream.pyxtream.XTream.base_url_ssl": {"tf": 1}}, "df": 2}}}, "y": {"docs": {"pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}}, "df": 9}}, "v": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.vod_type": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 8, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.validate_json": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.movies": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_30days": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_7days": {"tf": 1}}, "df": 3}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.connection_headers": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.host": {"tf": 1}}, "df": 1}}}}}}, "fullname": {"root": {"3": {"0": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.movies_30days": {"tf": 1}}, "df": 1}}}}}, "docs": {}, "df": 0}, "7": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.movies_7days": {"tf": 1}, "pyxtream.pyxtream.XTream.get_last_7days": {"tf": 1}}, "df": 2}}}}}, "docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.pyxtream.Season.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 8, "p": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream": {"tf": 1}, "pyxtream.progress": {"tf": 1}, "pyxtream.progress.progress": {"tf": 1}, "pyxtream.pyxtream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.info": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.logo": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.group_title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.url": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.stream_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.is_adult": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.added": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.date_now": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.export_json": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.channels": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.series": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.region_longname": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.info": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.container_extension": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.episode_number": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.av_info": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.logo": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.url": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.logo": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.plot": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.genre": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.xtream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.seasons": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.episodes": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.url": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Season": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Season.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Season.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Season.episodes": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.server": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.username": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.password": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.base_url": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.base_url_ssl": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.cache_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.account_expiration": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.auth_data": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.authorization": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.groups": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.channels": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.series": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.movies": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.movies_30days": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.movies_7days": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.connection_headers": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.state": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.validate_json": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.download_progress": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_last_7days": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.allEpg": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1.4142135623730951}, "pyxtream.rest_api": {"tf": 1}, "pyxtream.rest_api.EndpointAction": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.response": {"tf": 1}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}, "pyxtream.rest_api.EndpointAction.action": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.debug": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.xt": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}, "pyxtream.schemaValidator": {"tf": 1}, "pyxtream.schemaValidator.SchemaType": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.channel_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}, "pyxtream.schemaValidator.schemaValidator": {"tf": 1}, "pyxtream.version": {"tf": 1}}, "df": 161}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.progress": {"tf": 1}, "pyxtream.progress.progress": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1}}, "df": 4}}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.Channel.logo_path": {"tf": 1}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1}, "pyxtream.pyxtream.XTream.cache_path": {"tf": 1}}, "df": 4}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.password": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Serie.plot": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.port": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.Channel": {"tf": 1}, "pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Channel.info": {"tf": 1}, "pyxtream.pyxtream.Channel.id": {"tf": 1}, "pyxtream.pyxtream.Channel.name": {"tf": 1}, "pyxtream.pyxtream.Channel.logo": {"tf": 1}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1}, "pyxtream.pyxtream.Channel.group_title": {"tf": 1}, "pyxtream.pyxtream.Channel.title": {"tf": 1}, "pyxtream.pyxtream.Channel.url": {"tf": 1}, "pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Channel.is_adult": {"tf": 1}, "pyxtream.pyxtream.Channel.added": {"tf": 1}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}, "pyxtream.pyxtream.Channel.date_now": {"tf": 1}, "pyxtream.pyxtream.Channel.raw": {"tf": 1}, "pyxtream.pyxtream.Channel.export_json": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.channel_schema": {"tf": 1}}, "df": 21, "s": {"docs": {"pyxtream.pyxtream.Group.channels": {"tf": 1}, "pyxtream.pyxtream.XTream.channels": {"tf": 1}}, "df": 2}}}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.Episode.container_extension": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.connection_headers": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.cache_path": {"tf": 1}}, "df": 1}}}, "t": {"docs": {"pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}}, "df": 2, "c": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}}, "df": 3}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}}, "df": 1}}}, "y": {"docs": {"pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}}, "df": 3}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.pyxtream.Season.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 8}}, "f": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.Channel.info": {"tf": 1}, "pyxtream.pyxtream.Episode.info": {"tf": 1}, "pyxtream.pyxtream.Episode.av_info": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 8}}}, "d": {"docs": {"pyxtream.pyxtream.Channel.id": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1}, "pyxtream.pyxtream.Group.group_id": {"tf": 1}, "pyxtream.pyxtream.Episode.id": {"tf": 1}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}}, "df": 9}, "s": {"docs": {"pyxtream.pyxtream.Channel.is_adult": {"tf": 1}}, "df": 1}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "v": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.name": {"tf": 1}, "pyxtream.pyxtream.Group.name": {"tf": 1}, "pyxtream.pyxtream.Episode.name": {"tf": 1}, "pyxtream.pyxtream.Serie.name": {"tf": 1}, "pyxtream.pyxtream.Season.name": {"tf": 1}, "pyxtream.pyxtream.XTream.name": {"tf": 1}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 8}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"pyxtream.pyxtream.Channel.date_now": {"tf": 1}}, "df": 1}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.Episode.episode_number": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.Channel.logo": {"tf": 1}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1}, "pyxtream.pyxtream.Episode.logo": {"tf": 1}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1}, "pyxtream.pyxtream.Serie.logo": {"tf": 1}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1}}, "df": 6}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.region_longname": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.live_type": {"tf": 1}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}}, "df": 10, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.get_last_7days": {"tf": 1}}, "df": 1}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.pyxtream.Channel.group_title": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Group": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.name": {"tf": 1}, "pyxtream.pyxtream.Group.group_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.raw": {"tf": 1}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}, "pyxtream.pyxtream.Group.channels": {"tf": 1}, "pyxtream.pyxtream.Group.series": {"tf": 1}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1}, "pyxtream.pyxtream.Group.region_longname": {"tf": 1}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 19, "s": {"docs": {"pyxtream.pyxtream.XTream.groups": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Serie.genre": {"tf": 1}}, "df": 1}}}, "t": {"docs": {"pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.get_last_7days": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 18}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.group_title": {"tf": 1}, "pyxtream.pyxtream.Channel.title": {"tf": 1}, "pyxtream.pyxtream.Episode.title": {"tf": 1}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1}}, "df": 4}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}}, "df": 1}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.Group.group_type": {"tf": 1}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1}}, "df": 5}}}, "o": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}}, "df": 1}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1}}, "df": 1}}}}}}, "h": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 2}}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.Channel.url": {"tf": 1}, "pyxtream.pyxtream.Episode.url": {"tf": 1}, "pyxtream.pyxtream.Serie.url": {"tf": 1}, "pyxtream.pyxtream.XTream.base_url": {"tf": 1}, "pyxtream.pyxtream.XTream.base_url_ssl": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 20}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.username": {"tf": 1}}, "df": 1}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}}, "df": 5, "s": {"docs": {"pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}}, "df": 4}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.state": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1}}, "df": 2}}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Serie": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.name": {"tf": 1}, "pyxtream.pyxtream.Serie.logo": {"tf": 1}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1}, "pyxtream.pyxtream.Serie.plot": {"tf": 1}, "pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1}, "pyxtream.pyxtream.Serie.genre": {"tf": 1}, "pyxtream.pyxtream.Serie.raw": {"tf": 1}, "pyxtream.pyxtream.Serie.xtream": {"tf": 1}, "pyxtream.pyxtream.Serie.seasons": {"tf": 1}, "pyxtream.pyxtream.Serie.episodes": {"tf": 1}, "pyxtream.pyxtream.Serie.url": {"tf": 1}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1}}, "df": 15, "s": {"docs": {"pyxtream.pyxtream.Group.series": {"tf": 1}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1}, "pyxtream.pyxtream.XTream.series": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 14}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.server": {"tf": 1}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Season": {"tf": 1}, "pyxtream.pyxtream.Season.__init__": {"tf": 1}, "pyxtream.pyxtream.Season.name": {"tf": 1}, "pyxtream.pyxtream.Season.episodes": {"tf": 1}}, "df": 4, "s": {"docs": {"pyxtream.pyxtream.Serie.seasons": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {"pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}}, "df": 1, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.secure_server": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.base_url_ssl": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.channel_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 6, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator": {"tf": 1}, "pyxtream.schemaValidator.SchemaType": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.channel_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}, "pyxtream.schemaValidator.schemaValidator": {"tf": 1.4142135623730951}}, "df": 15}}}}}}}}}, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.SchemaType": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}}, "df": 7}}}}}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.is_adult": {"tf": 1}, "pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}}, "df": 2}}}, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.Channel.added": {"tf": 1}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 2}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 1}}, "v": {"docs": {"pyxtream.pyxtream.Episode.av_info": {"tf": 1}}, "df": 1}, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.account_expiration": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction.action": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.auth_data": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.authorization": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.authenticate": {"tf": 1}}, "df": 1}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 5, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.allEpg": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1}}, "df": 2}, "i": {"docs": {"pyxtream.rest_api": {"tf": 1}, "pyxtream.rest_api.EndpointAction": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.response": {"tf": 1}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}, "pyxtream.rest_api.EndpointAction.action": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.debug": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.xt": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 18}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 5}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Episode": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.title": {"tf": 1}, "pyxtream.pyxtream.Episode.name": {"tf": 1}, "pyxtream.pyxtream.Episode.info": {"tf": 1}, "pyxtream.pyxtream.Episode.raw": {"tf": 1}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1}, "pyxtream.pyxtream.Episode.id": {"tf": 1}, "pyxtream.pyxtream.Episode.container_extension": {"tf": 1}, "pyxtream.pyxtream.Episode.episode_number": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.av_info": {"tf": 1}, "pyxtream.pyxtream.Episode.logo": {"tf": 1}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1}, "pyxtream.pyxtream.Episode.url": {"tf": 1}}, "df": 14, "s": {"docs": {"pyxtream.pyxtream.Serie.episodes": {"tf": 1}, "pyxtream.pyxtream.Season.episodes": {"tf": 1}}, "df": 2}}}}}}}, "x": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.export_json": {"tf": 1}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1}}, "df": 2}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.account_expiration": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Episode.container_extension": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.response": {"tf": 1}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}, "pyxtream.rest_api.EndpointAction.action": {"tf": 1}}, "df": 5}}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.date_now": {"tf": 1}}, "df": 1}, "a": {"docs": {"pyxtream.pyxtream.XTream.auth_data": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 3}}}}}}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.debug": {"tf": 1}}, "df": 1}}}}}, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.debug": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.xt": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 12}}}}}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "w": {"docs": {"pyxtream.pyxtream.Channel.raw": {"tf": 1}, "pyxtream.pyxtream.Group.raw": {"tf": 1}, "pyxtream.pyxtream.Episode.raw": {"tf": 1}, "pyxtream.pyxtream.Serie.raw": {"tf": 1}}, "df": 4}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1}, "pyxtream.pyxtream.Group.region_longname": {"tf": 1}}, "df": 3}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api": {"tf": 1}, "pyxtream.rest_api.EndpointAction": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.response": {"tf": 1}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1}, "pyxtream.rest_api.EndpointAction.action": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.debug": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.xt": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 18}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.EndpointAction.response": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}, "j": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.Channel.export_json": {"tf": 1}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1}, "pyxtream.pyxtream.XTream.validate_json": {"tf": 1}}, "df": 3}}}}, "y": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1}}, "df": 1}}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.xt": {"tf": 1}}, "df": 1, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Serie.xtream": {"tf": 1}, "pyxtream.pyxtream.XTream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.name": {"tf": 1}, "pyxtream.pyxtream.XTream.server": {"tf": 1}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1}, "pyxtream.pyxtream.XTream.username": {"tf": 1}, "pyxtream.pyxtream.XTream.password": {"tf": 1}, "pyxtream.pyxtream.XTream.base_url": {"tf": 1}, "pyxtream.pyxtream.XTream.base_url_ssl": {"tf": 1}, "pyxtream.pyxtream.XTream.cache_path": {"tf": 1}, "pyxtream.pyxtream.XTream.account_expiration": {"tf": 1}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1}, "pyxtream.pyxtream.XTream.auth_data": {"tf": 1}, "pyxtream.pyxtream.XTream.authorization": {"tf": 1}, "pyxtream.pyxtream.XTream.groups": {"tf": 1}, "pyxtream.pyxtream.XTream.channels": {"tf": 1}, "pyxtream.pyxtream.XTream.series": {"tf": 1}, "pyxtream.pyxtream.XTream.movies": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_30days": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_7days": {"tf": 1}, "pyxtream.pyxtream.XTream.connection_headers": {"tf": 1}, "pyxtream.pyxtream.XTream.state": {"tf": 1}, "pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}, "pyxtream.pyxtream.XTream.validate_json": {"tf": 1}, "pyxtream.pyxtream.XTream.download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1}, "pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}, "pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.get_last_7days": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.allEpg": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}}, "df": 61}}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.base_url": {"tf": 1}, "pyxtream.pyxtream.XTream.base_url_ssl": {"tf": 1}}, "df": 2}}}, "y": {"docs": {"pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}}, "df": 9}}, "v": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.vod_type": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 8, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.validate_json": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.version": {"tf": 1}}, "df": 1}}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.movies": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_30days": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_7days": {"tf": 1}}, "df": 3}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.connection_headers": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.host": {"tf": 1}}, "df": 1}}}}}}, "annotation": {"root": {"docs": {"pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Channel.is_adult": {"tf": 1}, "pyxtream.pyxtream.Channel.added": {"tf": 1}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}, "pyxtream.pyxtream.Channel.date_now": {"tf": 1}, "pyxtream.pyxtream.XTream.account_expiration": {"tf": 1}, "pyxtream.pyxtream.XTream.validate_json": {"tf": 1}, "pyxtream.pyxtream.XTream.download_progress": {"tf": 1}, "pyxtream.rest_api.EndpointAction.response": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}}, "df": 13, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.Channel.stream_type": {"tf": 1}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1}}, "df": 4}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.is_adult": {"tf": 1}, "pyxtream.pyxtream.Channel.added": {"tf": 1}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}}, "df": 4}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.date_now": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.account_expiration": {"tf": 1}}, "df": 2}}}}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.download_progress": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.pyxtream.XTream.account_expiration": {"tf": 1}}, "df": 1}}}}}}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.validate_json": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {"pyxtream.rest_api.EndpointAction.response": {"tf": 1}}, "df": 1}}}}}, "w": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.EndpointAction.response": {"tf": 1}}, "df": 1}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.EndpointAction.response": {"tf": 1}}, "df": 1}}}}}}}}}}, "default_value": {"root": {"0": {"docs": {"pyxtream.pyxtream.Channel.is_adult": {"tf": 1}, "pyxtream.pyxtream.Channel.added": {"tf": 1}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1}, "pyxtream.pyxtream.XTream.download_progress": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1}}, "df": 5}, "1": {"2": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}}}}}, "docs": {"pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}}, "df": 2}, "2": {"docs": {"pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}}, "df": 1}, "3": {"docs": {"pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}}, "df": 1}, "4": {"docs": {"pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}}, "df": 1}, "5": {"docs": {"pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}}, "df": 1, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 3}}}}}}, "6": {"docs": {"pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}}, "df": 1}, "docs": {"pyxtream.pyxtream.Channel.info": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.logo": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.group_title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.url": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.stream_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.info": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.logo": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.plot": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.genre": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Season.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.server": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.username": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.password": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.base_url": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.base_url_ssl": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.cache_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.auth_data": {"tf": 1}, "pyxtream.pyxtream.XTream.authorization": {"tf": 2}, "pyxtream.pyxtream.XTream.groups": {"tf": 1}, "pyxtream.pyxtream.XTream.channels": {"tf": 1}, "pyxtream.pyxtream.XTream.series": {"tf": 1}, "pyxtream.pyxtream.XTream.movies": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_30days": {"tf": 1}, "pyxtream.pyxtream.XTream.movies_7days": {"tf": 1}, "pyxtream.pyxtream.XTream.connection_headers": {"tf": 1}, "pyxtream.pyxtream.XTream.state": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1}, "pyxtream.pyxtream.XTream.download_progress": {"tf": 2}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.series_schema": {"tf": 13.96424004376894}, "pyxtream.schemaValidator.series_info_schema": {"tf": 9.273618495495704}, "pyxtream.schemaValidator.live_schema": {"tf": 9}, "pyxtream.schemaValidator.vod_schema": {"tf": 8.888194417315589}, "pyxtream.schemaValidator.channel_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 4.47213595499958}}, "df": 69, "x": {"2": {"7": {"docs": {"pyxtream.pyxtream.Channel.info": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.logo": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.group_title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.url": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.stream_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Channel.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.group_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Group.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.title": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.info": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Episode.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.logo": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.plot": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.genre": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.raw": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Season.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.name": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.server": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.username": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.password": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.base_url": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.base_url_ssl": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.cache_path": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.authorization": {"tf": 2.8284271247461903}, "pyxtream.pyxtream.XTream.state": {"tf": 2}, "pyxtream.pyxtream.XTream.download_progress": {"tf": 2.449489742783178}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.series_schema": {"tf": 18.601075237738275}, "pyxtream.schemaValidator.series_info_schema": {"tf": 12.806248474865697}, "pyxtream.schemaValidator.live_schema": {"tf": 11.832159566199232}, "pyxtream.schemaValidator.vod_schema": {"tf": 11.74734012447073}, "pyxtream.schemaValidator.group_schema": {"tf": 6.324555320336759}}, "df": 50}, "docs": {}, "df": 0}, "docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.live_type": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1.4142135623730951}}, "df": 3}}}, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.state": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 2.6457513110645907}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}}, "df": 10}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}, "v": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.vod_type": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.4142135623730951}}, "df": 3}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.series_type": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}}, "df": 5}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}}, "df": 1, "s": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.7320508075688772}}, "df": 2, "i": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.download_progress": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 5}, "pyxtream.schemaValidator.series_info_schema": {"tf": 3.7416573867739413}, "pyxtream.schemaValidator.live_schema": {"tf": 3.1622776601683795}, "pyxtream.schemaValidator.vod_schema": {"tf": 3.1622776601683795}, "pyxtream.schemaValidator.group_schema": {"tf": 1.4142135623730951}}, "df": 5}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 2}, "pyxtream.schemaValidator.live_schema": {"tf": 2}, "pyxtream.schemaValidator.vod_schema": {"tf": 2}, "pyxtream.schemaValidator.group_schema": {"tf": 2}}, "df": 5, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}}, "df": 6}}}}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 3}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 3}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.authorization": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2.8284271247461903}, "pyxtream.schemaValidator.series_info_schema": {"tf": 2}, "pyxtream.schemaValidator.live_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.4142135623730951}}, "df": 4}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.authorization": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 1}}}}}, "y": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 4}}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.download_progress": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 4}}}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.state": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "p": {"docs": {}, "df": 0, "i": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 6}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}}, "df": 1}}, "d": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 3}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 2}}}}, "n": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "f": {"docs": {"pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.4142135623730951}}, "df": 3}}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.state": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1}}, "df": 2}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 3.4641016151377544}, "pyxtream.schemaValidator.series_info_schema": {"tf": 2.6457513110645907}, "pyxtream.schemaValidator.live_schema": {"tf": 2}, "pyxtream.schemaValidator.vod_schema": {"tf": 2}}, "df": 4}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1.4142135623730951}}, "df": 5}}}}, "t": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 2.6457513110645907}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1}}, "df": 10}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 8}}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "/": {"2": {"0": {"2": {"0": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "w": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.validate_json": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.download_progress": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 6}, "pyxtream.schemaValidator.series_info_schema": {"tf": 4.123105625617661}, "pyxtream.schemaValidator.live_schema": {"tf": 4.242640687119285}, "pyxtream.schemaValidator.vod_schema": {"tf": 4.242640687119285}, "pyxtream.schemaValidator.group_schema": {"tf": 2}}, "df": 5}}}, "v": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1.4142135623730951}}, "df": 1}}, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.4142135623730951}}, "df": 1, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 3, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.7320508075688772}}, "df": 4}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.4142135623730951}}, "df": 2}}}}, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 3, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1}}, "df": 1}}}}}}}}, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.7320508075688772}}, "df": 1}}, "t": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 4, "s": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 4, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.4142135623730951}}, "df": 1}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.4142135623730951}}, "df": 1}}}, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 4}}, "e": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1}}, "df": 1}, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2, "s": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "g": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1}}, "df": 1}}, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 2}}}}}}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.4142135623730951}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1}, "pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 3}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 3.3166247903554}, "pyxtream.schemaValidator.series_info_schema": {"tf": 2}, "pyxtream.schemaValidator.live_schema": {"tf": 2}, "pyxtream.schemaValidator.vod_schema": {"tf": 2}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}}}, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2.23606797749979}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.live_schema": {"tf": 2}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.group_schema": {"tf": 1.7320508075688772}}, "df": 5}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 2}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 2}}}, "s": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 2}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}}, "df": 2}}}}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}}, "df": 1}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 2}}}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1.4142135623730951}}, "df": 5}}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}}, "df": 1}}}}}}}}, "j": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}, "pyxtream.schemaValidator.live_schema": {"tf": 1}, "pyxtream.schemaValidator.vod_schema": {"tf": 1}, "pyxtream.schemaValidator.group_schema": {"tf": 1}}, "df": 5}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.4142135623730951}}, "df": 3}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}}}}, "y": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.series_schema": {"tf": 1}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1}}, "df": 2}}}}}}}}}, "signature": {"root": {"0": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 2}}, "df": 1}, "2": {"8": {"8": {"0": {"0": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "3": {"9": {"docs": {"pyxtream.progress.progress": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 2.8284271247461903}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}}, "df": 4}, "docs": {}, "df": 0}, "5": {"0": {"0": {"0": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"pyxtream.progress.progress": {"tf": 4.898979485566356}, "pyxtream.pyxtream.Channel.__init__": {"tf": 4.47213595499958}, "pyxtream.pyxtream.Channel.export_json": {"tf": 3.1622776601683795}, "pyxtream.pyxtream.Group.__init__": {"tf": 4.47213595499958}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 3.7416573867739413}, "pyxtream.pyxtream.Episode.__init__": {"tf": 4.898979485566356}, "pyxtream.pyxtream.Serie.__init__": {"tf": 4}, "pyxtream.pyxtream.Serie.export_json": {"tf": 3.1622776601683795}, "pyxtream.pyxtream.Season.__init__": {"tf": 2.8284271247461903}, "pyxtream.pyxtream.XTream.__init__": {"tf": 12.12435565298214}, "pyxtream.pyxtream.XTream.get_download_progress": {"tf": 4.898979485566356}, "pyxtream.pyxtream.XTream.get_last_7days": {"tf": 3.1622776601683795}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 10.488088481701515}, "pyxtream.pyxtream.XTream.download_video": {"tf": 4.47213595499958}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 3.1622776601683795}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 4.242640687119285}, "pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 3.7416573867739413}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 3.7416573867739413}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 4.242640687119285}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 3.7416573867739413}, "pyxtream.pyxtream.XTream.allEpg": {"tf": 3.1622776601683795}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 4}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 4}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 3.4641016151377544}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 4}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 4}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 4}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 4}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 4.47213595499958}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 4}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 3.4641016151377544}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 3.4641016151377544}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 8.94427190999916}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 3.1622776601683795}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 5.830951894845301}, "pyxtream.schemaValidator.schemaValidator": {"tf": 5.656854249492381}}, "df": 42, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.progress.progress": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}}, "df": 3}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.progress.progress": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}}, "df": 2}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}}, "df": 2}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 3}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.progress.progress": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {"pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 2.23606797749979}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}, "pyxtream.schemaValidator.schemaValidator": {"tf": 1}}, "df": 21, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}}, "df": 11}}}}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"pyxtream.pyxtream.Channel.export_json": {"tf": 1}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1}, "pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.get_last_7days": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.allEpg": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 32}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}}, "df": 5}}}}, "c": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1}}, "df": 1}}}}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.schemaValidator.schemaValidator": {"tf": 1.4142135623730951}}, "df": 1}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.schemaValidator.schemaValidator": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 4}}}}}}, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 4}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1}}, "df": 3}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.Channel.__init__": {"tf": 1}, "pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1}}, "df": 4}}, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 4}}, "d": {"docs": {"pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1}}, "df": 14}, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.Group.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}}, "df": 3}}}, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 2}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Episode.__init__": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.Season.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 5}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1.7320508075688772}}, "df": 5}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}, "y": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.schemaValidator.schemaValidator": {"tf": 1}}, "df": 1}}}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.schemaValidator.schemaValidator": {"tf": 1}}, "df": 5}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.7320508075688772}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.EndpointAction.__init__": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1}}, "df": 2}}}, "j": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.schemaValidator.schemaValidator": {"tf": 1}}, "df": 1}}}}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1.7320508075688772}}, "df": 1}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1}}, "df": 2}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}}}, "bases": {"root": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.schemaValidator.SchemaType": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "doc": {"root": {"1": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}, "2": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}, "docs": {"pyxtream": {"tf": 1.7320508075688772}, "pyxtream.progress": {"tf": 1.7320508075688772}, "pyxtream.progress.progress": {"tf": 1.7320508075688772}, "pyxtream.pyxtream": {"tf": 6}, "pyxtream.pyxtream.Channel": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.__init__": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.info": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.id": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.name": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.logo": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.logo_path": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.group_title": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.title": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.url": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.stream_type": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.group_id": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.is_adult": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.added": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.epg_channel_id": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.age_days_from_added": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.date_now": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.raw": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Channel.export_json": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.__init__": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.name": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.group_type": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.group_id": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.raw": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.convert_region_shortname_to_fullname": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.channels": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.series": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.region_shortname": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Group.region_longname": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.__init__": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.title": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.name": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.info": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.raw": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.group_title": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.id": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.container_extension": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.episode_number": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.av_info": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.logo": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.logo_path": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Episode.url": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.__init__": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.name": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.logo": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.logo_path": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.series_id": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.plot": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.youtube_trailer": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.genre": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.raw": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.xtream": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.seasons": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.episodes": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.url": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Serie.export_json": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Season": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Season.__init__": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Season.name": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.Season.episodes": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.__init__": {"tf": 5.385164807134504}, "pyxtream.pyxtream.XTream.name": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.server": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.secure_server": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.username": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.password": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.base_url": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.base_url_ssl": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.cache_path": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.account_expiration": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.live_type": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.vod_type": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.series_type": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.auth_data": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.authorization": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.groups": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.channels": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.series": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.movies": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.movies_30days": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.movies_7days": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.connection_headers": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.state": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.hide_adult_content": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.live_catch_all_group": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.vod_catch_all_group": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.series_catch_all_group": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.threshold_time_sec": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.validate_json": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.download_progress": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.app_fullpath": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.html_template_folder": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_download_progress": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_last_7days": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 3.605551275463989}, "pyxtream.pyxtream.XTream.download_video": {"tf": 2.6457513110645907}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 4.123105625617661}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 2.23606797749979}, "pyxtream.pyxtream.XTream.vodInfoByID": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.liveEpgByStream": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.liveEpgByStreamAndLimit": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.allLiveEpgByStream": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.allEpg": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_live_categories_URL": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_live_streams_URL": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_live_streams_URL_by_category": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_vod_cat_URL": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_vod_streams_URL": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_vod_streams_URL_by_category": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_series_cat_URL": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_series_URL": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_series_URL_by_category": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_series_info_URL_by_ID": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_VOD_info_URL_by_ID": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_live_epg_URL_by_stream_and_limit": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_all_live_epg_URL_by_stream": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.get_all_epg_URL": {"tf": 1.7320508075688772}, "pyxtream.rest_api": {"tf": 1.7320508075688772}, "pyxtream.rest_api.EndpointAction": {"tf": 1.7320508075688772}, "pyxtream.rest_api.EndpointAction.__init__": {"tf": 1.7320508075688772}, "pyxtream.rest_api.EndpointAction.response": {"tf": 1.7320508075688772}, "pyxtream.rest_api.EndpointAction.function_name": {"tf": 1.7320508075688772}, "pyxtream.rest_api.EndpointAction.action": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap": {"tf": 2.449489742783178}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 5.5677643628300215}, "pyxtream.rest_api.FlaskWrap.home_template": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.host": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.port": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.debug": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.app": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.xt": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 2.449489742783178}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 3}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 2.449489742783178}, "pyxtream.rest_api.FlaskWrap.add_endpoint": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.SchemaType": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.SchemaType.SERIES": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.SchemaType.SERIES_INFO": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.SchemaType.LIVE": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.SchemaType.VOD": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.SchemaType.CHANNEL": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.SchemaType.GROUP": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.series_info_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.live_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.vod_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.channel_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.group_schema": {"tf": 1.7320508075688772}, "pyxtream.schemaValidator.schemaValidator": {"tf": 1.7320508075688772}, "pyxtream.version": {"tf": 1.7320508075688772}}, "df": 161, "p": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.7320508075688772}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 2}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 3}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 1}}, "df": 2}, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"3": {"docs": {}, "df": 0, "u": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}, "docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}, "y": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 2}, "i": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1.7320508075688772}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 2}}, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1}}}}}}}}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"pyxtream.pyxtream": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "w": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1.4142135623730951}}, "df": 1, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 2}, "e": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 2}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 3}}}}}}}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 2, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.7320508075688772}}, "df": 3}}}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.7320508075688772}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.__init__": {"tf": 2.23606797749979}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 2.23606797749979}}, "df": 3}}}}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 2.6457513110645907}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.7320508075688772}}, "df": 4, "f": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}, "l": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2.449489742783178}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 2}}, "df": 2}}}}}}}, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 3}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 3}, "b": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1.4142135623730951}}, "df": 3}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 5}}, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 3.1622776601683795}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 3}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 2}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 2.449489742783178}}, "df": 9, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 3}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 2}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 2.449489742783178}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 4, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1.4142135623730951}}, "df": 2}}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 3}}}, "o": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 2}, "pyxtream.pyxtream.XTream.authenticate": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 2.23606797749979}, "pyxtream.rest_api.FlaskWrap": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 2.449489742783178}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 8, "o": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 2}}}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1.7320508075688772}}, "df": 1, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}, "v": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}}, "df": 1}, "w": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": null}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": null}, "pyxtream.rest_api.FlaskWrap.name": {"tf": null}, "pyxtream.rest_api.FlaskWrap.run": {"tf": null}}, "df": 4}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}, "/": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "x": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}}, "df": 1}}, "n": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 3}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 2}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}}, "f": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 6}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 6, "m": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 2}}}, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 2.23606797749979}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 2.449489742783178}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 8, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 6}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 2}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1.4142135623730951}}, "df": 2}}}}}}}, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 5}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "d": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 2}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "i": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.7320508075688772}}, "df": 1}}, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1.4142135623730951}}, "df": 5}, "y": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 2}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 2.23606797749979}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 3}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}, "b": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 2}}}}}}}}, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.7320508075688772}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1.4142135623730951}}, "df": 1}}}, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1.4142135623730951}}, "df": 1, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1}}}}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}}}}}, "b": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 3, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2.23606797749979}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 3, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1.7320508075688772}}, "df": 3, "s": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "d": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "c": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 2.23606797749979}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}}, "df": 2}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 2}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1.7320508075688772}}, "df": 2}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 2}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}}}}}}}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}}, "df": 2}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}, "y": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}}, "df": 1, "o": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1, "t": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 4, "e": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 2}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1.4142135623730951}}, "df": 3}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 2}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream": {"tf": 1}, "pyxtream.pyxtream.XTream.__init__": {"tf": 1.7320508075688772}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 5, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 4, "i": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 2}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "v": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 2}}}, "f": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 5}, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "d": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1.7320508075688772}}, "df": 1, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 2.8284271247461903}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 2.23606797749979}}, "df": 3}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 2}}}, "r": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}}}}}}, "i": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 4}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1, "s": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}}}}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 3, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}}}}}}, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 3, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.rest_api.FlaskWrap": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.7320508075688772}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 6, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 3}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}, "y": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.name": {"tf": 1}}, "df": 3}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 3}, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 3}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 4, "i": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}, "y": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}}, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.authenticate": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 2.23606797749979}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 2}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}}, "df": 1}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.rest_api.FlaskWrap": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.4142135623730951}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}, "pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 3}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1.7320508075688772}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}, "pyxtream.pyxtream.XTream.get_series_info_by_id": {"tf": 1}}, "df": 2}}}}}}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}}, "df": 1}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 1}}, "df": 1}}}}}, "u": {"docs": {}, "df": 0, "e": {"docs": {"pyxtream.rest_api.FlaskWrap.daemon": {"tf": 1.4142135623730951}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "o": {"docs": {"pyxtream.pyxtream.XTream.download_video": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.load_iptv": {"tf": 1.4142135623730951}}, "df": 1}}}, "j": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"pyxtream.pyxtream.XTream.__init__": {"tf": 2}, "pyxtream.pyxtream.XTream.search_stream": {"tf": 1}}, "df": 2}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"pyxtream.pyxtream.XTream.search_stream": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1.4142135623730951}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 3}}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"pyxtream.rest_api.FlaskWrap.__init__": {"tf": 1}, "pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 2}}}}}}, "y": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {"pyxtream.rest_api.FlaskWrap.run": {"tf": 1}}, "df": 1}}}}}}, "pipeline": ["trimmer"], "_isPrebuiltIndex": true}; // mirrored in build-search-index.js (part 1) // Also split on html tags. this is a cheap heuristic, but good enough. diff --git a/functional_test.py b/functional_test.py index 4c0f010..4242158 100755 --- a/functional_test.py +++ b/functional_test.py @@ -17,6 +17,7 @@ print("Please edit this file with the provider credentials") sys.exit() + def str2list(input_string: str) -> list: """Convert a string with comma delimited numbers into a python list of integers @@ -27,7 +28,7 @@ def str2list(input_string: str) -> list: Returns: list: list of integers containing the commands """ - # conver to the list + # convert to list output_list = input_string.split(",") # convert each element as integers @@ -40,6 +41,7 @@ def str2list(input_string: str) -> list: return li + print(f"pyxtream version {__version__}") xt = XTream( @@ -48,7 +50,8 @@ def str2list(input_string: str) -> list: PROVIDER_PASSWORD, PROVIDER_URL, reload_time_sec=60*60*8, - debug_flask=False + debug_flask=True, + enable_flask=True ) sleep(0.5) @@ -87,15 +90,15 @@ def str2list(input_string: str) -> list: print(f"\t[{choice}]: ") if choice == 0: - #xt.flaskapp.shutdown() sys.exit(0) elif choice == 1: - xt.load_iptv() + if not xt.load_iptv(): + print("Something wrong") elif choice == 2: search_string = input("Search for REGEX (ex. '^Destiny.*$'): ") - search_result_obj = xt.search_stream(search_string, stream_type=("movies","series")) + search_result_obj = xt.search_stream(search_string, stream_type=("movies", "series")) result_number = len(search_result_obj) print(f"\tFound {result_number} results") if result_number < 10: @@ -108,7 +111,7 @@ def str2list(input_string: str) -> list: elif choice == 3: search_string = input("Search for text: ") search_result_obj = xt.search_stream( - rf"^.*{search_string}.*$", stream_type=("movies","series") + rf"^.*{search_string}.*$", stream_type=("movies", "series") ) result_number = len(search_result_obj) print(f"\tFound {result_number} results") @@ -131,27 +134,30 @@ def str2list(input_string: str) -> list: elif choice == 5: url = input("Enter URL to download: ") filename = input("Enter Fullpath Filename: ") - xt._download_video_impl(url,filename) + xt._download_video_impl(url, filename) elif choice == 6: NUM_MOVIES = len(xt.movies_30days) print(f"Found {NUM_MOVIES} new movies in the past 30 days") if NUM_MOVIES < 20: - for i in range(0,NUM_MOVIES): + for i in range(0, NUM_MOVIES): print(xt.movies_30days[i].title) elif choice == 7: NUM_MOVIES = len(xt.movies_7days) print(f"Found {NUM_MOVIES} new movies in the past 7 days") if NUM_MOVIES < 20: - for i in range(0,NUM_MOVIES): + for i in range(0, NUM_MOVIES): print(xt.movies_7days[i].title) elif choice == 8: series_id = input("Series ID: ") - - data = xt._load_series_info_by_id_from_provider(series_id) - print(data) + # Load series seasons and episodes + data = xt._load_series_info_by_id_from_provider(series_id, "JSON") + if data is not None: + print(data) + else: + print("No series found for that ID") elif choice == 9: stream_id = input("Stream ID: ") diff --git a/poetry.lock b/poetry.lock index d9422c2..5571245 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,23 +1,24 @@ -# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "attrs" -version = "24.3.0" +version = "25.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, - {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, + {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, + {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, ] [package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] [[package]] name = "blinker" @@ -25,6 +26,8 @@ version = "1.9.0" description = "Fast, simple object-to-object and broadcast signaling" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"flask\"" files = [ {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, @@ -32,138 +35,129 @@ files = [ [[package]] name = "certifi" -version = "2024.12.14" +version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ - {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, - {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, + {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, + {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, ] [[package]] name = "charset-normalizer" -version = "3.4.0" +version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, - {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, - {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, ] [[package]] name = "click" -version = "8.1.7" +version = "8.1.8" description = "Composable command line interface toolkit" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"flask\"" files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, ] [package.dependencies] @@ -173,12 +167,109 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -optional = true +optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {main = "extra == \"flask\" and platform_system == \"Windows\"", dev = "sys_platform == \"win32\""} + +[[package]] +name = "coverage" +version = "7.6.12" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "coverage-7.6.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:704c8c8c6ce6569286ae9622e534b4f5b9759b6f2cd643f1c1a61f666d534fe8"}, + {file = "coverage-7.6.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ad7525bf0241e5502168ae9c643a2f6c219fa0a283001cee4cf23a9b7da75879"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06097c7abfa611c91edb9e6920264e5be1d6ceb374efb4986f38b09eed4cb2fe"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:220fa6c0ad7d9caef57f2c8771918324563ef0d8272c94974717c3909664e674"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3688b99604a24492bcfe1c106278c45586eb819bf66a654d8a9a1433022fb2eb"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d1a987778b9c71da2fc8948e6f2656da6ef68f59298b7e9786849634c35d2c3c"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cec6b9ce3bd2b7853d4a4563801292bfee40b030c05a3d29555fd2a8ee9bd68c"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ace9048de91293e467b44bce0f0381345078389814ff6e18dbac8fdbf896360e"}, + {file = "coverage-7.6.12-cp310-cp310-win32.whl", hash = "sha256:ea31689f05043d520113e0552f039603c4dd71fa4c287b64cb3606140c66f425"}, + {file = "coverage-7.6.12-cp310-cp310-win_amd64.whl", hash = "sha256:676f92141e3c5492d2a1596d52287d0d963df21bf5e55c8b03075a60e1ddf8aa"}, + {file = "coverage-7.6.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e18aafdfb3e9ec0d261c942d35bd7c28d031c5855dadb491d2723ba54f4c3015"}, + {file = "coverage-7.6.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66fe626fd7aa5982cdebad23e49e78ef7dbb3e3c2a5960a2b53632f1f703ea45"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ef01d70198431719af0b1f5dcbefc557d44a190e749004042927b2a3fed0702"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e92ae5a289a4bc4c0aae710c0948d3c7892e20fd3588224ebe242039573bf0"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e695df2c58ce526eeab11a2e915448d3eb76f75dffe338ea613c1201b33bab2f"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d74c08e9aaef995f8c4ef6d202dbd219c318450fe2a76da624f2ebb9c8ec5d9f"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e995b3b76ccedc27fe4f477b349b7d64597e53a43fc2961db9d3fbace085d69d"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b1f097878d74fe51e1ddd1be62d8e3682748875b461232cf4b52ddc6e6db0bba"}, + {file = "coverage-7.6.12-cp311-cp311-win32.whl", hash = "sha256:1f7ffa05da41754e20512202c866d0ebfc440bba3b0ed15133070e20bf5aeb5f"}, + {file = "coverage-7.6.12-cp311-cp311-win_amd64.whl", hash = "sha256:e216c5c45f89ef8971373fd1c5d8d1164b81f7f5f06bbf23c37e7908d19e8558"}, + {file = "coverage-7.6.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b172f8e030e8ef247b3104902cc671e20df80163b60a203653150d2fc204d1ad"}, + {file = "coverage-7.6.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:641dfe0ab73deb7069fb972d4d9725bf11c239c309ce694dd50b1473c0f641c3"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e549f54ac5f301e8e04c569dfdb907f7be71b06b88b5063ce9d6953d2d58574"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:959244a17184515f8c52dcb65fb662808767c0bd233c1d8a166e7cf74c9ea985"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bda1c5f347550c359f841d6614fb8ca42ae5cb0b74d39f8a1e204815ebe25750"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ceeb90c3eda1f2d8c4c578c14167dbd8c674ecd7d38e45647543f19839dd6ea"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f16f44025c06792e0fb09571ae454bcc7a3ec75eeb3c36b025eccf501b1a4c3"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b076e625396e787448d27a411aefff867db2bffac8ed04e8f7056b07024eed5a"}, + {file = "coverage-7.6.12-cp312-cp312-win32.whl", hash = "sha256:00b2086892cf06c7c2d74983c9595dc511acca00665480b3ddff749ec4fb2a95"}, + {file = "coverage-7.6.12-cp312-cp312-win_amd64.whl", hash = "sha256:7ae6eabf519bc7871ce117fb18bf14e0e343eeb96c377667e3e5dd12095e0288"}, + {file = "coverage-7.6.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:488c27b3db0ebee97a830e6b5a3ea930c4a6e2c07f27a5e67e1b3532e76b9ef1"}, + {file = "coverage-7.6.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d1095bbee1851269f79fd8e0c9b5544e4c00c0c24965e66d8cba2eb5bb535fd"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0533adc29adf6a69c1baa88c3d7dbcaadcffa21afbed3ca7a225a440e4744bf9"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53c56358d470fa507a2b6e67a68fd002364d23c83741dbc4c2e0680d80ca227e"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64cbb1a3027c79ca6310bf101014614f6e6e18c226474606cf725238cf5bc2d4"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:79cac3390bfa9836bb795be377395f28410811c9066bc4eefd8015258a7578c6"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9b148068e881faa26d878ff63e79650e208e95cf1c22bd3f77c3ca7b1d9821a3"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8bec2ac5da793c2685ce5319ca9bcf4eee683b8a1679051f8e6ec04c4f2fd7dc"}, + {file = "coverage-7.6.12-cp313-cp313-win32.whl", hash = "sha256:200e10beb6ddd7c3ded322a4186313d5ca9e63e33d8fab4faa67ef46d3460af3"}, + {file = "coverage-7.6.12-cp313-cp313-win_amd64.whl", hash = "sha256:2b996819ced9f7dbb812c701485d58f261bef08f9b85304d41219b1496b591ef"}, + {file = "coverage-7.6.12-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:299cf973a7abff87a30609879c10df0b3bfc33d021e1adabc29138a48888841e"}, + {file = "coverage-7.6.12-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4b467a8c56974bf06e543e69ad803c6865249d7a5ccf6980457ed2bc50312703"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2458f275944db8129f95d91aee32c828a408481ecde3b30af31d552c2ce284a0"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a9d8be07fb0832636a0f72b80d2a652fe665e80e720301fb22b191c3434d924"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d47376a4f445e9743f6c83291e60adb1b127607a3618e3185bbc8091f0467b"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b95574d06aa9d2bd6e5cc35a5bbe35696342c96760b69dc4287dbd5abd4ad51d"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:ecea0c38c9079570163d663c0433a9af4094a60aafdca491c6a3d248c7432827"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2251fabcfee0a55a8578a9d29cecfee5f2de02f11530e7d5c5a05859aa85aee9"}, + {file = "coverage-7.6.12-cp313-cp313t-win32.whl", hash = "sha256:eb5507795caabd9b2ae3f1adc95f67b1104971c22c624bb354232d65c4fc90b3"}, + {file = "coverage-7.6.12-cp313-cp313t-win_amd64.whl", hash = "sha256:f60a297c3987c6c02ffb29effc70eadcbb412fe76947d394a1091a3615948e2f"}, + {file = "coverage-7.6.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e7575ab65ca8399c8c4f9a7d61bbd2d204c8b8e447aab9d355682205c9dd948d"}, + {file = "coverage-7.6.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8161d9fbc7e9fe2326de89cd0abb9f3599bccc1287db0aba285cb68d204ce929"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a1e465f398c713f1b212400b4e79a09829cd42aebd360362cd89c5bdc44eb87"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f25d8b92a4e31ff1bd873654ec367ae811b3a943583e05432ea29264782dc32c"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a936309a65cc5ca80fa9f20a442ff9e2d06927ec9a4f54bcba9c14c066323f2"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:aa6f302a3a0b5f240ee201297fff0bbfe2fa0d415a94aeb257d8b461032389bd"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f973643ef532d4f9be71dd88cf7588936685fdb576d93a79fe9f65bc337d9d73"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:78f5243bb6b1060aed6213d5107744c19f9571ec76d54c99cc15938eb69e0e86"}, + {file = "coverage-7.6.12-cp39-cp39-win32.whl", hash = "sha256:69e62c5034291c845fc4df7f8155e8544178b6c774f97a99e2734b05eb5bed31"}, + {file = "coverage-7.6.12-cp39-cp39-win_amd64.whl", hash = "sha256:b01a840ecc25dce235ae4c1b6a0daefb2a203dba0e6e980637ee9c2f6ee0df57"}, + {file = "coverage-7.6.12-pp39.pp310-none-any.whl", hash = "sha256:7e39e845c4d764208e7b8f6a21c541ade741e2c41afabdfa1caa28687a3c98cf"}, + {file = "coverage-7.6.12-py3-none-any.whl", hash = "sha256:eb8668cfbc279a536c633137deeb9435d2962caec279c3f8cf8b91fff6ff8953"}, + {file = "coverage-7.6.12.tar.gz", hash = "sha256:48cfc4641d95d34766ad41d9573cc0f22a48aa88d22657a1fe01dca0dbae4de2"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version < \"3.11\"" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] [[package]] name = "flask" @@ -186,6 +277,8 @@ version = "3.1.0" description = "A simple framework for building complex web applications." optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"flask\"" files = [ {file = "flask-3.1.0-py3-none-any.whl", hash = "sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136"}, {file = "flask-3.1.0.tar.gz", hash = "sha256:5f873c5184c897c8d9d1b05df1e3d01b14910ce69607a117bd3277098a5836ac"}, @@ -209,6 +302,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -219,33 +313,49 @@ all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2 [[package]] name = "importlib-metadata" -version = "8.5.0" +version = "8.6.1" description = "Read metadata from Python packages" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"flask\" and python_version < \"3.10\"" files = [ - {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, - {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, + {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, + {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, ] [package.dependencies] zipp = ">=3.20" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + [[package]] name = "itsdangerous" version = "2.2.0" description = "Safely pass data to untrusted environments and back." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"flask\"" files = [ {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, @@ -253,14 +363,16 @@ files = [ [[package]] name = "jinja2" -version = "3.1.4" +version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, + {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, + {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, ] +markers = {main = "extra == \"flask\""} [package.dependencies] MarkupSafe = ">=2.0" @@ -274,6 +386,7 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -295,6 +408,7 @@ version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, @@ -309,6 +423,7 @@ version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -372,6 +487,19 @@ files = [ {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] +markers = {main = "extra == \"flask\""} + +[[package]] +name = "packaging" +version = "24.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, +] [[package]] name = "pdoc" @@ -379,6 +507,7 @@ version = "15.0.1" description = "API Documentation for Python Projects" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pdoc-15.0.1-py3-none-any.whl", hash = "sha256:fd437ab8eb55f9b942226af7865a3801e2fb731665199b74fd9a44737dbe20f9"}, {file = "pdoc-15.0.1.tar.gz", hash = "sha256:3b08382c9d312243ee6c2a1813d0ff517a6ab84d596fa2c6c6b5255b17c3d666"}, @@ -389,34 +518,95 @@ Jinja2 = ">=2.11.0" MarkupSafe = ">=1.1.1" pygments = ">=2.12.0" +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + [[package]] name = "pygments" -version = "2.18.0" +version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, - {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, + {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, + {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, ] [package.extras] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pytest" +version = "8.3.4" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, + {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "6.0.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, + {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, +] + +[package.dependencies] +coverage = {version = ">=7.5", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] + [[package]] name = "referencing" -version = "0.35.1" +version = "0.36.2" description = "JSON Referencing + Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, - {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, + {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, + {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, ] [package.dependencies] attrs = ">=22.2.0" rpds-py = ">=0.7.0" +typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} [[package]] name = "requests" @@ -424,6 +614,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -445,6 +636,7 @@ version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, @@ -551,19 +743,76 @@ files = [ {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, ] +[[package]] +name = "tomli" +version = "2.2.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +markers = "python_full_version <= \"3.11.0a6\"" +files = [ + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version < \"3.13\"" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + [[package]] name = "urllib3" -version = "2.2.3" +version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -574,6 +823,8 @@ version = "3.1.3" description = "The comprehensive WSGI web application library." optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"flask\"" files = [ {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"}, {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"}, @@ -591,20 +842,25 @@ version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"flask\" and python_version < \"3.10\"" files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] +[extras] +flask = ["flask"] + [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = ">=3.9" -content-hash = "6d906ca2914b71b044cb00183bc8cbb1579abcfb9e4c048511cf5a9494e56001" +content-hash = "9e2d1d7c693332f8be070c07847ee550be06813142ed10abc1deb904222a374c" diff --git a/pyproject.toml b/pyproject.toml index 171f2bf..5a7b31c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,13 @@ -[tool.poetry] +[project] name = "pyxtream" -version = "0.7.2" +version = "0.7.3" +requires-python = ">=3.9" description = "xtream IPTV loader" -authors = ["Claudio Olmi "] +authors = [{name = "Claudio Olmi", email = ""}] license = "GPL3" readme = "README.md" homepage = "https://github.com/superolmo/pyxtream" -classifiers=[ +classifiers = [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", @@ -15,15 +16,18 @@ classifiers=[ "Operating System :: OS Independent", "Natural Language :: English" ] +dependencies = [ + "requests (>=2.32.3,<3.0.0)", + "jsonschema (>=4.23.0,<5.0.0)", +] -[tool.poetry.dependencies] -python = ">=3.9" -requests = "^2.32.3" -jsonschema = "^4.23.0" -flask = {version = "^3.1.0", optional = true} +[project.optional-dependencies] +flask = ["flask>=3.1.0,<4.0.0"] [tool.poetry.group.dev.dependencies] pdoc = "^15.0.1" +pytest = "^8.3.4" +pytest-cov = "^6.0.0" [build-system] requires = ["poetry-core"] diff --git a/pyxtream/__init__.py b/pyxtream/__init__.py index a2235d9..cf35465 100644 --- a/pyxtream/__init__.py +++ b/pyxtream/__init__.py @@ -1,6 +1,6 @@ from .progress import progress -from .pyxtream import XTream +from .pyxtream import XTream, Channel, Group, Serie, Episode try: from .rest_api import FlaskWrap diff --git a/pyxtream/html/index.html b/pyxtream/html/index.html index 6588008..22af5b2 100644 --- a/pyxtream/html/index.html +++ b/pyxtream/html/index.html @@ -7,20 +7,20 @@ PyXtream Viewer - - - - - + + + + + + @@ -53,23 +87,19 @@ - +
    + +

    @@ -88,14 +118,40 @@

    + \ No newline at end of file diff --git a/pyxtream/progress.py b/pyxtream/progress.py index e837f58..6d93fa8 100644 --- a/pyxtream/progress.py +++ b/pyxtream/progress.py @@ -1,21 +1,21 @@ # The MIT License (MIT) # Copyright (c) 2016 Vladimir Ignatev # -# 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 +# 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 +# +# 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 +# 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 OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import sys diff --git a/pyxtream/pyxtream.py b/pyxtream/pyxtream.py index cffcb07..bbddf61 100755 --- a/pyxtream/pyxtream.py +++ b/pyxtream/pyxtream.py @@ -4,7 +4,7 @@ Module handles downloading xtream data. -Part of this content comes from +Part of this content comes from - https://github.com/chazlarson/py-xtream-codes/blob/master/xtream.py - https://github.com/linuxmint/hypnotix @@ -215,9 +215,9 @@ def __init__(self, xtream: object, series_info, group_title, episode_info) -> No self.logo = series_info["cover"] self.logo_path = xtream._get_logo_local_path(self.logo) - self.url = f"{xtream.server}/series/" \ - f"{xtream.authorization['username']}/" \ - f"{xtream.authorization['password']}/{self.id}.{self.container_extension}" + self.url = f"{xtream.server}/series/" \ + f"{xtream.authorization['username']}/" \ + f"{xtream.authorization['password']}/{self.id}.{self.container_extension}" # Check that the constructed URL is valid if not xtream._validate_url(self.url): @@ -240,6 +240,9 @@ class Serie: raw = "" def __init__(self, xtream: object, series_info): + + series_info["added"] = series_info["last_modified"] + # Raw JSON Series self.raw = series_info self.xtream = xtream @@ -268,6 +271,10 @@ def __init__(self, xtream: object, series_info): if "genre" in series_info.keys(): self.genre = series_info["genre"] + self.url = f"{xtream.server}/series/" \ + f"{xtream.authorization['username']}/" \ + f"{xtream.authorization['password']}/{self.series_id}/" + def export_json(self): jsondata = {} @@ -276,6 +283,7 @@ def export_json(self): return jsondata + class Season: # Required by Hypnotix name = "" @@ -284,6 +292,7 @@ def __init__(self, name): self.name = name self.episodes = {} + class XTream: name = "" @@ -303,7 +312,7 @@ class XTream: series_type = "Series" auth_data = {} - authorization = {} + authorization = {'username': '', 'password': ''} groups = [] channels = [] @@ -319,13 +328,13 @@ class XTream: hide_adult_content = False live_catch_all_group = Group( - {"category_id": "9999", "category_name":"xEverythingElse", "parent_id":0}, live_type + {"category_id": "9999", "category_name": "xEverythingElse", "parent_id": 0}, live_type ) vod_catch_all_group = Group( - {"category_id": "9999", "category_name":"xEverythingElse", "parent_id":0}, vod_type + {"category_id": "9999", "category_name": "xEverythingElse", "parent_id": 0}, vod_type ) series_catch_all_group = Group( - {"category_id": "9999", "category_name":"xEverythingElse", "parent_id":0}, series_type + {"category_id": "9999", "category_name": "xEverythingElse", "parent_id": 0}, series_type ) # If the cached JSON file is older than threshold_time_sec then load a new # JSON dictionary from the provider @@ -333,6 +342,9 @@ class XTream: validate_json: bool = True + # Used by REST API to get download progress + download_progress: dict = {'StreamId': 0, 'Total': 0, 'Progress': 0} + def __init__( self, provider_name: str, @@ -344,8 +356,9 @@ def __init__( cache_path: str = "", reload_time_sec: int = 60*60*8, validate_json: bool = False, + enable_flask: bool = False, debug_flask: bool = True - ): + ): """Initialize Xtream Class Args: @@ -359,16 +372,17 @@ def __init__( Defaults to empty string. reload_time_sec (int, optional): Number of seconds before automatic reloading (-1 to turn it OFF) - debug_flask (bool, optional): Enable the debug mode in Flask validate_json (bool, optional): Check Xtream API provided JSON for validity + enable_flask (bool, optional): Enable Flask + debug_flask (bool, optional): Enable the debug mode in Flask Returns: XTream Class Instance - Note 1: If it fails to authorize with provided username and password, auth_data will be an empty dictionary. - - Note 2: The JSON validation option will take considerable amount of time and it should be + - Note 2: The JSON validation option will take considerable amount of time and it should be used only as a debug tool. The Xtream API JSON from the provider passes through a - schema that represent the best available understanding of how the Xtream API + schema that represent the best available understanding of how the Xtream API works. """ self.server = provider_url @@ -384,7 +398,7 @@ def __init__( self.app_fullpath = osp.dirname(osp.realpath(__file__)) # prepare location of local html template - self.html_template_folder = osp.join(self.app_fullpath,"html") + self.html_template_folder = osp.join(self.app_fullpath, "html") # if the cache_path is specified, test that it is a directory if self.cache_path != "": @@ -403,7 +417,7 @@ def __init__( if headers is not None: self.connection_headers = headers else: - self.connection_headers = {'User-Agent':"Wget/1.20.3 (linux-gnu)"} + self.connection_headers = {'User-Agent': "Wget/1.20.3 (linux-gnu)"} self.authenticate() @@ -413,16 +427,27 @@ def __init__( print("Reload timer is OFF") if self.state['authenticated']: - if USE_FLASK: + if USE_FLASK and enable_flask: + print("Starting Web Interface") self.flaskapp = FlaskWrap( 'pyxtream', self, self.html_template_folder, debug=debug_flask ) self.flaskapp.start() + else: + print("Web interface not running") + + def get_download_progress(self, stream_id: int = None): + # TODO: Add check for stream specific ID + return json.dumps(self.download_progress) + + def get_last_7days(self): + return json.dumps(self.movies_7days, default=lambda x: x.export_json()) def search_stream(self, keyword: str, ignore_case: bool = True, return_type: str = "LIST", - stream_type: list = ("series", "movies", "channels")) -> list: + stream_type: list = ("series", "movies", "channels"), + added_after: datetime = None) -> list: """Search for streams Args: @@ -430,6 +455,7 @@ def search_stream(self, keyword: str, ignore_case (bool, optional): True to ignore case during search. Defaults to "True". return_type (str, optional): Output format, 'LIST' or 'JSON'. Defaults to "LIST". stream_type (list, optional): Search within specific stream type. + added_after (datetime, optional): Search for items that have been added after a certain date. Returns: list: List with all the results, it could be empty. @@ -450,8 +476,13 @@ def search_stream(self, keyword: str, collection = stream_collections[stream_type_name] print(f"Checking {len(collection)} {stream_type_name}") for stream in collection: - if re.match(regex, stream.name) is not None: - search_result.append(stream.export_json()) + if stream.name and re.match(regex, stream.name) is not None: + if added_after is None: + # Add all matches + search_result.append(stream.export_json()) + else: + # Only add if it is more recent + pass else: print(f"`{stream_type_name}` not found in collection") @@ -466,22 +497,28 @@ def download_video(self, stream_id: int) -> str: """Download Video from Stream ID Args: - stream_id (int): Stirng identifing the stream ID + stream_id (int): String identifying the stream ID Returns: str: Absolute Path Filename where the file was saved. Empty if could not download """ url = "" filename = "" + for series_stream in self.series: + if series_stream.series_id == stream_id: + episode_object: Episode = series_stream.episodes["1"] + url = f"{series_stream.url}/{episode_object.id}."\ + f"{episode_object.container_extension}" + for stream in self.movies: if stream.id == stream_id: url = stream.url fn = f"{self._slugify(stream.name)}.{stream.raw['container_extension']}" - filename = osp.join(self.cache_path,fn) + filename = osp.join(self.cache_path, fn) # If the url was correctly built and file does not exists, start downloading if url != "": - if not self._download_video_impl(url,filename): + if not self._download_video_impl(url, filename): return "Error" return filename @@ -522,14 +559,16 @@ def _download_video_impl(self, url: str, fullpath_filename: str) -> bool: # If there is an answer from the remote server if response.status_code in (200, 206): # Get content type Binary or Text - content_type = response.headers.get('content-type',None) + content_type = response.headers.get('content-type', None) # Get total playlist byte size - total_content_size = int(response.headers.get('content-length',None)) + total_content_size = int(response.headers.get('content-length', None)) total_content_size_mb = total_content_size/mb_size # Set downloaded size downloaded_bytes = 0 + self.download_progress['Total'] = total_content_size + self.download_progress['Progress'] = 0 # Set stream blocks block_bytes = int(4*mb_size) # 4 MB @@ -541,9 +580,10 @@ def _download_video_impl(self, url: str, fullpath_filename: str) -> bool: with open(fullpath_filename, mode) as file: # Grab data by block_bytes - for data in response.iter_content(block_bytes,decode_unicode=False): + for data in response.iter_content(block_bytes, decode_unicode=False): downloaded_bytes += block_bytes - progress(downloaded_bytes,total_content_size,"Downloading") + progress(downloaded_bytes, total_content_size, "Downloading") + self.download_progress['Progress'] = downloaded_bytes file.write(data) ret_code = True @@ -557,7 +597,10 @@ def _download_video_impl(self, url: str, fullpath_filename: str) -> bool: print(f"URL has a file with unexpected content-type {content_type}") else: print(f"HTTP error {response.status_code} while retrieving from {url}") + except requests.exceptions.ReadTimeout: + print("Read Timeout, try again") except Exception as e: + print("Unknown error") print(e) return ret_code @@ -626,9 +669,9 @@ def authenticate(self): # Request authentication, wait 4 seconds maximum r = requests.get(url, timeout=(4), headers=self.connection_headers) i = 31 - except requests.exceptions.ConnectionError: + except (requests.exceptions.ConnectionError, requests.exceptions.ReadTimeout): time.sleep(1) - print(f"{i} ", end='',flush=True) + print(f"{i} ", end='', flush=True) i += 1 if r is not None: @@ -677,7 +720,7 @@ def _load_from_file(self, filename) -> dict: my_data = None - # Get the enlapsed seconds since last file update + # Get the elapsed seconds since last file update file_age_sec = time.time() - osp.getmtime(full_filename) # If the file was updated less than the threshold time, # it means that the file is still fresh, we can load it. @@ -705,7 +748,7 @@ def _save_to_file(self, data_list: dict, filename: str) -> bool: filename (str): Name of the file Returns: - bool: True if successfull, False if error + bool: True if successful, False if error """ if data_list is None: return False @@ -731,7 +774,7 @@ def load_iptv(self) -> bool: Groups are for all three channel types, Live TV, VOD, and Series Returns: - bool: True if successfull, False if error + bool: True if successful, False if error """ # If pyxtream has not authenticated the connection, return empty if self.state["authenticated"] is False: @@ -753,7 +796,7 @@ def load_iptv(self) -> bool: pass for loading_stream_type in (self.live_type, self.vod_type, self.series_type): - ## Get GROUPS + # Get GROUPS # Try loading local file dt = 0 @@ -764,13 +807,13 @@ def load_iptv(self) -> bool: # Load all Groups and save file locally all_cat = self._load_categories_from_provider(loading_stream_type) if all_cat is not None: - self._save_to_file(all_cat,f"all_groups_{loading_stream_type}.json") + self._save_to_file(all_cat, f"all_groups_{loading_stream_type}.json") dt = timer() - start # If we got the GROUPS data, show the statistics and load GROUPS if all_cat is not None: print(f"{self.name}: Loaded {len(all_cat)} {loading_stream_type} Groups in {dt:.3f} seconds") - ## Add GROUPS to dictionaries + # Add GROUPS to dictionaries # Add the catch-all-errors group if loading_stream_type == self.live_type: @@ -796,7 +839,7 @@ def load_iptv(self) -> bool: print(f" - Could not load {loading_stream_type} Groups") break - ## Get Streams + # Get Streams # Try loading local file dt = 0 @@ -806,13 +849,13 @@ def load_iptv(self) -> bool: if all_streams is None: # Load all Streams and save file locally all_streams = self._load_streams_from_provider(loading_stream_type) - self._save_to_file(all_streams,f"all_stream_{loading_stream_type}.json") + self._save_to_file(all_streams, f"all_stream_{loading_stream_type}.json") dt = timer() - start # If we got the STREAMS data, show the statistics and load Streams if all_streams is not None: print(f"{self.name}: Loaded {len(all_streams)} {loading_stream_type} Streams in {dt:.3f} seconds") - ## Add Streams to dictionaries + # Add Streams to dictionaries skipped_adult_content = 0 skipped_no_name_content = 0 @@ -866,12 +909,12 @@ def load_iptv(self) -> bool: if not skip_stream: # Some channels have no group, # so let's add them to the catch all group - if stream_channel["category_id"] == "": + if not stream_channel["category_id"]: stream_channel["category_id"] = "9999" elif stream_channel["category_id"] != "1": pass - # Find the first occurence of the group that the + # Find the first occurrence of the group that the # Channel or Stream is pointing to the_group = next( (x for x in self.groups if x.group_id == int(stream_channel["category_id"])), @@ -892,7 +935,6 @@ def load_iptv(self) -> bool: group_title = self.series_catch_all_group.name the_group = self.series_catch_all_group - if loading_stream_type == self.series_type: # Load all Series new_series = Serie(self, stream_channel) @@ -943,6 +985,7 @@ def load_iptv(self) -> bool: print(f" - Could not load {loading_stream_type} Streams") self.state["loaded"] = True + return True def _save_to_file_skipped_streams(self, stream_channel: Channel): @@ -976,7 +1019,6 @@ def get_series_info_by_id(self, get_series: dict): for series_info in series_seasons["seasons"]: season_name = series_info["name"] - season_key = series_info['season_number'] season = Season(season_name) get_series.seasons[season_name] = season if "episodes" in series_seasons.keys(): @@ -1069,7 +1111,7 @@ def _load_categories_from_provider(self, stream_type: str): stream_type (str): Stream type can be Live, VOD, Series Returns: - [type]: JSON if successfull, otherwise None + [type]: JSON if successful, otherwise None """ url = "" if stream_type == self.live_type: @@ -1091,7 +1133,7 @@ def _load_streams_from_provider(self, stream_type: str): stream_type (str): Stream type can be Live, VOD, Series Returns: - [type]: JSON if successfull, otherwise None + [type]: JSON if successful, otherwise None """ url = "" if stream_type == self.live_type: @@ -1114,7 +1156,7 @@ def _load_streams_by_category_from_provider(self, stream_type: str, category_id) category_id ([type]): Category/Group ID. Returns: - [type]: JSON if successfull, otherwise None + [type]: JSON if successful, otherwise None """ url = "" @@ -1130,16 +1172,20 @@ def _load_streams_by_category_from_provider(self, stream_type: str, category_id) return self._get_request(url) # GET SERIES Info - def _load_series_info_by_id_from_provider(self, series_id: str): - """Gets informations about a Serie + def _load_series_info_by_id_from_provider(self, series_id: str, return_type: str = "DICT"): + """Gets information about a Serie Args: series_id (str): Serie ID as described in Group + return_type (str, optional): Output format, 'DICT' or 'JSON'. Defaults to "DICT". Returns: - [type]: JSON if successfull, otherwise None + [type]: JSON if successful, otherwise None """ - return self._get_request(self.get_series_info_URL_by_ID(series_id)) + data = self._get_request(self.get_series_info_URL_by_ID(series_id)) + if return_type == "JSON": + return json.dumps(data, ensure_ascii=False) + return data # The seasons array, might be filled or might be completely empty. # If it is not empty, it will contain the cover, overview and the air date @@ -1168,7 +1214,7 @@ def allLiveEpgByStream(self, stream_id): def allEpg(self): return self._get_request(self.get_all_epg_URL()) - ## URL-builder methods + # URL-builder methods def get_live_categories_URL(self) -> str: return f"{self.base_url}&action=get_live_categories" diff --git a/pyxtream/rest_api.py b/pyxtream/rest_api.py index bc7ef02..5086c2c 100644 --- a/pyxtream/rest_api.py +++ b/pyxtream/rest_api.py @@ -1,45 +1,50 @@ # Import Flask to control IPTV via REST API from threading import Thread - -from flask import Flask -from flask import Response as FlaskResponse -from flask import request as FlaskRequest import logging from os import path +from flask import Flask +from flask import Response as FlaskResponse class EndpointAction(object): + response: FlaskResponse + def __init__(self, action, function_name): self.function_name = function_name self.action = action def __call__(self, **args): + content_types = { + 'html': "text/html; charset=utf-8", + 'json': "text/json; charset=utf-8" + } + + handlers = { + # Add handlers here + "stream_search_generic": lambda: self._handle_search(args['term']), + "stream_search_with_type": lambda: self._handle_search(args['term'], args.get('type')), + "download_stream": lambda: self.action(int(args['stream_id'])), + "get_download_progress": lambda: self.action(int(args['stream_id'])), + "get_last_7days": lambda: self.action(), + "home": lambda: self.action, + "get_series": lambda: self.action(int(args['series_id']), "JSON") + } + + answer = handlers[self.function_name]() + content_type = content_types['json'] if self.function_name not in ('home') else content_types['html'] + + self.response = FlaskResponse(answer, status=200, headers={"Content-Type": content_type}) + return self.response - if args != {}: - - #Stream Search - if self.function_name == "stream_search": - regex_term = r"^.*{}.*$".format(args['term']) - answer = self.action(regex_term, return_type = 'JSON') - - # Download stream - elif self.function_name == "download_stream": - answer = self.action(int(args['stream_id'])) - - else: - print(args) - answer = "Hello" - - self.response = FlaskResponse(answer, status=200, headers={}) - self.response.headers["Content-Type"] = "text/json; charset=utf-8" - else: - answer = self.action - self.response = FlaskResponse(answer, status=200, headers={}) - self.response.headers["Content-Type"] = "text/html; charset=utf-8" + def _handle_search(self, term, stream_type=None): + regex_term = r"^.*{}.*$".format(term) + if stream_type: + stream_type = [stream_type] if stream_type else ("series", "movies", "channels") + return self.action(regex_term, return_type='JSON', stream_type=stream_type) + return self.action(regex_term, return_type='JSON') - return self.response class FlaskWrap(Thread): @@ -50,7 +55,9 @@ class FlaskWrap(Thread): host: str = "" port: int = 0 - def __init__(self, name, xtream: object, html_template_folder: str = None, host: str = "0.0.0.0", port: int = 5000, debug: bool = True): + def __init__(self, name, xtream: object, html_template_folder: str = None, + host: str = "0.0.0.0", port: int = 5000, debug: bool = True + ): log = logging.getLogger('werkzeug') log.setLevel(logging.ERROR) @@ -64,20 +71,42 @@ def __init__(self, name, xtream: object, html_template_folder: str = None, host: Thread.__init__(self) # Configure Thread - self.name ="pyxtream REST API" + self.name = "pyxtream REST API" self.daemon = True # Load HTML Home Template if any if html_template_folder is not None: - self.home_template_file_name = path.join(html_template_folder,"index.html") + self.home_template_file_name = path.join(html_template_folder, "index.html") if path.isfile(self.home_template_file_name): - with open(self.home_template_file_name,'r', encoding="utf-8") as home_html: + with open(self.home_template_file_name, 'r', encoding="utf-8") as home_html: self.home_template = home_html.read() # Add all endpoints - self.add_endpoint(endpoint='/', endpoint_name='home', handler=[self.home_template,""]) - self.add_endpoint(endpoint='/stream_search/', endpoint_name='stream_search', handler=[self.xt.search_stream,"stream_search"]) - self.add_endpoint(endpoint='/download_stream//', endpoint_name='download_stream', handler=[self.xt.download_video,"download_stream"]) + self.add_endpoint(endpoint='/', endpoint_name='home', handler=[self.home_template, "home"]) + self.add_endpoint(endpoint='/stream_search/', + endpoint_name='stream_search_generic', + handler=[self.xt.search_stream, 'stream_search_generic'] + ) + self.add_endpoint(endpoint='/stream_search//', + endpoint_name='stream_search_with_type', + handler=[self.xt.search_stream, 'stream_search_with_type'] + ) + self.add_endpoint(endpoint='/download_stream//', + endpoint_name='download_stream', + handler=[self.xt.download_video, "download_stream"] + ) + self.add_endpoint(endpoint='/get_download_progress//', + endpoint_name='get_download_progress', + handler=[self.xt.get_download_progress, "get_download_progress"] + ) + self.add_endpoint(endpoint='/get_last_7days', + endpoint_name='get_last_7days', + handler=[self.xt.get_last_7days, "get_last_7days"] + ) + self.add_endpoint(endpoint='/get_series/', + endpoint_name='get_series', + handler=[self.xt._load_series_info_by_id_from_provider, "get_series"] + ) def run(self): self.app.run(debug=self.debug, use_reloader=False, host=self.host, port=self.port) diff --git a/pyxtream/schemaValidator.py b/pyxtream/schemaValidator.py index dd3cfd6..1645729 100644 --- a/pyxtream/schemaValidator.py +++ b/pyxtream/schemaValidator.py @@ -13,6 +13,7 @@ class SchemaType(Enum): CHANNEL = 5 GROUP = 6 + series_schema = { "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://example.com/product.schema.json", @@ -28,13 +29,13 @@ class SchemaType(Enum): "type": "string", "format": "date" }, - "episode_count": { "type": "integer" }, - "id": { "type": "integer" }, - "name": { "type": "string" }, - "overview": { "type": "string" }, - "season_number": { "type": "integer" }, + "episode_count": {"type": "integer"}, + "id": {"type": "integer"}, + "name": {"type": "string"}, + "overview": {"type": "string"}, + "season_number": {"type": "integer"}, "cover": { - "type": "string", + "type": "string", "format": "uri", "qt-uri-protocols": [ "http", @@ -42,7 +43,7 @@ class SchemaType(Enum): ] }, "cover_big": { - "type": "string", + "type": "string", "format": "uri", "qt-uri-protocols": [ "http", @@ -58,7 +59,7 @@ class SchemaType(Enum): }, "info": { "properties": { - "name": { "type": "string" }, + "name": {"type": "string"}, "cover": { "type": "string", "format": "uri", @@ -67,14 +68,14 @@ class SchemaType(Enum): "https" ] }, - "plot": { "type": "string" }, - "cast": { "type": "string" }, - "director": { "type": "string" }, - "genre": { "type": "string" }, - "releaseDate": { "type": "string", "format": "date" }, - "last_modified": { "type": "string", "format": "integer" }, - "rating": { "type": "string", "format": "integer" }, - "rating_5based": { "type": "number" }, + "plot": {"type": "string"}, + "cast": {"type": "string"}, + "director": {"type": "string"}, + "genre": {"type": "string"}, + "releaseDate": {"type": "string", "format": "date"}, + "last_modified": {"type": "string", "format": "integer"}, + "rating": {"type": "string", "format": "integer"}, + "rating_5based": {"type": "number"}, "backdrop_path": { "type": "array", "items": { @@ -86,9 +87,9 @@ class SchemaType(Enum): ] } }, - "youtube_trailed": { "type": "string" }, - "episode_run_time": { "type": "string", "format": "integer" }, - "category_id": { "type": "string", "format": "integer" } + "youtube_trailed": {"type": "string"}, + "episode_run_time": {"type": "string", "format": "integer"}, + "category_id": {"type": "string", "format": "integer"} }, "required": [ "name" @@ -101,20 +102,20 @@ class SchemaType(Enum): "type": "array", "items": { "properties": { - "id": { "type": "string", "format": "integer" }, - "episode_num": {"type": "integer" }, - "title": { "type": "string" }, - "container_extension": { "type": "string" }, + "id": {"type": "string", "format": "integer"}, + "episode_num": {"type": "integer"}, + "title": {"type": "string"}, + "container_extension": {"type": "string"}, "info": { "type": "object", "items": { - "plot": { "type": "string" } + "plot": {"type": "string"} } }, - "customer_sid": { "type": "string" }, - "added": { "type": "string", "format": "integer" }, - "season": { "type": "integer" }, - "direct_source": { "type": "string" } + "customer_sid": {"type": "string"}, + "added": {"type": "string", "format": "integer"}, + "season": {"type": "integer"}, + "direct_source": {"type": "string"} } } }, @@ -134,7 +135,7 @@ class SchemaType(Enum): "description": "xtream API Series Info Schema", "type": "object", "properties": { - "name": { "type": "string" }, + "name": {"type": "string"}, "cover": { "type": "string", "format": "uri", @@ -143,14 +144,14 @@ class SchemaType(Enum): "https" ] }, - "plot": { "type": "string" }, - "cast": { "type": "string" }, - "director": { "type": "string" }, - "genre": { "type": "string" }, - "releaseDate": { "type": "string", "format": "date" }, - "last_modified": { "type": "string", "format": "integer" }, - "rating": { "type": "string", "format": "integer" }, - "rating_5based": { "type": "number" }, + "plot": {"type": "string"}, + "cast": {"type": "string"}, + "director": {"type": "string"}, + "genre": {"type": "string"}, + "releaseDate": {"type": "string", "format": "date"}, + "last_modified": {"type": "string", "format": "integer"}, + "rating": {"type": "string", "format": "integer"}, + "rating_5based": {"type": "number"}, "backdrop_path": { "anyOf": [ { @@ -167,9 +168,9 @@ class SchemaType(Enum): {"type": "string"} ] }, - "youtube_trailed": { "type": "string" }, - "episode_run_time": { "type": "string", "format": "integer" }, - "category_id": { "type": "string", "format": "integer" } + "youtube_trailed": {"type": "string"}, + "episode_run_time": {"type": "string", "format": "integer"}, + "category_id": {"type": "string", "format": "integer"} }, "required": [ "name", @@ -183,39 +184,39 @@ class SchemaType(Enum): "description": "xtream API Live Schema", "type": "object", "properties": { - "num": { "type": "integer" }, - "name": { "type": "string" }, - "stream_type": { "type": "string" }, - "stream_id": { "type": "integer" }, + "num": {"type": "integer"}, + "name": {"type": "string"}, + "stream_type": {"type": "string"}, + "stream_id": {"type": "integer"}, "stream_icon": { "anyOf": [ { - "type": "string", - "format": "uri", - "qt-uri-protocols": [ - "http", - "https" - ] + "type": "string", + "format": "uri", + "qt-uri-protocols": [ + "http", + "https" + ] }, - { "type": "null" } + {"type": "null"} ] }, "epg_channel_id": { - "anyOf": [ - { "type": "null" }, - { "type": "string" } + "anyOf": [ + {"type": "null"}, + {"type": "string"} ] }, - "added": { "type": "string", "format": "integer" }, - "is_adult": { "type": "string", "format":"number" }, - "category_id": { "type": "string" }, - "custom_sid": { "type": "string" }, - "tv_archive": { "type": "number" }, - "direct_source": { "type": "string" }, - "tv_archive_duration":{ + "added": {"type": "string", "format": "integer"}, + "is_adult": {"type": "string", "format": "number"}, + "category_id": {"type": "string"}, + "custom_sid": {"type": "string"}, + "tv_archive": {"type": "number"}, + "direct_source": {"type": "string"}, + "tv_archive_duration": { "anyOf": [ - { "type": "number" }, - { "type": "string", "format": "integer" } + {"type": "number"}, + {"type": "string", "format": "integer"} ] } } @@ -227,37 +228,37 @@ class SchemaType(Enum): "description": "xtream API VOD Schema", "type": "object", "properties": { - "num": { "type": "integer" }, - "name": { "type": "string" }, - "stream_type": { "type": "string" }, - "stream_id": { "type": "integer" }, + "num": {"type": "integer"}, + "name": {"type": "string"}, + "stream_type": {"type": "string"}, + "stream_id": {"type": "integer"}, "stream_icon": { "anyOf": [ { - "type": "string", - "format": "uri", - "qt-uri-protocols": [ - "http", - "https" - ] + "type": "string", + "format": "uri", + "qt-uri-protocols": [ + "http", + "https" + ] }, - { "type": "null" } + {"type": "null"} ] }, - "rating": { - "anyOf": [ - { "type": "null" }, - { "type": "string", "format": "integer" }, - { "type": "number" } + "rating": { + "anyOf": [ + {"type": "null"}, + {"type": "string", "format": "integer"}, + {"type": "number"} ] }, - "rating_5based": { "type": "number" }, - "added": { "type": "string", "format": "integer" }, - "is_adult": { "type": "string", "format":"number" }, - "category_id": { "type": "string" }, - "container_extension": { "type": "string" }, - "custom_sid": { "type": "string" }, - "direct_source": { "type": "string" } + "rating_5based": {"type": "number"}, + "added": {"type": "string", "format": "integer"}, + "is_adult": {"type": "string", "format": "number"}, + "category_id": {"type": "string"}, + "container_extension": {"type": "string"}, + "custom_sid": {"type": "string"}, + "direct_source": {"type": "string"} } } channel_schema = {} @@ -268,12 +269,13 @@ class SchemaType(Enum): "description": "xtream API Group Schema", "type": "object", "properties": { - "category_id": { "type": "string" }, - "category_name": { "type": "string" }, - "parent_id": { "type": "integer" } + "category_id": {"type": "string"}, + "category_name": {"type": "string"}, + "parent_id": {"type": "integer"} } } + def schemaValidator(jsonData: str, schemaType: SchemaType) -> bool: if (schemaType == SchemaType.SERIES): @@ -291,7 +293,6 @@ def schemaValidator(jsonData: str, schemaType: SchemaType) -> bool: else: json_schema = "{}" - try: validate(instance=jsonData, schema=json_schema) except exceptions.ValidationError as err: diff --git a/pyxtream/version.py b/pyxtream/version.py index 35131a4..0fea4f0 100644 --- a/pyxtream/version.py +++ b/pyxtream/version.py @@ -1,4 +1,4 @@ -__version__ = '0.7.2' +__version__ = '0.7.3' __author__ = 'Claudio Olmi' __author_email__ = 'superolmo2@gmail.com' diff --git a/run_tests.sh b/run_tests.sh new file mode 100755 index 0000000..19d2e3d --- /dev/null +++ b/run_tests.sh @@ -0,0 +1 @@ +poetry run pytest --cov=pyxtream test/test_pyxtream.py \ No newline at end of file diff --git a/setup.py b/setup.py deleted file mode 100644 index a0c1079..0000000 --- a/setup.py +++ /dev/null @@ -1,39 +0,0 @@ -import os -from setuptools import setup, find_packages - -with open("README.md", "r", encoding='utf-8') as fh: - long_description = fh.read() - -main_ns = {} -ver_path = os.path.join('pyxtream', 'version.py') -with open(ver_path, encoding='utf-8') as ver_file: - exec(ver_file.read(), main_ns) - -setup( - name='pyxtream', - version=main_ns['__version__'], - author=main_ns['__author__'], - author_email=main_ns['__author_email__'], - description="xtream IPTV loader", - long_description=long_description, - long_description_content_type="text/markdown", - url="https://github.com/superolmo/pyxtream", - packages=find_packages(), - license="GPL3", - classifiers=[ - "Development Status :: 4 - Beta", - "Environment :: Console", - "Intended Audience :: Developers", - "Programming Language :: Python :: 3 :: Only", - "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", - "Operating System :: OS Independent", - "Natural Language :: English" - ], - install_requires=[ - 'jsonschema', - 'requests', - ], - extras_require={ - "REST_API": ["Flask>=1.1.2",], - } - ) \ No newline at end of file diff --git a/test/requirements.txt b/test/requirements.txt new file mode 100644 index 0000000..2e6fbf8 --- /dev/null +++ b/test/requirements.txt @@ -0,0 +1,11 @@ +attrs==25.1.0 ; python_version >= "3.9" +certifi==2025.1.31 ; python_version >= "3.9" +charset-normalizer==3.4.1 ; python_version >= "3.9" +idna==3.10 ; python_version >= "3.9" +jsonschema-specifications==2024.10.1 ; python_version >= "3.9" +jsonschema==4.23.0 ; python_version >= "3.9" +referencing==0.36.2 ; python_version >= "3.9" +requests==2.32.3 ; python_version >= "3.9" +rpds-py==0.22.3 ; python_version >= "3.9" +typing-extensions==4.12.2 ; python_version < "3.13" and python_version >= "3.9" +urllib3==2.3.0 ; python_version >= "3.9" diff --git a/test/test_pyxtream.py b/test/test_pyxtream.py new file mode 100644 index 0000000..8d19a2b --- /dev/null +++ b/test/test_pyxtream.py @@ -0,0 +1,175 @@ +# test_pyxtream.py +import os +from datetime import datetime, timedelta +from unittest.mock import Mock, patch + +import pytest + +import sys +sys.path.insert(0, '../pyxtream') +from pyxtream import Channel, Episode, Group, Serie, XTream + +# Mock data for provider connection +mock_provider_name = "Test Provider" +mock_provider_username = "test_user" # Must be the same as in the MOCK_AUTH_DATA +mock_provider_password = "test_pass" # Must be the same as in the MOCK_AUTH_DATA +mock_provider_url = "http://test.server.com" # Must be the same as in the MOCK_AUTH_DATA + + +# Mock data for testing +MOCK_AUTH_DATA = { + "user_info": { + "username": mock_provider_username, + "password": mock_provider_password, + "exp_date": str(int((datetime.now() + timedelta(days=30)).timestamp())) + }, + "server_info": { + "url": "test.server.com", + "https_port": "443" + } +} + +MOCK_CATEGORIES = [ + {"category_id": 1, "category_name": "Live TV"}, + {"category_id": 2, "category_name": "Movies"} +] + +MOCK_STREAMS = [ + {"stream_id": 1, "name": "Channel 1", "stream_type": "live", "category_id": 1, + "stream_icon": f"{mock_provider_url}/icon1.png", "added": "1638316800"}, + {"stream_id": 2, "name": "Movie 1", "stream_type": "movie", "category_id": 2, + "stream_icon": f"{mock_provider_url}/icon2.png", "added": "1638316800"} +] + +MOCK_SERIES_INFO = { + "seasons": [ + {"season_number": 1, "name": "Season 1", "cover": f"{mock_provider_url}/cover1.jpg"} + ], + "episodes": { + "1": [ + {"id": 1, "title": "Episode 1", "container_extension": "mp4", "info": {}} + ] + } +} + +# Fixture for environment setup +@pytest.fixture(autouse=True) +def setup_environment(monkeypatch): + """Setup environment before each test.""" + # Mock the cache directory + monkeypatch.setattr("pyxtream.XTream.cache_path", "/tmp/pyxtream_cache") + # Ensure the cache directory exists + os.makedirs("/tmp/pyxtream_cache", exist_ok=True) + + +@pytest.fixture(scope="module") +def mock_xtream(): + with patch('requests.get') as mock_get: + mock_get.return_value.ok = True + mock_get.return_value.json.return_value = MOCK_AUTH_DATA + USE_FLASK=False + xtream = XTream( + provider_name=mock_provider_name, + provider_username=mock_provider_username, + provider_password=mock_provider_password, + provider_url=mock_provider_url + ) + return xtream + +def test_authentication(mock_xtream): + assert mock_xtream.state["authenticated"] is True + assert mock_xtream.authorization["username"] == mock_provider_username + assert mock_xtream.authorization["password"] == mock_provider_password + +def test_channel_initialization(mock_xtream): + stream_info = { + "stream_id": "123", + "name": "Test Channel", + "stream_icon": f"{mock_provider_url}/icon.png", + "stream_type": "live", + "category_id": "1", + "added": "1638316800", + "container_extension": "ts" + } + channel = Channel(mock_xtream, "Test Group", stream_info) + assert channel.id == "123" + assert channel.name == "Test Channel" + assert channel.logo == f"{mock_provider_url}/icon.png" + assert channel.group_title == "Test Group" + assert channel.url.startswith( + f"{mock_provider_url}/live/{mock_provider_username}/{mock_provider_password}/123.ts" + ) + +def test_group_initialization(): + group_info = {"category_id": 1, "category_name": "Live TV"} + group = Group(group_info, "Live") + assert group.group_id == 1 + assert group.name == "Live TV" + assert group.group_type == 0 # TV_GROUP + +def test_serie_initialization(mock_xtream): + series_info = { + "series_id": 1, + "name": "Test Series", + "cover": f"{mock_provider_url}/cover.jpg", + "last_modified": "1638316800", + "plot": "Test plot", + "youtube_trailer": "http://youtube.com/trailer", + "genre": "Action" + } + serie = Serie(mock_xtream, series_info) + assert serie.series_id == 1 + assert serie.name == "Test Series" + assert serie.logo == f"{mock_provider_url}/cover.jpg" + assert serie.url.startswith( + f"{mock_provider_url}/series/{mock_provider_username}/{mock_provider_password}/1/" + ) + assert serie.plot == "Test plot" + assert serie.youtube_trailer == "http://youtube.com/trailer" + assert serie.genre == "Action" + assert isinstance(serie.seasons, dict) + assert isinstance(serie.episodes, dict) + +def test_episode_initialization(mock_xtream): + series_info = {"cover": f"{mock_provider_url}/cover.jpg"} + episode_info = { + "id": 1, + "title": "Episode 1", + "container_extension": "mp4", + "info": {}, + "episode_num": 1 + } + episode = Episode(mock_xtream, series_info, "Test Group", episode_info) + assert episode.id == 1 + assert episode.title == "Episode 1" + +def test_load_categories(mock_xtream): + with patch.object(mock_xtream, '_get_request', return_value=MOCK_CATEGORIES) as mock_get: + # Test live categories + categories = mock_xtream._load_categories_from_provider(mock_xtream.live_type) + assert len(categories) == 2 + assert categories[0]["category_name"] == "Live TV" + +def test_load_streams(mock_xtream): + with patch.object(mock_xtream, '_get_request', return_value=MOCK_STREAMS) as mock_get: + + # Test live streams + streams = mock_xtream._load_streams_from_provider(mock_xtream.live_type) + assert len(streams) == 2 + assert streams[0]["name"] == "Channel 1" + +def test_validate_url(mock_xtream): + assert mock_xtream._validate_url("http://valid.url") is True + assert mock_xtream._validate_url("invalid.url") is False + +def test_slugify(mock_xtream): + assert mock_xtream._slugify("Test String!") == "test string!" + assert mock_xtream._slugify("123ABC") == "123abc" + +def test_get_logo_local_path(mock_xtream): + logo_url = f"{mock_provider_url}/logo.png" + expected_path = os.path.join( + mock_xtream.cache_path, + "test provider-logo.png" + ) + assert mock_xtream._get_logo_local_path(logo_url) == expected_path