diff --git a/ajouter_media.sh b/ajouter_media.sh index 9f0cd8e0..1d3f7664 100755 --- a/ajouter_media.sh +++ b/ajouter_media.sh @@ -208,12 +208,13 @@ mkdir -p ${YTEMP} # youtube-dl $YTURL echo "VIDEO $YTURL" +# --write-subs --write-auto-subs --sub-langs "fr, en, en-orig" --embed-subs + /usr/local/bin/youtube-dl -f "(bv*[ext=mp4][height<=720]+ba/b[height<=720])" \ --cookies-from-browser $BROWSER \ --download-archive $HOME/.zen/.yt-dlp.list \ - -S "filesize:700M" --no-mtime --embed-thumbnail --add-metadata \ + -S res,ext:mp4:m4a --recode mp4 --no-mtime --embed-thumbnail --add-metadata \ --no-playlist --write-info-json --write-description --no-get-comments \ - --write-subs --write-auto-subs --sub-langs "fr, en, en-orig" --embed-subs \ --no-mtime -o "${YTEMP}/%(id)s&%(title)s.%(ext)s" $YTURL # Get filename, extract ID, make destination dir and move copy. diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/LICENSE.txt b/templates/.kodi/addons/plugin.video.filmsforaction/LICENSE.txt deleted file mode 100644 index d159169d..00000000 --- a/templates/.kodi/addons/plugin.video.filmsforaction/LICENSE.txt +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/README.md b/templates/.kodi/addons/plugin.video.filmsforaction/README.md deleted file mode 100644 index 8c09d38f..00000000 --- a/templates/.kodi/addons/plugin.video.filmsforaction/README.md +++ /dev/null @@ -1,46 +0,0 @@ -Films For Action Videos: KODI video add-on to watch the Films For Action videos from the FFA web site. - - Copyright (C) 2014 Jose Antonio Montes (jamontes) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - - -Initial release 1.0.0 - -[![Build status](https://ci.appveyor.com/api/projects/status/b6cc9449bhep93aj/branch/master?svg=true)](https://ci.appveyor.com/project/jamontes/plugin-video-filmsforaction/branch/master) - -This KODI add-on allows to watch the videos from the Films For Action web site (more than 2500 videos available). - -<< Films For Action is a community-powered learning library and alternative news center for people who want to change the world. - -At an International Level: -Films For Action uses the power of film to raise awareness of important social, environmental, and media-related issues not covered by the mainstream news. Our goal is to provide citizens with the information and perspectives essential to creating a more just, sustainable, and democratic society. - -At the Local Level: -On the ground, our City Chapters are working to create alternative media channels that will inform, connect, and inspire action at a community level. - -Our city chapters screen documentaries at independent theaters and other venues regularly throughout the year. With most films we launch an accompanying educational and action-oriented campaign to address the issues presented by the films. Some of our chapters air films on their local public Access TV channel. And all the films we buy we make available for people to borrow from us for free, either to watch themselves or to screen in their own neighborhoods. - -Our local city chapter sub-sites offer several tools to connect and inform people through our website, including a calendar of local activist events, a directory of local progressive and radical groups, and a blog for writers to contribute local news and perspectives. - -All in all, through the screenings, public access TV, this website, and our Lending Library, our City Chapters aim to provide an information and resource network that will reduce its city's dependence on corporate media, providing more meaningful and reliable ways to stay informed on the issues that matter. >> (citation: https://www.filmsforaction.org/about/) - -To install it simply download the zip file, and then proceed as with any other plugin from XBMC: - System->Settings->Add-ons->Install from zip file. - -Any issues detected can be reported using this forum thread for official support: https://forum.kodi.tv/showthread.php?tid=198524 - -Enjoy it! - -jamontes diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/addon.xml b/templates/.kodi/addons/plugin.video.filmsforaction/addon.xml deleted file mode 100644 index 9e687c64..00000000 --- a/templates/.kodi/addons/plugin.video.filmsforaction/addon.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - video - - - all - Films For Action videos - Films For Action is a community-powered learning library and alternative news center for people who want to change the world. It uses the power of film to raise awareness of important social, environmental, and media-related issues not covered by the mainstream news. This Add-on allows you to watch most of its videos.[CR]More than 2,500 videos are available. - Films For Action vídeos - Films For Action usa el poder de los vídeos para llamar la atención sobre la importancia de los problemas sociales, medioambientales, e informativos no cubiertos por los principales medios de comunicación. Films For Action ofrece una fuente alternativa de noticias y aprendizaje mantenida por la comunidad para la gente que quiere cambiar el mundo. Este Add-on permite ver los vídeos de Films For Action mostrados en su página web.[CR]Más de 2500 vídeos están disponibles. - Films For Action médiathèque - Cette plugin permetre de regarder le Films For Action médiathèque qui se trouve sur leur site web. - Films For Action videos - Dieses plugin erlaubt es, die videos aus dem Films For Action website zu sehen. - en - GPL-3.0-or-later - https://forum.kodi.tv/showthread.php?tid=198524 - https://github.com/jamontes/plugin.video.filmsforaction - https://www.filmsforaction.org/ - - diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/changelog.txt b/templates/.kodi/addons/plugin.video.filmsforaction/changelog.txt deleted file mode 100644 index 4613cb3c..00000000 --- a/templates/.kodi/addons/plugin.video.filmsforaction/changelog.txt +++ /dev/null @@ -1,79 +0,0 @@ -1.1.2 (2021.12.28) -- Quick fix due to website changes (thanks to Itai0001). -- Replaced Travis-CI by AppVeyor for unit tests. -1.1.1 (2020.05.06) -- Quick fix due to website changes. -1.1.0 (2019.01.27) -- Updated add-on for Isengard+ due to missing add-on dependency. -1.0.10 (2018.09.05) -- Removed add-on dependencies. -- Deprecated Gotham release due to missing add-on dependency. -- Modified to allow upgrades from Helix release onwards. -- Minor changes and refactoring. -1.0.9 (2018.03.30) -- Minor fixes due to website changes. -- Added sort by most viewed/recent option from add-on settings menu. -1.0.8 (2017.03.13) -- Fixed video scraper due to Dailymotion website changes. -- Fixed category menus due to website changes. -- Fixed search option due to website changes. -- Fixed Next/Previous Page entries due to website changes. -- Improved Vimeo scraper to support non standard video resolutions. -- Updated logging system. -- Updated lutils library to latest version. -- Updated category test case. -- Improved video patterns. -- Code refactored and cleaned. -1.0.7 (2016.04.05) -- Update Vimeo scraper due to Vimeo website changes. -1.0.6 (2015.08.11) -- Quick fix on scraper due to Dailymotion website changes. -- Fixed Next/Previous Page entries due to website changes. -1.0.5 -- Added filter to show All/Best videos from add-on setings menu. -- Included category menu into the Next/Previous Page title entries. -- Fixed last page regexp for Next Page entry to allow explore beyond nine. -1.0.4 -- Fixed Next/Previous Page entries due to website changes. -- Updated Dailymotion scraper to support more video formats. -1.0.3 -- Rewriten video list parser to make it more tolerant to website changes. -- Replaced builtin Disclose TV parser on behalf of Disclose TV add-on (credits: sphere) -1.0.2 -- Added Travis-CI integration support for scraper API testing. -- Added support for Disclose TV videos. -- Modified video list parser due to website changes. -- Improved Search option for retrieve all kind of videos. -1.0.1 -- Added mail tag into addon.xml file. -- Added settings.xml encoding line. -- Modified add-on logging system according to recommendations. -- Modified categories parser due to website changes. -1.0.0 -- Fixed Vimeo custom scraper due to API change. -- Modified video list parser due to website changes. -- Added support for SnagFilms videos thanks to the SnagFilms add-on (credits: t1m). -- Updated version number for official repo bump. -0.1.0 -- Remove the Vimeo add-on dependency due to a problem found running on Gotham. -- Made custom Vimeo scraper to support the Vimeo videos on Gotham. -- Added forum thread to addon and README files. -0.0.9 -- Clean up code and documentation. -- prepare everything for first bump into git repo. -0.0.8 -- Added fanart and icon. -0.0.7 -- Added Search option for videos. -0.0.6 -- Added internationalization support. -0.0.5 -- Added support for Dailymotion, archive.org and kickstarter videos. -0.0.4 -- Updated parser for page navigation. -0.0.3 -- Suported videos for Youtube and Vimeo. -0.0.2 -- added suport for info tags in videos. -0.0.1 -- First Try. diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/default.py b/templates/.kodi/addons/plugin.video.filmsforaction/default.py deleted file mode 100644 index 9a15c4f3..00000000 --- a/templates/.kodi/addons/plugin.video.filmsforaction/default.py +++ /dev/null @@ -1,176 +0,0 @@ -# -*- coding: utf-8 -*- - -''' - KODI Films For Action video add-on. - Copyright (C) 2014 José Antonio Montes (jamontes) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - - This is the first trial of the Films For Action video add-on for KODI. - This add-on gets the videos from Films For Action web site and shows them properly ordered. - You can choose the preferred language for the videos, if it is available. - This plugin depends on the lutil library functions. -''' - -from resources.lib.plugin import Plugin -import resources.lib.ffa_api as api - -plugin_id = 'plugin.video.filmsforaction' - -localized_strings = { - 'Next page': 30010, - 'Type not suported': 30011, - 'Video not located': 30012, - 'Previous page': 30013, - 'All videos': 30014, - 'Search': 30015, - } - -p = Plugin(plugin_id) - -settings = p.get_plugin_settings() -translation = p.get_plugin_translation() - -debug_flag = settings.getSetting("debug") == "true" - -p.set_debug_mode(debug_flag) -api.set_debug(debug_flag, p.log) - -# By default, both, the website and the add-on are setup to show only the best videos. -all_filter = '&quality=all' if settings.getSetting("show_best") == "false" else '&quality=best' -sort_param = '&sort=new' if settings.getSetting("views") == "false" else '&sort=views' - -if all_filter == '&quality=all': - p.log("ffa.main: 'all videos' filter is explicit setup.") - -if sort_param == '&sort=views': - p.log("ffa.main: sorted by views is explicit setup.") - -def get_located_string(string_name): - return translation(localized_strings.get(string_name)).encode('utf-8') or string_name if string_name in localized_strings else string_name - - -# Entry point -def run(): - p.log("ffa.run") - - # Get params - params = p.get_plugin_parms() - - action = params.get("action", '') - if action: - eval("%s(params)" % action) - else: - create_index(params) - - -# Main menu -def create_index(params): - p.log("ffa.create_index "+repr(params)) - - action = 'main_list' - - category_list = api.get_categories() - - menu_entry = get_located_string('All videos') - all_videos_item = { - 'thumbnail': '', - 'info': { - 'title': menu_entry, - 'genre': menu_entry, - }, - 'path': p.get_plugin_path(url = 'https://www.filmsforaction.org/library/?category=all+videos' + all_filter + sort_param, action = action, category = menu_entry), - 'IsPlayable' : False - } - - menu_entry = get_located_string('Search') - search_videos_item = { - 'thumbnail': '', - 'info': { - 'title': menu_entry, - 'genre': menu_entry, - }, - 'path': p.get_plugin_path(action = 'search_videos', category = menu_entry), - 'IsPlayable' : False - } - - categories = [ { - 'thumbnail': '', - 'info': { - 'title': category_title, - 'genre': category_title - }, - 'path': p.get_plugin_path(url = category_url + all_filter + sort_param, action = action, category = category_title), - 'IsPlayable' : False - } for category_url, category_title in category_list] - - categories.insert(0, all_videos_item) - categories.insert(0, search_videos_item) - p.add_items(categories) - - -def main_list(params): - p.log("ffa.main_list "+repr(params)) - - category = params.get("category", "") - videos = api.get_videolist(params.get("url"), category) - reset_cache = 'yes' if params.get('reset_cache') == 'yes' or videos['reset_cache'] else 'no' - - video_list = [ { - 'thumbnail' : video_entry.get('thumbnail') or '', - 'info': { - 'title' : video_entry.get('title'), - 'plot' : video_entry.get('plot') or '', - 'studio' : video_entry.get('credits') or '', - 'genre' : video_entry.get('genre') or '', - 'rating' : video_entry.get('rating') or '', - 'duration': video_entry.get('duration') or 1, - }, - 'path' : p.get_plugin_path( - url = video_entry['url'], - action = 'play_video', - ) if video_entry['IsPlayable'] else p.get_plugin_path( - url = video_entry['url'], - action = 'main_list', - reset_cache = reset_cache, - category = category, - ), - 'IsPlayable' : video_entry['IsPlayable'] - } for video_entry in videos['video_list']] - - p.add_items(video_list, reset_cache == 'yes') - - -def search_videos(params): - p.log("ffa.search_video "+repr(params)) - - search_string = p.get_keyboard_text(get_located_string('Search')) - if search_string: - params['url'] = api.get_search_url(search_string) + all_filter + sort_param - p.log("ffa.search Value of search url: %s" % params['url']) - return main_list(params) - - -def play_video(params): - p.log("ffa.play_video "+repr(params)) - - url = api.get_playable_url(params.get("url")) - - if url: - return p.play_resolved_url(url) - else: - p.showWarning(get_located_string('Type not suported')) - - -run() diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/fanart.jpg b/templates/.kodi/addons/plugin.video.filmsforaction/fanart.jpg deleted file mode 100644 index 46ecc9bc..00000000 Binary files a/templates/.kodi/addons/plugin.video.filmsforaction/fanart.jpg and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/icon.png b/templates/.kodi/addons/plugin.video.filmsforaction/icon.png deleted file mode 100644 index 5273da8f..00000000 Binary files a/templates/.kodi/addons/plugin.video.filmsforaction/icon.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/icon_and_fanart_credits.txt b/templates/.kodi/addons/plugin.video.filmsforaction/icon_and_fanart_credits.txt deleted file mode 100644 index b4f3b921..00000000 --- a/templates/.kodi/addons/plugin.video.filmsforaction/icon_and_fanart_credits.txt +++ /dev/null @@ -1,5 +0,0 @@ -icon.png -source: https://myspace.com/filmsforaction - -fanart.jpg -source: https://www.facebook.com/filmsforaction/ diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/resources/__init__.py b/templates/.kodi/addons/plugin.video.filmsforaction/resources/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/resources/__init__.pyo b/templates/.kodi/addons/plugin.video.filmsforaction/resources/__init__.pyo deleted file mode 100644 index eb14518d..00000000 Binary files a/templates/.kodi/addons/plugin.video.filmsforaction/resources/__init__.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/resources/language/resource.language.de_de/strings.po b/templates/.kodi/addons/plugin.video.filmsforaction/resources/language/resource.language.de_de/strings.po deleted file mode 100644 index 57dc7b47..00000000 --- a/templates/.kodi/addons/plugin.video.filmsforaction/resources/language/resource.language.de_de/strings.po +++ /dev/null @@ -1,55 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Films For Action -# Addon id: plugin.video.filmsforaction -# Addon Provider: Jose Antonio Montes (jamontes) -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Jose Antonio Montes (jamontes)\n" -"Language-Team: German (http://www.transifex.com/projects/p/xbmc-addons/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de_DE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "#30010" -msgid "Next page" -msgstr "Nachste seite" - -msgctxt "#30011" -msgid "Video type not supported" -msgstr "Video-Typ nicht unterstutzt" - -msgctxt "#30012" -msgid "Couldn't locate video url" -msgstr "Konnte Video-URL nicht finden" - -msgctxt "#30013" -msgid "Previous page" -msgstr "Vorherige seite" - -msgctxt "#30014" -msgid "All videos" -msgstr "Alle videos" - -msgctxt "#30015" -msgid "Search" -msgstr "Suchen" - -# Empty strings from id 30016 to 30100 - -msgctxt "#30101" -msgid "Debug (enable logs)" -msgstr "Debug (logs)" - -msgctxt "#30102" -msgid "Show only the best videos (default)" -msgstr "Nur die besten videos anzeigen" - -msgctxt "#30103" -msgid "Sort by most viewed" -msgstr "Sortieren nach Popularität" diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/resources/language/resource.language.en_gb/strings.po b/templates/.kodi/addons/plugin.video.filmsforaction/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index a210304a..00000000 --- a/templates/.kodi/addons/plugin.video.filmsforaction/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,55 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Films For Action -# Addon id: plugin.video.filmsforaction -# Addon Provider: Jose Antonio Montes (jamontes) -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Jose Antonio Montes (jamontes)\n" -"Language-Team: English (http://www.transifex.com/projects/p/xbmc-addons/language/en/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "#30010" -msgid "Next page" -msgstr "" - -msgctxt "#30011" -msgid "Video type not supported" -msgstr "" - -msgctxt "#30012" -msgid "Couldn't locate video url" -msgstr "" - -msgctxt "#30013" -msgid "Previous page" -msgstr "" - -msgctxt "#30014" -msgid "All videos" -msgstr "" - -msgctxt "#30015" -msgid "Search" -msgstr "" - -# Empty strings from id 30016 to 30100 - -msgctxt "#30101" -msgid "Debug (enable logs)" -msgstr "" - -msgctxt "#30102" -msgid "Show only the best videos (default)" -msgstr "" - -msgctxt "#30103" -msgid "Sort by most viewed" -msgstr "" diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/resources/language/resource.language.es_es/strings.po b/templates/.kodi/addons/plugin.video.filmsforaction/resources/language/resource.language.es_es/strings.po deleted file mode 100644 index 1090750f..00000000 --- a/templates/.kodi/addons/plugin.video.filmsforaction/resources/language/resource.language.es_es/strings.po +++ /dev/null @@ -1,55 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Films For Action -# Addon id: plugin.video.filmsforaction -# Addon Provider: Jose Antonio Montes (jamontes) -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Jose Antonio Montes (jamontes)\n" -"Language-Team: Spanish (http://www.transifex.com/projects/p/xbmc-addons/language/es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_ES\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "#30010" -msgid "Next page" -msgstr "Siguiente pagina" - -msgctxt "#30011" -msgid "Video type not supported" -msgstr "Tipo de video no soportado" - -msgctxt "#30012" -msgid "Couldn't locate video url" -msgstr "No se ha podido localizar la url de video" - -msgctxt "#30013" -msgid "Previous page" -msgstr "Pagina anterior" - -msgctxt "#30014" -msgid "All videos" -msgstr "Todos los videos" - -msgctxt "#30015" -msgid "Search" -msgstr "Buscar" - -# Empty strings from id 30016 to 30100 - -msgctxt "#30101" -msgid "Debug (enable logs)" -msgstr "Debug (activa los logs)" - -msgctxt "#30102" -msgid "Show only the best videos (default)" -msgstr "Mostrar sólo los mejores vídeos (por defecto)" - -msgctxt "#30103" -msgid "Sort by most viewed" -msgstr "Ordenar por los más vistos" diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/resources/language/resource.language.fr_fr/strings.po b/templates/.kodi/addons/plugin.video.filmsforaction/resources/language/resource.language.fr_fr/strings.po deleted file mode 100644 index dbc740c8..00000000 --- a/templates/.kodi/addons/plugin.video.filmsforaction/resources/language/resource.language.fr_fr/strings.po +++ /dev/null @@ -1,55 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Films For Action -# Addon id: plugin.video.filmsforaction -# Addon Provider: Jose Antonio Montes (jamontes) -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Jose Antonio Montes (jamontes)\n" -"Language-Team: French (http://www.transifex.com/projects/p/xbmc-addons/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr_FR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "#30010" -msgid "Next page" -msgstr "Page suivant" - -msgctxt "#30011" -msgid "Video type not supported" -msgstr "Type de video non supporte" - -msgctxt "#30012" -msgid "Couldn't locate video url" -msgstr "Adresse video non trouvee" - -msgctxt "#30013" -msgid "Previous page" -msgstr "Page precedente" - -msgctxt "#30014" -msgid "All videos" -msgstr "Toutes les videos" - -msgctxt "#30015" -msgid "Search" -msgstr "Recherchez" - -# Empty strings from id 30016 to 30100 - -msgctxt "#30101" -msgid "Debug (enable logs)" -msgstr "Debug (logs)" - -msgctxt "#30102" -msgid "Show only the best videos (default)" -msgstr "Afficher uniquement les meilleures vidéos (par défaut)" - -msgctxt "#30103" -msgid "Sort by most viewed" -msgstr "Classement par popularité" diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/__init__.py b/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/__init__.pyo b/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/__init__.pyo deleted file mode 100644 index 85747843..00000000 Binary files a/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/__init__.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/ffa_api.py b/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/ffa_api.py deleted file mode 100644 index ffc45589..00000000 --- a/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/ffa_api.py +++ /dev/null @@ -1,226 +0,0 @@ -# _*_ coding: utf-8 _*_ - -''' - Films For Action API lib: library functions for Films For Action add-on. - Copyright (C) 2014 José Antonio Montes (jamontes) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - - Description: - These funtions are called from the main plugin module, aimed to ease - and simplify the add-on development process. - Release 0.1.6 -''' - -import lutil as l - -root_url = 'https://www.filmsforaction.org' - -def set_debug(debug_flag, func_log=l.local_log): - """This function is a wrapper to setup the debug flag into the lutil module""" - l.set_debug_mode(debug_flag, func_log) - - -def get_categories(): - """This function gets the categories list from the FFA website.""" - category_pattern = "'topic', '([0-9]+)'[^>]+?>([^<]+?)" - category_url = 'https://www.filmsforaction.org/library/?category=all+videos&topic=%s' - - buffer_url = l.carga_web(root_url) - category_list = [] - topic_list = [] - for topic, category_name in l.find_multiple(buffer_url, category_pattern): - if topic not in topic_list: - url = category_url % topic - category_list.append((url, category_name)) - topic_list.append(topic) - - return category_list - - -def get_videolist(url, cat_menu=""): - """This function gets the video list from the FFA website and returns them in a pretty data format.""" - video_entry_sep = 'content-view' - video_url_pattern = '["\'](/watch/[^/]*?/)' - video_thumb_pattern = '["\'](/img/[^"\']*?)["\']' - video_title_pattern = '([^<]+?)' - video_plot_pattern = '([^<]*?)' - video_duration_pattern = '([0-9]+[ ]+[Mm]in)' - video_rating_pattern = '([0-9.]+[ ]+[Ss]tars)' - video_views_pattern = '([0-9,]+[ ]+[Vv]iews)' - page_num_pattern = 'href=["\']/library/([0-9]+)/' - page_num_url_pattern = 'href=["\'](/library/%d/[^"\']*?)["\']' - page_num_cur_pattern = '/library/([0-9]+)/' - - buffer_url = l.carga_web(url) - - video_list = [] - - reset_cache = False - current_page_num = int(l.find_first(url, page_num_cur_pattern) or '1') - last_page_num = int(max(l.find_multiple(buffer_url, page_num_pattern) or ('1',), key=int)) - - if current_page_num != 1: - prev_page_num = current_page_num - 1 - previous_page_url = root_url + l.find_first(buffer_url, page_num_url_pattern % prev_page_num) - video_entry = { 'url': previous_page_url, 'title': '<< %s (%d)' % (cat_menu, prev_page_num), 'IsPlayable': False } - video_list.append(video_entry) - reset_cache = True - - category = "Video" # The category is no longer included in the latest website change. - for video_section in buffer_url.split(video_entry_sep)[1:]: - url = l.find_first(video_section, video_url_pattern) - if not url: - continue # Sometimes in the search menu can appear articles and other sort of entries rather than videos. - thumb = l.find_first(video_section, video_thumb_pattern) - title = l.find_first(video_section, video_title_pattern) - plot = l.find_first(video_section, video_plot_pattern) - duration = l.find_first(video_section, video_duration_pattern) - rating = l.find_first(video_section, video_rating_pattern) - views = l.find_first(video_section, video_views_pattern) - l.log('Video info. url: "%s" thumb: "%s" title: "%s"' % (url, thumb, title)) - l.log('Video tags. duration: "%s" rating: "%s" views: "%s"' % (duration, rating, views)) - video_entry = { - 'url' : root_url + url, - 'title' : title.strip() or '.', - 'thumbnail' : root_url + thumb, - 'plot' : "%s\n%s - %s - %s" % ( - plot.strip(), - duration, - views, - rating, - ), - 'duration' : int(duration.split()[0]) * 60 if duration else 0, - 'rating' : rating.split()[0] if rating else '', - 'genre' : category, - 'IsPlayable' : True - } - video_list.append(video_entry) - - if current_page_num < last_page_num: - next_page_num = current_page_num + 1 - next_page_url = root_url + l.find_first(buffer_url, page_num_url_pattern % next_page_num) - video_entry = { 'url': next_page_url, 'title': '>> %s (%d/%d)' % (cat_menu, next_page_num, last_page_num), 'IsPlayable': False } - video_list.append(video_entry) - - return { 'video_list': video_list, 'reset_cache': reset_cache } - - -def get_search_url(search_string): - """This function returns the search encoded URL to find the videos from the input search string""" - return 'https://www.filmsforaction.org/library/?search=' + l.get_url_encoded(search_string) - - -def get_playable_url(url): - """This function returns a playable URL parsing the different video sources available from the iframe link""" - video_patterns = ( - ('vimeo1', 'vimeo.com/video/([0-9]+)', 'vimeo'), - ('vimeo2', 'vimeo.com%2Fvideo%2F([0-9]+)', 'vimeo'), - ('vimeo3', '"vimeoId": "([0-9]+)', 'vimeo'), - ('youtube1', '"youTubeId": "([0-9A-Za-z_-]{11})', 'youtube'), - ('youtube2', 'videoId: "([0-9A-Za-z_-]{11})', 'youtube'), - ('youtube3', 'youtube.com%2Fwatch%3Fv%3D([0-9A-Za-z_-]{11})', 'youtube'), - ('youtube4', 'youtube.com%2Fembed%2F([0-9A-Za-z_-]{11})', 'youtube'), - ('youtube5', 'youtube.com/embed/([0-9A-Za-z_-]{11})', 'youtube'), - ('dailymotion1', ' src="[htp:]*?//www.dailymotion.com/embed/video/([0-9a-zA-Z]+)', 'dailymotion'), - ('dailymotion2', 'www.dailymotion.com%2Fembed%2Fvideo%2F(.*?)%', 'dailymotion'), - ('archiveorg1', ' src="(https://archive.org/embed/[^"]*?)"', 'archiveorg'), - ('kickstarter1', ' src="(https://www.kickstarter.com/[^"]*?)"', 'kickstarter'), - ('tagtele1', ' src="(http://www.tagtele.com/embed/[^"]*?)"', 'tagtele'), - ) - - buffer_url = l.carga_web(url) - - for pattern_name, pattern, source in video_patterns: - video_id = l.find_first(buffer_url, pattern) - if video_id: - l.log('We have found this video_id "%s" using the pattern: "%s"' % (video_id, pattern_name)) - try: - playable_url = eval("get_playable_%s_url(video_id)" % source) - break - except: - l.log("There was a problem using the pattern '%s' on this video link: '%s'\n" % (pattern_name, url)) - return '' - else: - l.log("Sorry, but we cannot support the type of video for this link yet:\n'%s'" % url) - playable_url = '' - - return playable_url - - -def get_playable_vimeo_url(video_id): - """This function returns the playable URL for the Vimeo embedded video from the video_id retrieved.""" - video_quality_pattern = '"width":([0-9]+),"mime":"video/mp4",.*?,"url":"([^"]*?)"' - quality_list = ('720', '960', '1280', '1920', '640', '480', '320') - - video_info_url = 'https://player.vimeo.com/video/' + video_id - buffer_link = l.carga_web(video_info_url) - video_options = dict((quality, video) for quality, video in l.find_multiple(buffer_link, video_quality_pattern)) - if len(video_options): - l.log("List of video options: "+repr(video_options)) - for quality in quality_list: - if quality in video_options: - return video_options.get(quality) - - # This quality isn't normalized as it doesn't appear into the quality_list. - return video_options.get(video_options.keys()[0]) - - return "" - - -def get_playable_youtube_url(video_id): - """This function returns the URL path to call the Youtube add-on with the video_id retrieved.""" - return 'plugin://plugin.video.youtube/play/?video_id=' + video_id - - -def get_playable_dailymotion_url(video_id): - """This function returns the playable URL for the Dalymotion embedded video from the video_id retrieved.""" - daily_video_pattern = '"([0-9]+)":\[[^]]*?{"type":"video\\\/mp4","url":"([^"]+?)"' - daily_video_qualities = ('480', '720', '380', '240') - - daily_url = 'http://www.dailymotion.com/embed/video/' + video_id - buffer_link = l.carga_web(daily_url) - video_options = dict((quality, video) for quality, video in l.find_multiple(buffer_link, daily_video_pattern)) - l.log("List of video options: "+repr(video_options)) - for quality_option in daily_video_qualities: - if quality_option in video_options: - video_url = video_options.get(quality_option).replace('\\','') - return video_url - - return "" - - -def get_playable_archiveorg_url(archive_url): - """This function returns the playable URL for the Archive.org embedded video from the video link retrieved.""" - pattern_archive_video = '. - - Description: - These funtions are called from the main plugin module, aimed to ease - and simplify the plugin development process. - Release 0.1.10 -''' - -# First of all We must import all the libraries used for plugin development. -import re, urllib, urllib2 -from datetime import date - -debug_enable = False # The debug logs are disabled by default. - - -def local_log(message): - """This function logs the debug messages under development and testing process. - It is never invoked when the add-on is run under KODI. - Called from the library modules by other functions.""" - - if debug_enable: - print("%s" % message) - - -log = local_log # Use local log function by default. - - -def set_debug_mode(debug_flag, func_log=local_log): - """This function sets the debug_enable var to log everything if debug option is true.""" - - global debug_enable - global log - debug_enable = debug_flag in ("true", True) - log = func_log - - -def get_url_decoded(url): - """This function returns the URL decoded.""" - - log('get_url_decoded URL: "%s"' % url) - return urllib.unquote_plus(url) - - -def get_url_encoded(url): - """This function returns the URL encoded.""" - - log('get_url_encoded URL: "%s"' % url) - return urllib.quote_plus(url) - - -def get_parms_encoded(**kwars): - """This function returns the params encoded to form an URL or data post.""" - - param_list = urllib.urlencode(kwars) - log('get_parms_encoded params: "%s"' % param_list) - return param_list - - -def carga_web(url): - """This function loads the html code from a webserver and returns it into a string.""" - - log('carga_web URL: "%s"' % url) - MiReq = urllib2.Request(url) # We use the Request method because we need to add a header into the HTTP GET to the web site. - # We have to tell the web site we are using a real browser. - MiReq.add_header('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0') # This is a true Firefox header. - MiReq.add_header('Referer', 'https://www.filmsforaction.org/') # This is required for this add-on. - MiConex = urllib2.urlopen(MiReq) # We open the HTTP connection to the URL. - MiHTML = MiConex.read() # We load all the HTML contents from the web page and store it into a var. - MiConex.close() # We close the HTTP connection as we have all the info required. - - return MiHTML - - -def carga_web_cookies(url, headers=''): - """This function loads the html code from a webserver passsing the headers into the GET message - and returns it into a string along with the cookies collected from the website.""" - - log('carga_web_cookies URL: "%s"' % url) - MiReq = urllib2.Request(url) # We use the Request method because we need to add a header into the HTTP GET to the web site. - # We have to tell the web site we are using a real browser. - MiReq.add_header('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0') # This is a true Firefox header. - for key in headers: - MiReq.add_header(key, headers[key]) - MiConex = urllib2.urlopen(MiReq) # We open the HTTP connection to the URL. - MiHTML = MiConex.read() # We load all the HTML contents from the web page and store it into a var. - server_info = "%s" % MiConex.info() - my_cookie_pattern = re.compile('Set-Cookie: ([^;]+);') - my_cookies = '' - pcookie = '' - for lcookie in my_cookie_pattern.findall(server_info): - if (lcookie != pcookie): - my_cookies = "%s %s;" % (my_cookies, lcookie) - pcookie = lcookie - - MiConex.close() # We close the HTTP connection as we have all the info required. - - log('carga_web Cookie: "%s"' % my_cookies) - return MiHTML, my_cookies - - -def send_post_data(url, headers='', data=''): - """This function sends an HTTP POST request with theirr corresponding headers and data to a webserver - and returns the html code into a string along with the cookies collected from the website.""" - - log('send_post_data URL: "%s"' % url) - MiReq = urllib2.Request(url, data) # We use the Request method because we need to send a HTTP POST to the web site. - # We have to tell the web site we are using a real browser. - MiReq.add_header('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0') # This is a true Firefox header. - for key in headers: - MiReq.add_header(key, headers[key]) - MiConex = urllib2.urlopen(MiReq) # We open the HTTP connection to the URL. - MiHTML = MiConex.read() # We load all the HTML contents from the web page and store it into a var. - server_info = "%s" % MiConex.info() - my_cookie_pattern = re.compile('Set-Cookie: ([^;]+);') - my_cookies = '' - pcookie = '' - for lcookie in my_cookie_pattern.findall(server_info): - if (lcookie != pcookie): - my_cookies = "%s %s;" % (my_cookies, lcookie) - pcookie = lcookie - - MiConex.close() # We close the HTTP connection as we have all the info required. - - log('send_post_data Cookie: "%s"' % my_cookies) - return MiHTML, my_cookies - - -def get_redirect(url): - """This function returns the redirected URL from a 30X response received from the webserver.""" - - log('get_redirect URL: "%s"' % url) - MiConex = urllib.urlopen(url) # Opens the http connection to the URL. - MiHTML = MiConex.geturl() # Gets the URL redirect link and stores it into MiHTML. - MiConex.close() # Close the http connection as we get what we need. - - return MiHTML - - -def find_multiple(text, pattern): - """This function allows us to find multiples matches from a regexp into a string.""" - - pat_url_par = re.compile(pattern, re.DOTALL) - - return pat_url_par.findall(text) - - -def find_first(text, pattern): - """This function gets back the first match from a regexp into a string.""" - - pat_url_par = re.compile(pattern, re.DOTALL) - try: - return pat_url_par.findall(text)[0] - except: - return "" - - -def get_this_year(): - """This function gets the current year. Useful to fill the Year infolabel whenever it isn't available""" - - return date.today().year - - -def get_clean_title(title): - """This function returns the title or desc cleaned. - ref: http://www.thesauruslex.com/typo/eng/enghtml.htm""" - - return title.\ - replace('á', 'á').\ - replace('à', 'á').\ - replace('é', 'é').\ - replace('è', 'è').\ - replace('í', 'í').\ - replace('ó', 'ó').\ - replace('ò', 'ò').\ - replace('ú', 'ú').\ - replace('ä', 'ä').\ - replace('ï', 'ï').\ - replace('ö', 'ö').\ - replace('ü', 'ü').\ - replace('ß', 'ß').\ - replace('ñ', 'ñ').\ - replace('ç', 'ç').\ - replace('Á', 'Á').\ - replace('À', 'À').\ - replace('É', 'É').\ - replace('È', 'È').\ - replace('Í', 'Í').\ - replace('Ó', 'Ó').\ - replace('Ò', 'Ò').\ - replace('Ú', 'Ú').\ - replace('Ä', 'Ä').\ - replace('Ï', 'Ï').\ - replace('Ö', 'Ö').\ - replace('Ü', 'Ü').\ - replace('Ñ', 'Ñ').\ - replace('Ç', 'Ç').\ - replace('"', '"').\ - replace(''', "´").\ - replace(' ', " ").\ - replace('–', '').\ - replace('’', "'").\ - replace('“', '"').\ - replace('”', '"').\ - replace('‟', "'").\ - replace('…', '').\ - replace('’', "´").\ - replace('«', '"').\ - replace('»', '"').\ - replace('¡', '¡').\ - replace('&iinte;', '¿').\ - replace('&', '&').\ - replace(' ', '').\ - replace('"', '"').\ - replace('ª', 'ª').\ - replace('º', 'º').\ - replace('·', '·').\ - replace('…', '...').\ - replace('
', '').\ - strip() - - -def get_clean_html_tags(html_text): - """This function returns the text or desc cleaned from html tags.""" - - return re.sub(r'<[^>]*?>', '', html_text, count=0, flags=re.DOTALL) diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/lutil.pyo b/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/lutil.pyo deleted file mode 100644 index f00a35e5..00000000 Binary files a/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/lutil.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/plugin.py b/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/plugin.py deleted file mode 100644 index 8f3a517d..00000000 --- a/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/plugin.py +++ /dev/null @@ -1,174 +0,0 @@ -# _*_ coding: utf-8 _*_ - -''' - plugin: library class for XBMC video add-ons. - Copyright (C) 2014 José Antonio Montes (jamontes) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - - Description: - These class methods are called from the main add-on module, aimed to ease - and simplify the add-on development process. - Release 0.1.3 -''' - -# First of all We must import all the libraries used for plugin development. -import sys, urllib, re, os -import xbmcplugin, xbmcaddon, xbmcgui, xbmcaddon, xbmc - -class Plugin(): - - def __init__(self, plugin_id='', show_thumb_as_fanart=True): - self.pluginpath = sys.argv[0] - self.pluginhandle = int(sys.argv[1]) - self.pluginparams = sys.argv[2] - self.plugin_id = plugin_id - self.debug_enable = False # The debug logs are disabled by default. - self.plugin_settings = xbmcaddon.Addon(id=self.plugin_id) - self.translation = self.plugin_settings.getLocalizedString - self.root_path = self.plugin_settings.getAddonInfo('path') - self.fanart_file = os.path.join(self.root_path, "fanart.jpg") - self.show_thumb_as_fanart = show_thumb_as_fanart - - - def get_plugin_settings(self): - """This is a getter method to return the settings method reference.""" - return self.plugin_settings - - - def get_plugin_translation(self): - """This is a getter method to return the translation method reference.""" - return self.translation - - - def get_system_language(self): - """This method returns the GUI language.""" - return xbmc.getLanguage() - - - def set_debug_mode(self, debug_flag=""): - """This method sets the debug_enable flag to log everything if debug option within add-on settings is activated.""" - self.debug_enable = debug_flag in ("true", True) - - - def set_fanart(self): - """This method setup the file and global plugin fanart.""" - xbmcplugin.setPluginFanart(self.pluginhandle, self.fanart_file) - - - def log(self, message): - """This method logs the messages into the main XBMC log file, only if debug option is activated from the add-on settings. - This method is called from the main add-on module.""" - if self.debug_enable: - try: - xbmc.log(msg=message, level=xbmc.LOGNOTICE) - except: - xbmc.log('%s: log this line is not possible due to encoding string problems' % self.plugin_id, level=xbmc.LOGNOTICE) - - - def _log(self, message): - """This method logs the messages into the main XBMC log file, only if debug option is activated from the add-on settings. - This method is privated and only called from other methods within the class.""" - if self.debug_enable: - try: - xbmc.log(msg=message, level=xbmc.LOGNOTICE) - except: - xbmc.log('%s: _log this line is not possible due to encoding string problems' % self.plugin_id, level=xbmc.LOGNOTICE) - - - def get_plugin_parms(self): - """This method gets all the parameters passed to the plugin from XBMC API and retuns a dictionary. - Example: plugin://plugin.video.atactv/?parametro1=valor1¶metro2=valor2¶metro3""" - params = sys.argv[2] - - pattern_params = re.compile('[?&]([^=&]+)=?([^&]*)') - options = dict((parameter, urllib.unquote_plus(value)) for (parameter, value) in pattern_params.findall(params)) - self._log("get_plugin_parms " + repr(options)) - return options - - - def get_plugin_path(self, **kwars): - """This method returns the add-on path URL encoded along with all its parameters.""" - return sys.argv[0] + '?' + urllib.urlencode(kwars) - - - def get_url_decoded(self, url): - """This method returns the URL decoded.""" - self._log('get_url_decoded URL: "%s"' % url) - return urllib.unquote_plus(url) - - - def get_url_encoded(self, url): - """This method returns the URL encoded.""" - self._log('get_url_encoded URL: "%s"' % url) - return urllib.quote_plus(url) - - - def set_content_list(self, contents="episodes"): - """This method sets the video contents for the video list.""" - self._log("set_content_list contents: " + contents) - xbmcplugin.setContent(self.pluginhandle, contents) - - - def set_plugin_category(self, genre=''): - """This method sets the plugin genre for the video list.""" - xbmcplugin.setPluginCategory(self.pluginhandle, genre) - - - def get_keyboard_text(self, prompt): - """This method gets an input text from the keyboard.""" - self._log('get_keyboard_text prompt: "%s"' % prompt) - - keyboard = xbmc.Keyboard('', prompt) - keyboard.doModal() - if keyboard.isConfirmed() and keyboard.getText(): - self._log("get_keyboard_text input text: '%s'" % keyboard.getText()) - return keyboard.getText() - else: - # Close directory as empty result. - xbmcplugin.endOfDirectory(self.pluginhandle, succeeded=True, updateListing=False, cacheToDisc=False) - return "" - - - def add_items(self, items, updateListing=False): - """This method adds the list of items (links and folders) to the add-on video list.""" - item_list = [] - for item in items: - if item['IsPlayable']: # It is a link - link_item = xbmcgui.ListItem(item['info']['title'], iconImage = "DefaultVideo.png", thumbnailImage = item['thumbnail']) - link_item.setInfo(type = "Video", infoLabels = item['info']) - link_item.setProperty('IsPlayable', 'true') - link_item.setProperty('Fanart_Image', item['thumbnail'] if self.show_thumb_as_fanart else self.fanart_file) - else: # It is a folder - link_item = xbmcgui.ListItem(item['info']['title'], iconImage = "DefaultFolder.png", thumbnailImage = '') - link_item.setInfo(type = "Video", infoLabels = item['info']) - link_item.setProperty('Fanart_Image', self.fanart_file) - item_list.append((item['path'], link_item, not item['IsPlayable'])) - xbmcplugin.addDirectoryItems(self.pluginhandle, item_list, len(item_list)) - xbmcplugin.endOfDirectory(self.pluginhandle, succeeded=True, updateListing=updateListing, cacheToDisc=True) - #xbmcplugin.setContent(self.pluginhandle, 'episodes') - xbmcplugin.setContent(self.pluginhandle, 'movies') - - - def showWarning(self, message): - """This method shows a popup window with a notices message through the XBMC GUI during 5 secs.""" - self._log("showWarning message: %s" % message) - xbmcgui.Dialog().notification('Info:', message, time=6000) - - - def play_resolved_url(self, url = ""): - """This method plays the video file pointed by the URL passed as argument.""" - self._log("play_resolved_url pluginhandle = [%s] url = [%s]" % (self.pluginhandle, url)) - listitem = xbmcgui.ListItem(path=url) - return xbmcplugin.setResolvedUrl(self.pluginhandle, True, listitem) diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/plugin.pyo b/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/plugin.pyo deleted file mode 100644 index 1ca7d8e6..00000000 Binary files a/templates/.kodi/addons/plugin.video.filmsforaction/resources/lib/plugin.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.filmsforaction/resources/settings.xml b/templates/.kodi/addons/plugin.video.filmsforaction/resources/settings.xml deleted file mode 100644 index e7ab2b03..00000000 --- a/templates/.kodi/addons/plugin.video.filmsforaction/resources/settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/templates/.kodi/addons/plugin.video.francetv/LICENSE b/templates/.kodi/addons/plugin.video.francetv/LICENSE deleted file mode 100644 index d159169d..00000000 --- a/templates/.kodi/addons/plugin.video.francetv/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/templates/.kodi/addons/plugin.video.francetv/README.md b/templates/.kodi/addons/plugin.video.francetv/README.md deleted file mode 100644 index c52038ff..00000000 --- a/templates/.kodi/addons/plugin.video.francetv/README.md +++ /dev/null @@ -1,26 +0,0 @@ -France Télévisions video plugin for Kodi -======================================== - -This add-on provides access to the [France Télévisions](https://www.france.tv/) live and catchup TV platform. - -Notice that some streams may be georestricted to France, or to overseas France. - -Dependencies ------------- - -* Kodi 18 or higher -* script.module.beautifulsoup4 -* script.module.inputstreamhelper -* script.module.requests - -Disclaimer ----------- - -This add-on is neither officially commisioned nor supported by France Télévisions. Any trademarks used belong to their respective owners. - -License -------- - -This add-on is licensed under the GNU General Public License version 2 or later. - -Some icons come from, or are based on, the [Bootstrap](https://icons.getbootstrap.com/) project and are licensed under [MIT](https://github.com/twbs/icons/blob/main/LICENSE.md). diff --git a/templates/.kodi/addons/plugin.video.francetv/addon.xml b/templates/.kodi/addons/plugin.video.francetv/addon.xml deleted file mode 100644 index 6bac19e2..00000000 --- a/templates/.kodi/addons/plugin.video.francetv/addon.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - video - - - true - france.tv - france.tv - Live and catchup TV for France Télévisions channels - Direct et replay TV des chaînes France Télévisions - Some streams may be georestricted to France - Certains contenus ne sont disponibles que depuis la France - fr - all - GPL-2.0-or-later - https://www.france.tv/ - https://github.com/melmorabity/plugin.video.francetv/ - - resources/icon.png - resources/fanart.jpg - - v2.0.1 (2021-02-16) - - Fix live TV - - Add Culturebox in channel list - -v2.0.0 (2020-11-27) - - Complete rewrite for france.tv mobile API switch - - Addon now follows the france.tv mobile application clickstream in terms of ergonomy - -v1.1.0 (2019-11-18) - - Fixes for Python 3 support - - Update Slash icon - -v1.0.0 (2018-04-14) - - Initial version - - diff --git a/templates/.kodi/addons/plugin.video.francetv/addon_entry.py b/templates/.kodi/addons/plugin.video.francetv/addon_entry.py deleted file mode 100644 index ffbe68e9..00000000 --- a/templates/.kodi/addons/plugin.video.francetv/addon_entry.py +++ /dev/null @@ -1,26 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2020 melmorabity -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 51 -# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -import sys - -from resources.lib.addon import FranceTVAddon - - -if __name__ == "__main__": - ADDON = FranceTVAddon(sys.argv[0], int(sys.argv[1]), sys.argv[2]) - ADDON.run() diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/__init__.py b/templates/.kodi/addons/plugin.video.francetv/resources/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/__init__.pyo b/templates/.kodi/addons/plugin.video.francetv/resources/__init__.pyo deleted file mode 100644 index ca0033c9..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/__init__.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/fanart.jpg b/templates/.kodi/addons/plugin.video.francetv/resources/fanart.jpg deleted file mode 100644 index 4e3ca5ee..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/fanart.jpg and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/icon.png b/templates/.kodi/addons/plugin.video.francetv/resources/icon.png deleted file mode 100644 index 5fc0c50a..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/icon.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/language/resource.language.en_gb/strings.po b/templates/.kodi/addons/plugin.video.francetv/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index f64effc0..00000000 --- a/templates/.kodi/addons/plugin.video.francetv/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,50 +0,0 @@ -# Kodi Media Center language file -# Addon Name: France.tv -# Addon id: plugin.video.francetv -# Addon Provider: melmorabity -msgid "" -msgstr "" -"Project-Id-Version: plugin.video.francetv\n" -"PO-Revision-Date: 2020-11-25 12:00+0200\n" -"Last-Translator: melmorabity\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "#30001" -msgid "Home" -msgstr "" - -msgctxt "#30002" -msgid "Live TV" -msgstr "" - -msgctxt "#30003" -msgid "Channels" -msgstr "" - -msgctxt "#30004" -msgid "Categories" -msgstr "" - -msgctxt "#30005" -msgid "Search" -msgstr "" - -msgctxt "#30101" -msgid "All TV shows" -msgstr "" - -msgctxt "#30102" -msgid "All videos" -msgstr "" - -msgctxt "#30103" -msgid "Next page" -msgstr "" - -msgctxt "#30201" -msgid "Playback failed" -msgstr "" diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/language/resource.language.fr_fr/strings.po b/templates/.kodi/addons/plugin.video.francetv/resources/language/resource.language.fr_fr/strings.po deleted file mode 100644 index 1e84610b..00000000 --- a/templates/.kodi/addons/plugin.video.francetv/resources/language/resource.language.fr_fr/strings.po +++ /dev/null @@ -1,50 +0,0 @@ -# Kodi Media Center language file -# Addon Name: France.tv -# Addon id: plugin.video.francetv -# Addon Provider: melmorabity -msgid "" -msgstr "" -"Project-Id-Version: plugin.video.francetv\n" -"PO-Revision-Date: 2020-11-25 12:00+0200\n" -"Last-Translator: melmorabity\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr_FR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgctxt "#30001" -msgid "Home" -msgstr "Accueil" - -msgctxt "#30002" -msgid "Live TV" -msgstr "Directs" - -msgctxt "#30003" -msgid "Channels" -msgstr "Chaînes" - -msgctxt "#30004" -msgid "Categories" -msgstr "Catégories" - -msgctxt "#30005" -msgid "Search" -msgstr "Recherche" - -msgctxt "#30101" -msgid "All TV shows" -msgstr "Tous les programmes" - -msgctxt "#30102" -msgid "All videos" -msgstr "Toutes les vidéos" - -msgctxt "#30103" -msgid "Next page" -msgstr "Page suivante" - -msgctxt "#30201" -msgid "Playback failed" -msgstr "Échec de lecture" diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/lib/__init__.py b/templates/.kodi/addons/plugin.video.francetv/resources/lib/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/lib/__init__.pyo b/templates/.kodi/addons/plugin.video.francetv/resources/lib/__init__.pyo deleted file mode 100644 index 60cb42e0..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/lib/__init__.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/lib/addon.py b/templates/.kodi/addons/plugin.video.francetv/resources/lib/addon.py deleted file mode 100644 index fd2d54dd..00000000 --- a/templates/.kodi/addons/plugin.video.francetv/resources/lib/addon.py +++ /dev/null @@ -1,260 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2020 melmorabity -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 51 -# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -from __future__ import unicode_literals -import logging -import os -import re - -try: - from typing import Dict - from typing import Optional - from typing import Text -except ImportError: - pass - -try: - from urllib.parse import parse_qsl - from urllib.parse import quote -except ImportError: - from urlparse import parse_qsl - from urllib import quote - -from inputstreamhelper import Helper # pylint: disable=import-error -import xbmc # pylint: disable=import-error -from xbmcaddon import Addon # pylint: disable=import-error -from xbmcgui import Dialog # pylint: disable=import-error -from xbmcgui import ListItem # pylint: disable=import-error -import xbmcplugin # pylint: disable=import-error - -from resources.lib.api import FranceTV -from resources.lib.api import ParsedItem -import resources.lib.kodilogging -from resources.lib.utils import update_url_params -from resources.lib.video import FranceTVVideo -from resources.lib.video import FranceTVVideoException - - -resources.lib.kodilogging.config() - -_LOGGER = logging.getLogger(__name__) - -_KODI_VERSION = int(xbmc.getInfoLabel("System.BuildVersion").split(".")[0]) - - -# pylint: disable=too-few-public-methods -class FranceTVAddon: - _ADDON_ID = "plugin.video.francetv" - _ADDON = Addon() - _ADDON_DIR = xbmc.translatePath(_ADDON.getAddonInfo("path")) - _ADDON_MEDIA_DIR = os.path.join(_ADDON_DIR, "resources", "media") - _ADDON_FANART = Addon().getAddonInfo("fanart") - _USER_AGENT = ( - "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:85.0) Gecko/20100101 " - "Firefox/85.0" - ) - - def __init__(self, base_url, handle, params): - # type: (Text, int, Text) -> None - - self._base_url = base_url - self._handle = handle - self._params = self._params_to_dict(params) - - self._api = FranceTV() - - @staticmethod - def _params_to_dict(params): - # type: (Optional[Text]) -> Dict[Text, Text] - - # Parameter string starts with a '?' - return dict(parse_qsl(params[1:])) if params else {} - - def _localize(self, label): - # type: (Text) -> Text - - return re.sub( - r"\$LOCALIZE\[(\d+)\]", - lambda m: self._ADDON.getLocalizedString(int(m.group(1))), - label, - ) - - def _add_listitem(self, parsed_item): - # type: (ParsedItem) -> None - - is_folder = parsed_item.url.get("mode") != "watch" - - _LOGGER.debug("Add ListItem %s", parsed_item) - listitem = ListItem( - label=self._localize(parsed_item.label), offscreen=True - ) - listitem.setInfo("video", parsed_item.info) - - # Set fallback fanart - parsed_item.art.setdefault("fanart", self._ADDON_FANART) - listitem.setArt(parsed_item.art) - - for key, value in list(parsed_item.properties.items()): - listitem.setProperty(key, value) - - xbmcplugin.addDirectoryItem( - self._handle, - update_url_params(self._base_url, **parsed_item.url), - listitem, - isFolder=is_folder, - ) - - def _mode_collection(self, path): - # type: (Text) -> None - - xbmcplugin.setContent(self._handle, "videos") - xbmcplugin.addSortMethod( - self._handle, xbmcplugin.SORT_METHOD_UNSORTED, label2Mask="%Z" - ) - - level = None # type: Optional[int] - if self._params.get("level"): - try: - level = int(self._params["level"]) - except ValueError: - pass - - for item in self._api.get_collection(path, level): - self._add_listitem(item) - - def _mode_watch(self): - # type: () -> None - - video_id = self._params["id"] - - is_helper = Helper("mpd") - use_dash = bool(is_helper.check_inputstream()) - video_url = FranceTVVideo().get_video_url(video_id, use_dash) - - # Workaround for - # https://github.com/melmorabity/plugin.video.francetv/issues/2 - headers = "User-Agent={}".format(self._USER_AGENT) - - listitem = ListItem( - path="{}|{}".format(video_url, headers), - offscreen=True, - ) - - # Use DASH if possible for better subtitle management - if use_dash and ".mpd" in video_url: - listitem.setMimeType("application/dash+xml") - listitem.setProperty("inputstream.adaptive.manifest_type", "mpd") - if _KODI_VERSION >= 19: - listitem.setProperty( - "inputstream", is_helper.inputstream_addon - ) - else: - listitem.setProperty( - "inputstreamaddon", is_helper.inputstream_addon - ) - listitem.setProperty( - "inputstream.adaptive.stream_headers", headers - ) - xbmcplugin.setResolvedUrl(self._handle, True, listitem) - - def _mode_search(self): - # type: () -> None - - search = Dialog().input(self._ADDON.getLocalizedString(30005)) - - self._mode_collection( - "apps/search?term={}&filters=with-lives,with-collections".format( - quote(search, safe="") - ) - ) - - def _mode_default(self): - # type: () -> None - - self._add_listitem( - ParsedItem( - self._ADDON.getLocalizedString(30001), - {"mode": "collection", "path": "apps/page/_"}, - {}, - {"icon": os.path.join(self._ADDON_MEDIA_DIR, "home.png")}, - {}, - ) - ) - self._add_listitem( - ParsedItem( - self._ADDON.getLocalizedString(30002), - {"mode": "collection", "path": "generic/directs"}, - {}, - {"icon": os.path.join(self._ADDON_MEDIA_DIR, "live-tv.png")}, - {}, - ) - ) - self._add_listitem( - ParsedItem( - self._ADDON.getLocalizedString(30003), - {"mode": "collection", "path": "generic/channels"}, - {}, - {"icon": os.path.join(self._ADDON_MEDIA_DIR, "channels.png")}, - {}, - ) - ) - self._add_listitem( - ParsedItem( - self._ADDON.getLocalizedString(30004), - {"mode": "collection", "path": "generic/categories"}, - {}, - { - "icon": os.path.join( - self._ADDON_MEDIA_DIR, "categories.png" - ) - }, - {}, - ) - ) - self._add_listitem( - ParsedItem( - self._ADDON.getLocalizedString(30005), - {"mode": "search"}, - {}, - {"icon": os.path.join(self._ADDON_MEDIA_DIR, "search.png")}, - {}, - ) - ) - - def run(self): - # type: () -> None - - mode = self._params.get("mode") - _LOGGER.debug("Addon params = %s", self._params) - succeeded = True - - try: - if mode == "collection" and self._params.get("path"): - self._mode_collection(self._params["path"]) - elif mode == "watch" and self._params.get("id"): - self._mode_watch() - elif mode == "search": - self._mode_search() - else: - self._mode_default() - except FranceTVVideoException as ex: - _LOGGER.error(ex) - Dialog().ok(self._ADDON.getLocalizedString(30201), ex.args[1]) - succeeded = False - finally: - xbmcplugin.endOfDirectory(self._handle, succeeded=succeeded) diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/lib/addon.pyo b/templates/.kodi/addons/plugin.video.francetv/resources/lib/addon.pyo deleted file mode 100644 index 82136a60..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/lib/addon.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/lib/api.py b/templates/.kodi/addons/plugin.video.francetv/resources/lib/api.py deleted file mode 100644 index feacde5c..00000000 --- a/templates/.kodi/addons/plugin.video.francetv/resources/lib/api.py +++ /dev/null @@ -1,523 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2020 melmorabity -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 51 -# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -from __future__ import unicode_literals -import logging -from os.path import dirname -from os.path import join -import re - -import time - -try: - from itertools import zip_longest # type: ignore -except ImportError: - from itertools import izip_longest as zip_longest - -try: - from typing import Any - from typing import Dict - from typing import Generator - from typing import List - from typing import NamedTuple - from typing import Optional - from typing import Text - from typing import Union - - Item = Dict[Text, Any] - Collection = List[Item] - - Art = Dict[Text, Optional[Text]] # pylint: disable=unsubscriptable-object - Url = Dict[Text, Union[int, Text]] - - ParsedItem = NamedTuple( - "ParsedItem", - [ - ("label", Text), - ("url", Url), - ("info", Dict[Text, Any]), - ("art", Art), - ("properties", Dict[Text, Text]), - ], - ) -except ImportError: - from collections import namedtuple - - ParsedItem = namedtuple( # type: ignore - "ParsedItem", ["label", "url", "info", "art", "properties"] - ) - -from requests import Response -from requests import Session -from requests.exceptions import HTTPError - -from resources.lib.utils import capitalize -from resources.lib.utils import html_to_text -from resources.lib.utils import update_url_params - - -_LOGGER = logging.getLogger(__name__) - -_IMAGE_TYPE_MAPPING = { - "background_16x9": "fanart", - "carre": "thumb", - "vignette_16x9": "fanart", - "vignette_3x4": "poster", - "hero": "clearart", - "hero_plein": "characterart", - "logo": "clearlogo", -} # type: Dict[Optional[Text], Text] - -_MEDIA_DIR = join(dirname(__file__), "..", "media") - -_CHANNEL_ICONS = { - "france-2": join(_MEDIA_DIR, "france-2.png"), - "france-3": join(_MEDIA_DIR, "france-3.png"), - "france-4": join(_MEDIA_DIR, "france-4.png"), - "france-5": join(_MEDIA_DIR, "france-5.png"), - "france-o": join(_MEDIA_DIR, "france-o.png"), - "la1ere": join(_MEDIA_DIR, "la1ere.png"), - "franceinfo": join(_MEDIA_DIR, "franceinfo.png"), - "slash": join(_MEDIA_DIR, "slash.png"), - "okoo": join(_MEDIA_DIR, "okoo.png"), - "culturebox": join(_MEDIA_DIR, "culturebox.png"), -} # type: Dict[Optional[Text], Text] - -_ALL_TV_SHOWS_ICON = join(_MEDIA_DIR, "all-tv-shows.png") -_ALL_VIDEOS_ICON = join(_MEDIA_DIR, "all-videos.png") -_NEXT_PAGE_ICON = join(_MEDIA_DIR, "next-page.png") - - -class FranceTVException(Exception): - pass - - -class FranceTV: - _API_URL = "https://api-mobile.yatta.francetv.fr" - - def __init__(self): - self._session = Session() - self._session.hooks = {"response": [self._requests_raise_status]} - - def __enter__(self): - return self - - def __exit__(self, *args): - if self._session: - self._session.close() - - @staticmethod - def _requests_raise_status(response, *_args, **_kwargs): - # type: (Response, Any, Any) -> None - - try: - response.raise_for_status() - except HTTPError as ex: - try: - raise FranceTVException(ex, ex.response.json().get("error")) - except ValueError: - raise ex - - def _query_api(self, path): - # type: (Text) -> Union[Item, Collection] - - return self._session.get( - "{}/{}".format(self._API_URL, path), params={"platform": "apps"}, - ).json() - - @staticmethod - def _get_channel_id(item): - # type: (Item) -> Optional[Text] - - if isinstance(item.get("channel"), dict): - channel_id = item["channel"].get("channel_path") - else: - channel_id = ( - item.get("channel") - or item.get("channel_path") - or item.get("region_path") - ) - - if channel_id: - return re.split("[_/]", channel_id)[0] - - return None - - @staticmethod - def _is_live(item, parent_item): - # type: (Item, Item) -> bool - - # "is_live" item key can be "false", even for "real" lives - if parent_item.get("type") in [ - "live", - "live_channel", - "current_live", - ]: - return True - - return bool(item.get("is_live")) - - @staticmethod - def _parse_item_art(item, parent_item): - # type: (Item, Item) -> Art - - art = {} # type: Art - - channel_icon = _CHANNEL_ICONS.get(FranceTV._get_channel_id(item)) - art.setdefault("icon", channel_icon) - - # Use channel logo as thumb for live videos - if FranceTV._is_live(item, parent_item): - art.setdefault("thumb", channel_icon) - - item_type = item.get("type") - - # Artwork provided by the france.tv API is really bad for - # channels - if item_type == "channel": - return art - - for image in item.get("images") or []: - image_type = _IMAGE_TYPE_MAPPING.get(image.get("type")) - - if not image_type or not image.get("urls"): - continue - - # Category fanarts provided the france.tv API are low-resolution - if item_type == "categorie" and image_type == "fanart": - continue - - # Sort images by quality - image_urls = sorted( - list(image["urls"].items()), - key=lambda i: int(i[0].split(":")[1]), - ) - - art.setdefault(image_type, image_urls[-1][1]) - - # Complete missing artwork with item program - if item.get("program"): - program_art = FranceTV._parse_item_art(item["program"], {}) - art = dict(list(program_art.items()) + list(art.items())) - - return art - - @staticmethod - # pylint: disable=too-many-branches - def _get_item_url( - item, # type: Item - path, # type: Text - level, # type: Optional[int] - parent_item, # type: Item - ): - # type: (...) -> Optional[Url] - - video_id = None - if FranceTV._is_live(item, parent_item): - video_id = (item.get("channel") or {}).get("si_id") - if not video_id: - video_id = item.get("si_id") - - if video_id: - return { - "mode": "watch", - "id": video_id, - } - - url = { - "mode": "collection", - } # type: Dict[Text, Any] - - item_type = item.get("type") - - if item.get("url_complete"): - if item_type == "sous_categorie": - url["path"] = "apps/sub-categories/{}".format( - item["url_complete"] - ) - else: - url["path"] = "apps/{}s/{}".format( - item_type, item["url_complete"] - ) - elif item_type == "collection" and item.get("id"): - url["path"] = "generic/collections/{}".format(item["id"]) - elif item.get("program_path"): - url["path"] = "apps/program/{}".format(item["program_path"]) - elif item.get("link"): - url["path"] = item["link"] - elif item.get("region_path"): - url["path"] = "/apps/regions/{}/{}".format( - item["region_path"], path.split("/")[-1] - ) - elif item.get("channel_path"): - if item.get("channel_url") == "la1ere": - url["path"] = "apps/regions/outre-mer" - else: - url["path"] = "apps/channels/{}".format(item["channel_path"]) - elif "items" in item: - url["path"] = path - url["level"] = level - else: - _LOGGER.warning("Item %s in path %s is unmanaged", item, path) - return None - - # Ignore items based on user authentication - if ":userId" in url["path"] or ":userUId" in url["path"]: - return None - - return url - - @staticmethod - # pylint: disable=too-many-branches,too-many-statements - def _parse_item( - item, # type: Item - path, # type: Text - level, # type: Optional[int] - parent_item, # type: Item - ): - # type: (...) -> Optional[ParsedItem] - - url = FranceTV._get_item_url(item, path, level, parent_item) - if not url: - return None - - info = {} # type: Dict[Text, Any] - art = FranceTV._parse_item_art(item, parent_item) - properties = {} # type: Dict[Text, Text] - - item_type = item.get("type") - - title = capitalize(item.get("label") or item.get("title")) - program = capitalize((item.get("program") or {}).get("label")) - - if not title: - if item_type == "categories": - title = "Catégories" - elif ( - parent_item.get("type") == "program" - and item_type == "playlist_program" - ): - title = "À regarder également" - elif program: - title = program - else: - _LOGGER.warning("No title in item %s in path %s", item, path) - title = "Inconnu" - - if title == program and item.get("episode_title"): - title = capitalize(item["episode_title"]) - - label_parts = [program, title] - label = " – ".join([i for i in label_parts if i]) - - result = ParsedItem(label, url, info, art, properties) - - info["title"] = title - info["plot"] = ( - html_to_text(item.get("description") or item.get("synopsis")) - or title - ) - - # No need to parse more item metadata for folders - if url["mode"] != "watch": - return result - - info["genre"] = capitalize((item.get("category") or {}).get("label")) - info["year"] = item.get("production_year") or item.get("year") - - if item.get("episode"): - info["episode"] = item["episode"] - - if item.get("season"): - info["season"] = item["season"] - - if FranceTV._is_live(item, parent_item): - # Don't mark live streams as read once played - info["playcount"] = 0 - - if item.get("casting"): - cast = item["casting"].split(", ") - - if item.get("characters"): - info["cast"] = list( - zip_longest( - cast, item["characters"].replace("\n", "").split(", ") - ) - ) - else: - info["cast"] = cast - elif item.get("presenter"): - info["cast"] = [ - (p, "Présentateur",) - for p in item["presenter"] - .replace("Présenté par ", "") - .rstrip(".") - .split(",") - ] - - if item.get("director"): - info["director"] = item["director"].split(", ") - - info["mpaa"] = item.get("rating_csa_code") - info["plotoutline"] = item.get("headline_title") or item.get( - "subtitle" - ) - info["duration"] = item.get("duration") - - if program: - info["tvshowtitle"] = program - - if not info["year"] and item.get("broadcast_begin_date"): - info["aired"] = time.strftime( - "%Y-%m-%d", # type: ignore - time.localtime(item["broadcast_begin_date"]), - ) - - if item.get("begin_date"): - info["dateadded"] = time.strftime( - "%Y-%m-%d %H:%M:%S", # type: ignore - time.localtime(item["begin_date"]), - ) - - if ( - info.get("tvshowtitle") - or info.get("episode") - or info.get("season") - ): - info["mediatype"] = "episode" - else: - info["mediatype"] = "movie" - - properties["isPlayable"] = "true" - - return result - - def get_collection(self, path, level=None): - # type: (Text, Optional[int]) -> Generator[ParsedItem, None, None] - - data = self._query_api(path) - - if isinstance(data, dict): - cursor = data.get("cursor") - parent_item = data.get("item") or data - collection = data.get("collections") or data.get("items") or [] - else: - cursor = None - parent_item = {} - collection = data - - if level is not None and level < len(collection): - cursor = None - parent_item = collection[level] - collection = collection[level].get("items") or [] - - # Sub-category items only provides incomplete list of programs and - # videos, use our own extra items insteads - if parent_item.get("type") != "sous_categorie": - for index, item in enumerate(collection): - parsed_item = self._parse_item(item, path, index, parent_item) - if parsed_item: - yield parsed_item - - if path == "generic/channels": - # Add "virtual" Okoo/Culturebox channels in the channel collection, - # as done on the france.tv website - yield ParsedItem( - "Okoo", - {"mode": "collection", "path": "apps/categories/enfants"}, - {"plot": "Okoo"}, - {"icon": _CHANNEL_ICONS["okoo"]}, - {}, - ) - yield ParsedItem( - "Culturebox", - { - "mode": "collection", - "path": "apps/categories/spectacles-et-culture", - }, - {"plot": "Culturebox"}, - {"icon": _CHANNEL_ICONS["culturebox"]}, - {}, - ) - - # Extra items - - parent_item_type = parent_item.get("type") - - if parent_item_type in [ - "categorie", - "channel", - "program", - "region", - "sous_categorie", - ]: - collection_id = ( - parent_item.get("channel_path") - or parent_item.get("program_path") - or parent_item.get("region_path") - or parent_item.get("url_complete") - ) - - # Add "all TV shows"/"all programs" item - if parent_item_type != "program": - yield ParsedItem( - "$LOCALIZE[30101]", - { - "mode": "collection", - "path": "apps/regions/{}/programs".format( - collection_id - ), - }, - {"plot": ""}, - {"icon": _ALL_TV_SHOWS_ICON}, - {"SpecialSort": "bottom"}, - ) - - yield ParsedItem( - "$LOCALIZE[30102]", - { - "mode": "collection", - "path": "generic/taxonomy/{}/contents".format( - collection_id - ), - }, - {"plot": ""}, - {"icon": _ALL_VIDEOS_ICON}, - {"SpecialSort": "bottom"}, - ) - - if ( - level is None - and cursor - and cursor.get("next") - and cursor.get("last") - ): - # Add "next page" item - label = "$LOCALIZE[30103] ({}/{})".format( - cursor["next"] + 1, cursor["last"] + 1 - ) - yield ParsedItem( - label, - { - "mode": "collection", - "path": update_url_params(path, page=cursor["next"]), - }, - {"plot": ""}, - {"icon": _NEXT_PAGE_ICON}, - {"SpecialSort": "bottom"}, - ) diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/lib/api.pyo b/templates/.kodi/addons/plugin.video.francetv/resources/lib/api.pyo deleted file mode 100644 index bb1e0ea3..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/lib/api.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/lib/kodilogging.py b/templates/.kodi/addons/plugin.video.francetv/resources/lib/kodilogging.py deleted file mode 100644 index 552f5a5a..00000000 --- a/templates/.kodi/addons/plugin.video.francetv/resources/lib/kodilogging.py +++ /dev/null @@ -1,67 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2015 Thomas Amland -# Copyright © 2020 melmorabity -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 51 -# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -from __future__ import unicode_literals -import logging -from logging import Formatter -from logging import StreamHandler - -import xbmc # pylint: disable=import-error -import xbmcaddon # pylint: disable=import-error - - -class KodiLogHandler(StreamHandler): - def __init__(self): - StreamHandler.__init__(self) - - self._addon = xbmcaddon.Addon() - addon_id = self._addon.getAddonInfo("id") - formatter = Formatter("[{}] %(message)s".format(addon_id)) - self.setFormatter(formatter) - - def emit(self, record): - levels = { - logging.CRITICAL: xbmc.LOGFATAL, - logging.ERROR: xbmc.LOGERROR, - logging.WARNING: xbmc.LOGWARNING, - logging.INFO: xbmc.LOGINFO, - logging.DEBUG: xbmc.LOGDEBUG, - logging.NOTSET: xbmc.LOGNONE, - } - - if self._addon.getSetting("debug_logging") == "true": - levels[logging.DEBUG] = xbmc.LOGINFO - - try: - xbmc.log(self.format(record), levels[record.levelno]) - except UnicodeEncodeError: - xbmc.log( - self.format(record).encode("utf-8", "ignore"), - levels[record.levelno], - ) - - def flush(self): - pass - - -def config(): - logger = logging.getLogger() - # Make sure we pass all messages, Kodi will do some filtering itself. - logger.setLevel(logging.DEBUG) - logger.addHandler(KodiLogHandler()) diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/lib/kodilogging.pyo b/templates/.kodi/addons/plugin.video.francetv/resources/lib/kodilogging.pyo deleted file mode 100644 index 24f77951..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/lib/kodilogging.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/lib/utils.py b/templates/.kodi/addons/plugin.video.francetv/resources/lib/utils.py deleted file mode 100644 index 05efb4f8..00000000 --- a/templates/.kodi/addons/plugin.video.francetv/resources/lib/utils.py +++ /dev/null @@ -1,71 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2020 melmorabity -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 51 -# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -from __future__ import unicode_literals - -try: - from urllib.parse import parse_qsl - from urllib.parse import urlencode - from urllib.parse import urlparse - from urllib.parse import urlunparse -except ImportError: - from urlparse import parse_qsl - from urllib import urlencode - from urlparse import urlparse - from urlparse import urlunparse - -try: - from typing import Optional - from typing import Text - from typing import Union -except ImportError: - pass - -from bs4 import BeautifulSoup - - -# Only capitalize the first letter -def capitalize(label): - # type: (Optional[Text]) -> Optional[Text] - - if not label: - return label - - return label[0].upper() + label[1:] - - -def html_to_text(html): - # type: (Optional[Text]) -> Optional[Text] - - if not html: - return html - - return BeautifulSoup(html, features="html.parser").get_text() - - -def update_url_params(url, **params): - # type: (Text, Union[None, int, Text]) -> Text - - clean_params = {k: v for k, v in list(params.items()) if v is not None} - - parsed_url = list(urlparse(url)) - parsed_url_params = dict(parse_qsl(parsed_url[4])) - parsed_url_params.update(clean_params) - parsed_url[4] = urlencode(clean_params) - - return urlunparse(parsed_url) diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/lib/utils.pyo b/templates/.kodi/addons/plugin.video.francetv/resources/lib/utils.pyo deleted file mode 100644 index 6737f5b6..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/lib/utils.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/lib/video.py b/templates/.kodi/addons/plugin.video.francetv/resources/lib/video.py deleted file mode 100644 index 97444061..00000000 --- a/templates/.kodi/addons/plugin.video.francetv/resources/lib/video.py +++ /dev/null @@ -1,95 +0,0 @@ -# coding: utf-8 -# -# Copyright © 2020 melmorabity -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 51 -# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -from __future__ import unicode_literals - -try: - from typing import Any - from typing import Optional - from typing import Text -except ImportError: - pass - - -from requests import Response -from requests import Session -from requests.exceptions import HTTPError - - -class FranceTVVideoException(Exception): - pass - - -class FranceTVVideo: - _GEOLOCATION_URL = "https://geoftv-a.akamaihd.net/ws/edgescape.json" - _API_URL = "https://player.webservices.francetelevisions.fr/v1/videos" - - def __init__(self): - self._session = Session() - self._session.hooks = {"response": [self._requests_raise_status]} - - def __enter__(self): - return self - - def __exit__(self, *args): - if self._session: - self._session.close() - - @staticmethod - def _requests_raise_status(response, *_args, **_kwargs): - # type: (Response, Any, Any) -> None - - try: - response.raise_for_status() - except HTTPError as ex: - try: - raise FranceTVVideoException( - ex, ex.response.json().get("message") - ) - except ValueError: - raise ex - - def _get_country_code(self): - # type: () -> Optional[Text] - - response = self._session.get(self._GEOLOCATION_URL).json() - - return ( - response.get("reponse", {}).get("geo_info", {}).get("country_code") - ) - - def get_video_url(self, video_id, dash=True): - # type: (Text, bool) -> Text - - data = self._session.get( - "{}/{}".format(self._API_URL, video_id), - params={ - "country_code": self._get_country_code(), - "os": "android" if dash else "ios", - }, - ).json() - - token = data.get("video", {}).get("token") - if not token: - raise FranceTVVideoException() - - video_url = self._session.get(token).json().get("url") - if not video_url: - raise FranceTVVideoException() - - return video_url diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/lib/video.pyo b/templates/.kodi/addons/plugin.video.francetv/resources/lib/video.pyo deleted file mode 100644 index d8f8c332..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/lib/video.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/all-tv-shows.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/all-tv-shows.png deleted file mode 100644 index d15e48cd..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/all-tv-shows.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/all-videos.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/all-videos.png deleted file mode 100644 index f3f1c9a1..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/all-videos.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/categories.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/categories.png deleted file mode 100644 index ac209693..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/categories.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/channels.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/channels.png deleted file mode 100644 index 419fff3d..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/channels.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/culturebox.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/culturebox.png deleted file mode 100644 index 8e645a3b..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/culturebox.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/france-2.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/france-2.png deleted file mode 100644 index 61e927cf..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/france-2.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/france-3.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/france-3.png deleted file mode 100644 index bdc3d263..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/france-3.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/france-4.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/france-4.png deleted file mode 100644 index 073b0935..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/france-4.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/france-5.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/france-5.png deleted file mode 100644 index 56a2f06d..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/france-5.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/france-o.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/france-o.png deleted file mode 100644 index 060a099e..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/france-o.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/franceinfo.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/franceinfo.png deleted file mode 100644 index 432e3986..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/franceinfo.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/home.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/home.png deleted file mode 100644 index 0152e8bf..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/home.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/la1ere.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/la1ere.png deleted file mode 100644 index 1d50b7e4..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/la1ere.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/live-tv.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/live-tv.png deleted file mode 100644 index 6184f68f..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/live-tv.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/next-page.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/next-page.png deleted file mode 100644 index 13e51aec..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/next-page.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/next_page.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/next_page.png deleted file mode 100644 index 13e51aec..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/next_page.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/okoo.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/okoo.png deleted file mode 100644 index 90254c41..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/okoo.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/search.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/search.png deleted file mode 100644 index f57f683d..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/search.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.francetv/resources/media/slash.png b/templates/.kodi/addons/plugin.video.francetv/resources/media/slash.png deleted file mode 100644 index 9f04df6d..00000000 Binary files a/templates/.kodi/addons/plugin.video.francetv/resources/media/slash.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/addon.xml b/templates/.kodi/addons/plugin.video.vstream/addon.xml deleted file mode 100644 index eee06d39..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/addon.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - video - - - - - - - Window.IsVisible(home) + ListItem.Property(sMeta) - - - - Window.IsVisible(home) + !ListItem.Property(isBookmark) + ListItem.Property(sMeta) - - - - Window.IsVisible(home) + ListItem.Property(sMeta) - - - - Window.IsVisible(home) + ListItem.Property(isBookmark) - - - - Window.IsVisible(home) + ListItem.Property(isViewing) - - - - - - - vStream par Venom, TmpName, Arias800, Razorex, Sizanic, Yodidon. - vStream est un module de streaming Francais, retrouvez tous vos films, series, japanimes, documentaires, reportages, concerts, sports,... - vStream est un addon de streaming videos - vStream par Venom, TmpName, Arias800, Razorex, Sizanic, Yodidon. - vStream est un module de streaming Francais, trouvez tous vos films, series et mangas. - vStream est un addon de streaming videos - vStream by Venom, TmpName, Arias800, Razorex, Sizanic, Yodidon. - vStream module and a French streaming, find all your movies, TV shows and mangas. - vStream is a video streaming addon - vStream by Venom, TmpName, Arias800, Razorex, Sizanic, Yodidon. - vStream module and a French streaming, find all your movies, TV shows and mangas. - vStream is a video streaming addon - vStream by Venom, TmpName, Arias800, Razorex, Sizanic, Yodidon. - vStream module and a French streaming, find all your movies, TV shows and mangas. - vStream is a video streaming addon - all - GNU GENERAL PUBLIC LICENSE - https://github.com/Kodi-vStream/venom-xbmc-addons/issues - https://github.com/Kodi-vStream/venom-xbmc-addons/ - - icon.png - fanart.jpg - screenshot-01.jpg - screenshot-02.jpg - screenshot-03.jpg - - - diff --git a/templates/.kodi/addons/plugin.video.vstream/changelog.txt b/templates/.kodi/addons/plugin.video.vstream/changelog.txt deleted file mode 100644 index 785af9a0..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/changelog.txt +++ /dev/null @@ -1,87 +0,0 @@ -================================================================================== -- Version & Repository: https://github.com/Kodi-vStream/venom-xbmc-addons/releases -- Participer: https://github.com/Kodi-vStream/venom-xbmc-addons/issues -- Support: https://kodi-vstream.github.io/ -================================================================================== -================================================================================== -- Auteurs : LordVenom, TmpName, Arias800, Razorex, Sizanic, Yodidon, et Cie -https://github.com/Kodi-vStream/venom-xbmc-addons/graphs/contributors -================================================================================== -================================================================================== -Historique des modifications -- https://github.com/Kodi-vStream/venom-xbmc-addons/commits/Beta -================================================================================== - - -*** 2.1.0*** -- RealDebrid : Utilisation par token, sans besoin de UrlResolver -- Bande annonce : Compatibilité avec l'extension Invidious - - -*** 2.0.0*** -- TMDB : Noter film/série, ajouter aux favoris, à la liste de suivi, à des listes personnelles -- Uptobox : Affichage des métadonnées des vidéos de son compte -- Trakt : suivi des episodes enchainés automatiquement -- En cours de visionnage : classé par catégories -- Marque-page : ajout possible depuis les informations -- Menu contextuel en couleur - -*** 1.9.0*** -- Bandes annonces depuis Youtube -- Recherche plus rapide avec suivi des sources -- Navigation plus rapide - -*** 1.8.0*** -- Recherche plus rapide et des résultats plus pertinents -- Amélioration de la fluidité dans la navigation des menus - -*** 1.7.0*** -- Retour des sites de sports -- Episodes toujours classés par ordre -- Classement des paramètres + possibilité de désactiver toutes les sources - -*** 1.6.0*** -- Meilleur support des sous-titres -- Meilleur support de Uptostream -- Métadonnées dans l'enchainement des épisodes -- Amélioration sur l'affichage des métadonnées (numérotation des épisodes, ...) - -*** 1.5.0*** -- Contrat de licence sur l'utilisation du code vStream -- Meilleure intégration de DNSPython -- Amélioration des performances -- Amélioration sur l'affichage des métadonnées (sagas, titre des épisodes, ...) -- Meilleur support de Uptostream - -*** 1.4.0*** -- En cours de lecture : ajout d'une section avec les médias commencés - -*** 1.3.0*** -- Métadonnées : informations média pour les épisodes - -*** 1.2.0*** -- UpNext : Enchainement automatique des épisodes -- Reprise d'un média commencé, même en changeant de source -- Métadonnées : plus d'informations média pour les films et compatibilité avec plus de skins -- Métadonnées : informations média (pochette et description) pour les saisons - -*** 1.1.0*** -- F4mProxy : Suppression de la dépendance -- Sous-titre : Chargement automatique du premier -- Uptobox : Meilleure gestion -- IPTV : Suppression des listes d'IPTV - -*** 1.0.0*** -- UrlResolver : compatibilité Matrix -- TRAKT : Pagination dans les menus -- TMDB : Affichage d'un QR Code pour activer la clef API -- Recherche sous Matrix : Insensibilité à la casse des lettres - -*** 0.8.6*** -- Sablier réduit pour améliorer les performances de navigation -- Nouvelle clef TMDB pour les Métadonnées -- Recherche "japAnimes" séparée de la recherche "Séries". -- De nouvelles sources pour les japAnimes -- Menu "Dramas" et recherche "Dramas" -- Autoriser le contenu Adulte -- Permettre l'utilisation de la fenetre d'information du skin diff --git a/templates/.kodi/addons/plugin.video.vstream/default.py b/templates/.kodi/addons/plugin.video.vstream/default.py deleted file mode 100644 index 39c25d80..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/default.py +++ /dev/null @@ -1,307 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -import xbmc - -# from resources.lib.statistic import cStatistic -from resources.lib.home import cHome -from resources.lib.gui.gui import cGui -from resources.lib.handler.pluginHandler import cPluginHandler -from resources.lib.handler.inputParameterHandler import cInputParameterHandler -from resources.lib.handler.outputParameterHandler import cOutputParameterHandler -from resources.lib.comaddon import progress, VSlog, addon, window, siteManager -from resources.lib.search import cSearch -# http://kodi.wiki/view/InfoLabels -# http://kodi.wiki/view/List_of_boolean_conditions - - -#################### -# -# Permet de debuguer avec Eclipse -# -# Tuto ici : -# https://github.com/Kodi-vStream/venom-xbmc-addons/wiki -# -#################### - -# Mettre True pour activer le debug -DEBUG = False - -if DEBUG: - - import sys # pydevd module need to be copied in Kodi\system\python\Lib\pysrc - sys.path.append('H:\Program Files\Kodi\system\Python\Lib\pysrc') - - try: - import pysrc.pydevd as pydevd - pydevd.settrace('localhost', stdoutToServer=True, stderrToServer=True) - except ImportError: - try: - import pydevd # with the addon script.module.pydevd, only use `import pydevd` - pydevd.settrace('localhost', stdoutToServer=True, stderrToServer=True) - except ImportError: - sys.stderr.write("Error: " + "You must add org.python.pydev.debug.pysrc to your PYTHONPATH.") - - -class main: - - def __init__(self): - self.parseUrl() - - def parseUrl(self): - # Exclue les appels par des plugins qu'on ne sait pas gérer, par exemple : plugin://plugin.video.vstream/extrafanart - oPluginHandler = cPluginHandler() - pluginPath = oPluginHandler.getPluginPath() - if pluginPath == 'plugin://plugin.video.vstream/extrafanart/': - return - - oInputParameterHandler = cInputParameterHandler() - - if oInputParameterHandler.exist('function'): - sFunction = oInputParameterHandler.getValue('function') - else: - VSlog('call load methode') - sFunction = "load" - - if sFunction == 'setSetting': - if oInputParameterHandler.exist('id'): - plugin_id = oInputParameterHandler.getValue('id') - else: - return - - if oInputParameterHandler.exist('value'): - value = oInputParameterHandler.getValue('value') - else: - return - - setSetting(plugin_id, value) - return - - if sFunction == 'setSettings': - setSettings(oInputParameterHandler) - return - - if sFunction == 'DoNothing': - return - - if not oInputParameterHandler.exist('site'): - # charge home - plugins = __import__('resources.lib.home', fromlist=['home']).cHome() - function = getattr(plugins, 'load') - function() - return - - if oInputParameterHandler.exist('site'): - sSiteName = oInputParameterHandler.getValue('site') - VSlog('load site ' + sSiteName + ' and call function ' + sFunction) - - if isHosterGui(sSiteName, sFunction): - return - - if isGui(sSiteName, sFunction): - return - - if isFav(sSiteName, sFunction): - return - - if isViewing(sSiteName, sFunction): - return - - if isLibrary(sSiteName, sFunction): - return - - if isDl(sSiteName, sFunction): - return - - if isHome(sSiteName, sFunction): - return - - if isTrakt(sSiteName, sFunction): - return - - if isSearch(sSiteName, sFunction): - return - - if sSiteName == 'globalRun': - __import__('resources.lib.runscript', fromlist=['runscript']) - # function = getattr(plugins, sFunction) - # function() - return - - if sSiteName == 'globalSources': - oGui = cGui() - aPlugins = oPluginHandler.getAvailablePlugins(force = (sFunction == 'globalSources')) - - sitesManager = siteManager() - - if len(aPlugins) == 0: - addons = addon() - addons.openSettings() - oGui.updateDirectory() - else: - for aPlugin in aPlugins: - - sitename = aPlugin[0] - if not sitesManager.isActive(aPlugin[1]): - sitename = '[COLOR red][OFF] ' + sitename + '[/COLOR]' - - oOutputParameterHandler = cOutputParameterHandler() - oOutputParameterHandler.addParameter('siteUrl', 'http://venom') - icon = 'sites/%s.png' % (aPlugin[1]) - oGui.addDir(aPlugin[1], 'load', sitename, icon, oOutputParameterHandler) - - oGui.setEndOfDirectory() - return - - if sSiteName == 'globalParametre': - addons = addon() - addons.openSettings() - return - # if isAboutGui(sSiteName, sFunction) == True: - # return - - # charge sites - try: - plugins = __import__('resources.sites.%s' % sSiteName, fromlist=[sSiteName]) - function = getattr(plugins, sFunction) - function() - except Exception as e: - progress().VSclose() # Referme le dialogue en cas d'exception, sinon blocage de Kodi - VSlog('could not load site: ' + sSiteName + ' error: ' + str(e)) - import traceback - traceback.print_exc() - return - - -def setSetting(plugin_id, value): - addons = addon() - setting = addons.getSetting(plugin_id) - - # modifier si différent - if setting != value: - addons.setSetting(plugin_id, value) - return True - - return False - - -# Permet la modification des settings depuis un raccourci dans le skin (jusqu'à 100 paramètres). -# Supporte les retours à la ligne seulement derrière le paramètre, exemple : -# RunAddon(plugin.video.vstream,function=setSettings&id1=plugin_cinemay_com&value1=true -# &id2=plugin_cinemegatoil_org&value2=false -# &id3=hoster_uploaded_premium&value3=true -# &id4=hoster_uploaded_username&value4=MyName -# &id5=hoster_uploaded_password&value5=MyPass) -def setSettings(oInputParameterHandler): - addons = addon() - - for i in range(1, 100): - plugin_id = oInputParameterHandler.getValue('id' + str(i)) - if plugin_id: - value = oInputParameterHandler.getValue('value' + str(i)) - value = value.replace('\n', '') - oldSetting = addons.getSetting(plugin_id) - # modifier si différent - if oldSetting != value: - addons.setSetting(plugin_id, value) - - return True - - -def isHosterGui(sSiteName, sFunction): - if sSiteName == 'cHosterGui': - plugins = __import__('resources.lib.gui.hoster', fromlist=['cHosterGui']).cHosterGui() - function = getattr(plugins, sFunction) - function() - return True - return False - - -def isGui(sSiteName, sFunction): - if sSiteName == 'cGui': - oGui = cGui() - exec("oGui." + sFunction + "()") - return True - return False - - -def isFav(sSiteName, sFunction): - if sSiteName == 'cFav': - plugins = __import__('resources.lib.bookmark', fromlist=['cFav']).cFav() - function = getattr(plugins, sFunction) - function() - return True - return False - - -def isViewing(sSiteName, sFunction): - if sSiteName == 'cViewing': - plugins = __import__('resources.lib.viewing', fromlist=['cViewing']).cViewing() - function = getattr(plugins, sFunction) - function() - return True - return False - - -def isLibrary(sSiteName, sFunction): - if sSiteName == 'cLibrary': - plugins = __import__('resources.lib.library', fromlist=['cLibrary']).cLibrary() - function = getattr(plugins, sFunction) - function() - return True - return False - - -def isDl(sSiteName, sFunction): - if sSiteName == 'cDownload': - plugins = __import__('resources.lib.download', fromlist=['cDownload']).cDownload() - function = getattr(plugins, sFunction) - function() - return True - return False - - -def isHome(sSiteName, sFunction): - if sSiteName == 'cHome': - oHome = cHome() - exec("oHome." + sFunction + "()") - return True - return False - - -def isTrakt(sSiteName, sFunction): - if sSiteName == 'cTrakt': - plugins = __import__('resources.lib.trakt', fromlist=['cTrakt']).cTrakt() - function = getattr(plugins, sFunction) - function() - return True - return False - - -def isSearch(sSiteName, sFunction): - if sSiteName == 'globalSearch': - oSearch = cSearch() - exec("oSearch.searchGlobal()") - return True - return False - - -def _pluginSearch(plugin, sSearchText): - - # Appeler la source en mode Recherche globale - window(10101).setProperty('search', 'true') - - try: - plugins = __import__('resources.sites.%s' % plugin['identifier'], fromlist=[plugin['identifier']]) - function = getattr(plugins, plugin['search'][1]) - sUrl = plugin['search'][0] + str(sSearchText) - - function(sUrl) - - VSlog('Load Search: ' + str(plugin['identifier'])) - except: - VSlog(plugin['identifier'] + ': search failed') - - window(10101).setProperty('search', 'false') - - -main() diff --git a/templates/.kodi/addons/plugin.video.vstream/fanart.jpg b/templates/.kodi/addons/plugin.video.vstream/fanart.jpg deleted file mode 100644 index 84bac238..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/fanart.jpg and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/icon.png b/templates/.kodi/addons/plugin.video.vstream/icon.png deleted file mode 100644 index 9412a0a6..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/icon.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/license.txt b/templates/.kodi/addons/plugin.video.vstream/license.txt deleted file mode 100644 index 818433ec..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/license.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/__init__.py b/templates/.kodi/addons/plugin.video.vstream/resources/__init__.py deleted file mode 100644 index b0ef03a1..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# To change this template, choose Tools | Templates -# and open the template in the editor. - - diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/__init__.pyo b/templates/.kodi/addons/plugin.video.vstream/resources/__init__.pyo deleted file mode 100644 index 5d0d3b7e..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/__init__.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/actor.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/actor.png deleted file mode 100644 index 38cfa517..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/actor.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/animes.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/animes.png deleted file mode 100644 index 414707b5..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/animes.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/annees.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/annees.png deleted file mode 100644 index 094a78d2..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/annees.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/az.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/az.png deleted file mode 100644 index 63652e95..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/az.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/background.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/background.png deleted file mode 100644 index c55ca422..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/background.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/buzz.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/buzz.png deleted file mode 100644 index 2e50a5bd..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/buzz.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/comments.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/comments.png deleted file mode 100644 index 86ece543..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/comments.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/doc.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/doc.png deleted file mode 100644 index 81993a0d..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/doc.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/download.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/download.png deleted file mode 100644 index b6a4ae12..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/download.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/dramas.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/dramas.png deleted file mode 100644 index a0d1fba7..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/dramas.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/enfants.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/enfants.png deleted file mode 100644 index 5ad4e455..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/enfants.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/fanart.jpg b/templates/.kodi/addons/plugin.video.vstream/resources/art/fanart.jpg deleted file mode 100644 index 84bac238..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/fanart.jpg and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/films.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/films.png deleted file mode 100644 index 356c472c..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/films.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/genres.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/genres.png deleted file mode 100644 index 578c07de..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/genres.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/hd.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/hd.png deleted file mode 100644 index 8330867f..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/hd.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/host.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/host.png deleted file mode 100644 index 9d18ef63..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/host.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/icon.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/icon.png deleted file mode 100644 index 9412a0a6..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/icon.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/lang.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/lang.png deleted file mode 100644 index e05b7409..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/lang.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/library.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/library.png deleted file mode 100644 index f48051df..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/library.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/listes.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/listes.png deleted file mode 100644 index 2142a312..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/listes.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/mark.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/mark.png deleted file mode 100644 index 2461f572..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/mark.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/music.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/music.png deleted file mode 100644 index 56848c05..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/music.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/news.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/news.png deleted file mode 100644 index 3e7080d0..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/news.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/next.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/next.png deleted file mode 100644 index 6664f968..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/next.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/none.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/none.png deleted file mode 100644 index 0dc8dba1..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/none.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/notes.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/notes.png deleted file mode 100644 index ecc49389..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/notes.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/replay.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/replay.png deleted file mode 100644 index 69d2ef57..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/replay.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/search.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/search.png deleted file mode 100644 index 5807f54c..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/search.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/searchtmdb.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/searchtmdb.png deleted file mode 100644 index 72b4c8e3..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/searchtmdb.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/series.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/series.png deleted file mode 100644 index 6104f64d..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/series.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/_1seriestreaming.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/_1seriestreaming.png deleted file mode 100644 index 73b59a25..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/_1seriestreaming.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/_33seriestreaming.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/_33seriestreaming.png deleted file mode 100644 index 301ee70b..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/_33seriestreaming.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/_4kstreamz.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/_4kstreamz.png deleted file mode 100644 index 1760c5c6..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/_4kstreamz.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/adkami_com.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/adkami_com.png deleted file mode 100644 index ee1b08f6..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/adkami_com.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/alldebrid.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/alldebrid.png deleted file mode 100644 index 4aadcf07..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/alldebrid.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/animecomplet.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/animecomplet.png deleted file mode 100644 index de6c1bac..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/animecomplet.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/animeultime.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/animeultime.png deleted file mode 100644 index e28a32b3..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/animeultime.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/asia_insane.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/asia_insane.png deleted file mode 100644 index c6877e4e..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/asia_insane.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/buzzmonclick_com.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/buzzmonclick_com.png deleted file mode 100644 index 0b0db2a1..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/buzzmonclick_com.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/channelstream.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/channelstream.png deleted file mode 100644 index dd56bd5d..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/channelstream.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/cine974.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/cine974.png deleted file mode 100644 index 15e6cbc2..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/cine974.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/cinemay_cc.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/cinemay_cc.png deleted file mode 100644 index 004f632a..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/cinemay_cc.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/cinemay_com.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/cinemay_com.png deleted file mode 100644 index e353be07..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/cinemay_com.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/daddyhd.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/daddyhd.png deleted file mode 100644 index 312f5c30..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/daddyhd.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/dbanimes.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/dbanimes.png deleted file mode 100644 index 3446996c..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/dbanimes.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/ddl1.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/ddl1.png deleted file mode 100644 index 0eea1468..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/ddl1.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/debrid_link.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/debrid_link.png deleted file mode 100644 index d394ea83..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/debrid_link.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/docu_fr.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/docu_fr.png deleted file mode 100644 index e6a2410f..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/docu_fr.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/dpstream.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/dpstream.png deleted file mode 100644 index 619f11a3..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/dpstream.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/dpstreamhd.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/dpstreamhd.png deleted file mode 100644 index e63d44e6..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/dpstreamhd.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/ducine.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/ducine.png deleted file mode 100644 index c0ef4e75..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/ducine.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/enstream_series.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/enstream_series.png deleted file mode 100644 index 8bdfdd0b..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/enstream_series.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/extreme_down.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/extreme_down.png deleted file mode 100644 index d8847fec..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/extreme_down.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmoflix.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmoflix.png deleted file mode 100644 index 1fd3689c..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmoflix.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmspourenfants.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmspourenfants.png deleted file mode 100644 index 5a9eadb7..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmspourenfants.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmstoon_pro.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmstoon_pro.png deleted file mode 100644 index 8b95fcc0..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmstoon_pro.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmstreamingy.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmstreamingy.png deleted file mode 100644 index 0a2f6bd8..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmstreamingy.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmstreamvk_com.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmstreamvk_com.png deleted file mode 100644 index 2f763a82..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/filmstreamvk_com.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/free_telechargement_org.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/free_telechargement_org.png deleted file mode 100644 index 00ace7d0..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/free_telechargement_org.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/freebox.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/freebox.png deleted file mode 100644 index e1fc8441..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/freebox.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/french_stream_com.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/french_stream_com.png deleted file mode 100644 index 76d7335a..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/french_stream_com.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/french_stream_lol.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/french_stream_lol.png deleted file mode 100644 index 76d7335a..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/french_stream_lol.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/frenchanimes.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/frenchanimes.png deleted file mode 100644 index aae08a3c..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/frenchanimes.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/fullmatchtv.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/fullmatchtv.png deleted file mode 100644 index ce4dac1e..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/fullmatchtv.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/funeralforamanga.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/funeralforamanga.png deleted file mode 100644 index 0fa6e729..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/funeralforamanga.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/gum_gum_streaming_com.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/gum_gum_streaming_com.png deleted file mode 100644 index 15b0f4e7..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/gum_gum_streaming_com.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/hds_fm.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/hds_fm.png deleted file mode 100644 index 7ea97e7d..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/hds_fm.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/hds_stream.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/hds_stream.png deleted file mode 100644 index cc0e7515..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/hds_stream.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/ianime.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/ianime.png deleted file mode 100644 index 7d6b27ed..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/ianime.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/illimitestreaming.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/illimitestreaming.png deleted file mode 100644 index dfec77fe..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/illimitestreaming.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/k_streaming.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/k_streaming.png deleted file mode 100644 index 10185799..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/k_streaming.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/kaydo_ws.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/kaydo_ws.png deleted file mode 100644 index f4492122..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/kaydo_ws.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/kepliz_com.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/kepliz_com.png deleted file mode 100644 index d2e1eacd..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/kepliz_com.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/kstreamingfilm.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/kstreamingfilm.png deleted file mode 100644 index 10324338..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/kstreamingfilm.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/kstreamingserie.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/kstreamingserie.png deleted file mode 100644 index fc059876..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/kstreamingserie.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/leet365.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/leet365.png deleted file mode 100644 index a64ecc49..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/leet365.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/les_debiles.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/les_debiles.png deleted file mode 100644 index 1fd921b4..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/les_debiles.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/les_docus.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/les_docus.png deleted file mode 100644 index 8137d919..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/les_docus.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/libertyland_tv.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/libertyland_tv.png deleted file mode 100644 index 837ed4a4..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/libertyland_tv.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/livetv.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/livetv.png deleted file mode 100644 index aec62bdd..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/livetv.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/lsdb.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/lsdb.png deleted file mode 100644 index ed8842f0..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/lsdb.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/mamcin.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/mamcin.png deleted file mode 100644 index a6bf7e8d..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/mamcin.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/mesfilms.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/mesfilms.png deleted file mode 100644 index 58043c50..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/mesfilms.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/mystream_zone.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/mystream_zone.png deleted file mode 100644 index 3f161b8c..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/mystream_zone.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/neko_sama.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/neko_sama.png deleted file mode 100644 index ed1707e5..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/neko_sama.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/neuf_docu.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/neuf_docu.png deleted file mode 100644 index 6dc68335..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/neuf_docu.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/o1streaming.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/o1streaming.png deleted file mode 100644 index a65e316b..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/o1streaming.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/otaku_attitude.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/otaku_attitude.png deleted file mode 100644 index e7f5f8e0..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/otaku_attitude.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/otakufr_com.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/otakufr_com.png deleted file mode 100644 index 6e2994ae..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/otakufr_com.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/pastebin.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/pastebin.png deleted file mode 100644 index 8030a7c6..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/pastebin.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/planet_streaming.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/planet_streaming.png deleted file mode 100644 index da595dc7..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/planet_streaming.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/pluto_tv.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/pluto_tv.png deleted file mode 100644 index 35141691..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/pluto_tv.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/psyplay.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/psyplay.png deleted file mode 100644 index 8fafcb07..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/psyplay.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/radio.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/radio.png deleted file mode 100644 index cc57ed2f..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/radio.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/serie_streaming.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/serie_streaming.png deleted file mode 100644 index 79518591..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/serie_streaming.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/serie_streaminghd.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/serie_streaminghd.png deleted file mode 100644 index 7e89d61e..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/serie_streaminghd.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/series_en_streaming.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/series_en_streaming.png deleted file mode 100644 index d8884d37..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/series_en_streaming.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/series_stream.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/series_stream.png deleted file mode 100644 index 06afb1b5..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/series_stream.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/siteonefichier.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/siteonefichier.png deleted file mode 100644 index 17b0d614..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/siteonefichier.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/siteuptobox.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/siteuptobox.png deleted file mode 100644 index 5ce1ad88..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/siteuptobox.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/skyanimes.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/skyanimes.png deleted file mode 100644 index 94104e7a..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/skyanimes.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/stream_complet.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/stream_complet.png deleted file mode 100644 index f9ff02bf..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/stream_complet.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streamcomplet3.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streamcomplet3.png deleted file mode 100644 index 45b7f553..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streamcomplet3.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streamdivx.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streamdivx.png deleted file mode 100644 index 5ee37d29..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streamdivx.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streaming_series.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streaming_series.png deleted file mode 100644 index feae776c..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streaming_series.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streamingdivx.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streamingdivx.png deleted file mode 100644 index 558480fe..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streamingdivx.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streaminz.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streaminz.png deleted file mode 100644 index abe05676..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streaminz.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streamonsport.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streamonsport.png deleted file mode 100644 index d3fc3088..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streamonsport.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streampourvous.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streampourvous.png deleted file mode 100644 index 131e602b..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/streampourvous.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/telecharger_streaming.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/telecharger_streaming.png deleted file mode 100644 index 52eeea3e..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/telecharger_streaming.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/themoviedb_org.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/themoviedb_org.png deleted file mode 100644 index d7f68d79..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/themoviedb_org.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/tirexo.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/tirexo.png deleted file mode 100644 index 4685a367..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/tirexo.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/toonanime.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/toonanime.png deleted file mode 100644 index 28866de1..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/toonanime.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/topimdb.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/topimdb.png deleted file mode 100644 index 2d3e2ede..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/topimdb.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/topreplay.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/topreplay.png deleted file mode 100644 index d61d1ca0..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/topreplay.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/uptobox_live.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/uptobox_live.png deleted file mode 100644 index 14add3c5..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/uptobox_live.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/vf_film.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/vf_film.png deleted file mode 100644 index 1a3c6eb4..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/vf_film.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/vf_serie.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/vf_serie.png deleted file mode 100644 index b3e50f41..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/vf_serie.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/vfilms.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/vfilms.png deleted file mode 100644 index cff062e2..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/vfilms.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/videobuzzy_com.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/videobuzzy_com.png deleted file mode 100644 index 7837b2be..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/videobuzzy_com.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/viki_com.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/viki_com.png deleted file mode 100644 index 9ac90e2c..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/viki_com.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/voiranime.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/voiranime.png deleted file mode 100644 index 27090663..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/voiranime.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/voirfilms_org.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/voirfilms_org.png deleted file mode 100644 index 798aae93..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/voirfilms_org.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/voirseries_best.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/voirseries_best.png deleted file mode 100644 index 17b6b7c3..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/voirseries_best.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/vostfree.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/vostfree.png deleted file mode 100644 index bbe568aa..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/vostfree.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/watchvf.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/watchvf.png deleted file mode 100644 index beb59dcd..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/watchvf.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/wawacity.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/wawacity.png deleted file mode 100644 index 7a990e95..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/wawacity.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/wiflix.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/wiflix.png deleted file mode 100644 index 71dd7bd8..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/wiflix.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/youtitou_com.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/youtitou_com.png deleted file mode 100644 index f25f8998..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/youtitou_com.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/zone_streaming.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/zone_streaming.png deleted file mode 100644 index 3cec3a9e..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/zone_streaming.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/zone_telechargement_ws.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/zone_telechargement_ws.png deleted file mode 100644 index 8390633f..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/zone_telechargement_ws.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/zustream.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/zustream.png deleted file mode 100644 index 573c0289..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sites/zustream.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/sport.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/sport.png deleted file mode 100644 index 1f62184d..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/sport.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/star.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/star.png deleted file mode 100644 index c19500f2..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/star.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tmdb.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tmdb.png deleted file mode 100644 index 9c20ea5b..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tmdb.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tools.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tools.png deleted file mode 100644 index 5601d4dd..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tools.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/trakt.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/trakt.png deleted file mode 100644 index 40b583d5..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/trakt.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/trans_checked.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/trans_checked.png deleted file mode 100644 index 172fde7b..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/trans_checked.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/trash.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/trash.png deleted file mode 100644 index eed8f04b..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/trash.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv.png deleted file mode 100644 index 75c6d198..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/6ter.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/6ter.png deleted file mode 100644 index b8e42577..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/6ter.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/LCP100.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/LCP100.png deleted file mode 100644 index bddc01c2..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/LCP100.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/ab1.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/ab1.png deleted file mode 100644 index 6c83b3a3..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/ab1.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/arte.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/arte.png deleted file mode 100644 index e5daae97..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/arte.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/beinsport1.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/beinsport1.png deleted file mode 100644 index dd26d193..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/beinsport1.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/beinsport2.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/beinsport2.png deleted file mode 100644 index 0962cba1..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/beinsport2.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/beinsport3.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/beinsport3.png deleted file mode 100644 index 77b42481..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/beinsport3.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/bfm.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/bfm.png deleted file mode 100644 index 9d4da602..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/bfm.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/bfmbus.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/bfmbus.png deleted file mode 100644 index a7725ffe..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/bfmbus.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/boomerang.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/boomerang.png deleted file mode 100644 index cb90d054..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/boomerang.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/c8.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/c8.png deleted file mode 100644 index 3963bdd7..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/c8.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/canalplus.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/canalplus.png deleted file mode 100644 index e7395023..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/canalplus.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/cherie25.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/cherie25.png deleted file mode 100644 index 12038d53..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/cherie25.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/cnews.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/cnews.png deleted file mode 100644 index 970c648e..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/cnews.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/comedie.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/comedie.png deleted file mode 100644 index 86dcdfa1..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/comedie.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/cstar.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/cstar.png deleted file mode 100644 index bade070e..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/cstar.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/discovery.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/discovery.png deleted file mode 100644 index 42ad8945..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/discovery.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/disneychannel.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/disneychannel.png deleted file mode 100644 index 6577a8ee..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/disneychannel.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/dorcel.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/dorcel.png deleted file mode 100644 index 59f087b2..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/dorcel.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/equidia.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/equidia.png deleted file mode 100644 index 140acfca..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/equidia.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/equipe21.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/equipe21.png deleted file mode 100644 index f807804c..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/equipe21.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/euronews.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/euronews.png deleted file mode 100644 index dd614aef..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/euronews.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/eurosport.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/eurosport.png deleted file mode 100644 index 6d969d08..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/eurosport.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/eurosport2.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/eurosport2.png deleted file mode 100644 index efba67e0..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/eurosport2.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france2.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france2.png deleted file mode 100644 index 21af63f7..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france2.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france24.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france24.png deleted file mode 100644 index 591dd1e6..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france24.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france3.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france3.png deleted file mode 100644 index a8be2991..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france3.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france4.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france4.png deleted file mode 100644 index 9d8489fd..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france4.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france5.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france5.png deleted file mode 100644 index ad538958..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/france5.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/franceinfo.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/franceinfo.png deleted file mode 100644 index 06ad2071..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/franceinfo.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/franceo.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/franceo.png deleted file mode 100644 index a96ad2b6..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/franceo.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/gameone.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/gameone.png deleted file mode 100644 index 536ffbe6..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/gameone.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/gong.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/gong.png deleted file mode 100644 index 2fe95232..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/gong.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/gongmax.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/gongmax.png deleted file mode 100644 index 6b3ecc9c..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/gongmax.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/gulli.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/gulli.png deleted file mode 100644 index fe780a39..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/gulli.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/histoire.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/histoire.png deleted file mode 100644 index 2f5cb1ff..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/histoire.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/i24.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/i24.png deleted file mode 100644 index e32a2b7a..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/i24.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/idf1.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/idf1.png deleted file mode 100644 index 6a2f22f7..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/idf1.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/itele.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/itele.png deleted file mode 100644 index f21a0543..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/itele.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/june.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/june.png deleted file mode 100644 index afa1f31b..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/june.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/kombat.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/kombat.png deleted file mode 100644 index 50779b77..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/kombat.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/kto.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/kto.png deleted file mode 100644 index 3cbd02c8..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/kto.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/latele.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/latele.png deleted file mode 100644 index ffe8bf5f..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/latele.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/lci.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/lci.png deleted file mode 100644 index 2dd04919..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/lci.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/lcp.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/lcp.png deleted file mode 100644 index 4d0ddb90..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/lcp.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/m6.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/m6.png deleted file mode 100644 index 68490e74..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/m6.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mcm.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mcm.png deleted file mode 100644 index 00338613..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mcm.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/menuptv.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/menuptv.png deleted file mode 100644 index eab9ad2d..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/menuptv.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mezzo.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mezzo.png deleted file mode 100644 index 66a86b77..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mezzo.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mtv.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mtv.png deleted file mode 100644 index 96adfe36..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mtv.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mtvbase.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mtvbase.png deleted file mode 100644 index de71e688..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mtvbase.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mtvidol.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mtvidol.png deleted file mode 100644 index 1e5a7c61..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mtvidol.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mtvpulse.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mtvpulse.png deleted file mode 100644 index 407b998e..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/mtvpulse.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/n23.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/n23.png deleted file mode 100644 index 27a163a0..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/n23.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/nrj12.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/nrj12.png deleted file mode 100644 index 17777c2e..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/nrj12.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/nt1.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/nt1.png deleted file mode 100644 index 13d37dd7..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/nt1.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/ouitv.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/ouitv.png deleted file mode 100644 index 9ae56b5c..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/ouitv.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/paramount.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/paramount.png deleted file mode 100644 index c8041d93..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/paramount.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/parispremiere.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/parispremiere.png deleted file mode 100644 index 16a45ae3..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/parispremiere.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/rmcdecouverte.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/rmcdecouverte.png deleted file mode 100644 index 95093fb5..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/rmcdecouverte.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/rmcstory.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/rmcstory.png deleted file mode 100644 index 8a095479..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/rmcstory.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/rougetv.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/rougetv.png deleted file mode 100644 index 52e210b1..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/rougetv.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/rtl9.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/rtl9.png deleted file mode 100644 index f9bb7483..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/rtl9.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/serieclub.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/serieclub.png deleted file mode 100644 index fb7e6785..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/serieclub.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/teva.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/teva.png deleted file mode 100644 index 238cd52e..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/teva.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tf1.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tf1.png deleted file mode 100644 index 41d66b67..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tf1.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tf1seriesfilms.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tf1seriesfilms.png deleted file mode 100644 index 4d577b0b..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tf1seriesfilms.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tf6.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tf6.png deleted file mode 100644 index 01a8a9f7..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tf6.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tfx.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tfx.png deleted file mode 100644 index 5d0f579f..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tfx.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tmc.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tmc.png deleted file mode 100644 index b4ee52f2..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tmc.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tv.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tv.png deleted file mode 100644 index c86d1c97..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/tv.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/virgineradiotv.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/virgineradiotv.png deleted file mode 100644 index 9d6237cb..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/virgineradiotv.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/w9.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/w9.png deleted file mode 100644 index af7536d6..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/w9.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/weo.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/weo.png deleted file mode 100644 index 646fbd0c..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/weo.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/xxl.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/xxl.png deleted file mode 100644 index ac5aeac7..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/xxl.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/zouzous.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/zouzous.png deleted file mode 100644 index 4318d6d2..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/tv/zouzous.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/update.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/update.png deleted file mode 100644 index 6cbf3d69..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/update.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/user.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/user.png deleted file mode 100644 index 8176859c..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/user.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/vf.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/vf.png deleted file mode 100644 index fd225750..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/vf.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/views.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/views.png deleted file mode 100644 index 096f9e2e..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/views.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/art/vostfr.png b/templates/.kodi/addons/plugin.video.vstream/resources/art/vostfr.png deleted file mode 100644 index f5b0db2f..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/art/vostfr.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/extra/debuggrid1080.png b/templates/.kodi/addons/plugin.video.vstream/resources/extra/debuggrid1080.png deleted file mode 100644 index bc94267b..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/extra/debuggrid1080.png and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/extra/radio.xspf b/templates/.kodi/addons/plugin.video.vstream/resources/extra/radio.xspf deleted file mode 100644 index a2f25a6e..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/extra/radio.xspf +++ /dev/null @@ -1,810 +0,0 @@ - - - vStream Radio - - - http://listen.shoutcast.com/4u-70s.m3u - 4U 70s - https://www.4uradios.com/images/4urock.jpg - 70 - - - http://str4uice.streamakaci.com/4uclassicrock.mp3.m3u - 4U Classic Rock - https://cdn.onlineradiobox.com/img/logo/3/7883.v5.png - Rock - - - https://azur.123live.com/radio/8020/radio.mp3 - 4U French 80s - https://www.4uradios.com/images/4urock.jpg - 80 - - - http://listen.shoutcast.com/4u-funky-classics.m3u - 4U Funky Classic - https://www.4uradios.com/images/4Ufunkyclassic.gif - Funk - - - https://azur.123live.com/radio/8010/radio.mp3 - 4U Motown - https://liveonlineradio.net/wp-content/uploads/2014/12/4U-Motown-Radio.jpg - Funk - - - http://listen.shoutcast.com/4u-hard-fm.m3u - 4U Rock N Metal - https://www.4uradios.com/images/logo4u.png - Rock - - - http://listen.shoutcast.com/4u-smooth-jazz.m3u - 4U Smooth Jazz - https://www.4uradios.com/images/4usmoothjazz.jpg - Jazz - - - http://stream.laut.fm/80sexitos - 80s EXITOS - https://cdn.webradio.media/Images/41093-80-33.png - 80 - - - https://stream2.addictradio.net/addictalternative.mp3 - Addict Radio Alternative - https://i3.radionomy.com/radios/200/16cb32ca-2a98-4295-8dbd-b5de2b131cca.jpg - Rock - - - http://stream1.addictradio.net/addictlounge.mp3 - Addict Radio Lounge - https://i3.radionomy.com/radios/200/72c47b14-9f76-4a9f-bda6-80789da84319.jpg - Lounge - - - https://stream2.addictradio.net/addictrock.mp3 - Addict Radio Rock - https://i3.radionomy.com/radios/200/0abfbfa3-7353-4c7d-b23f-1b6cedfc6391.jpg - Rock - - - https://stream2.addictradio.net/addictstar.mp3 - Addict Radio Star - https://i3.radionomy.com/radios/200/8a498861-fb74-4b81-be2d-8968e1fb8111.jpg - Hits - - - http://www.Live9.fr/ecoute/192.m3u - Addict Rock - https://i3.radionomy.com/radios/200/0abfbfa3-7353-4c7d-b23f-1b6cedfc6391.jpg - Rock - - - http://start-adofm.ice.infomaniak.ch/start-adofm-high.mp3 - Ado FM - https://images.lesindesradios.fr/fit-in/300x2000/filters:quality(100)/radios/adofm/images/logo_ly42bXnqql.png - Hip-hop - - - http://stream.laut.fm/albumradiosouvenirs - Album Radio Club - https://cdn.webradio.media/Images/28084-AR-Club-70-80-90-300x300.png - Dancefloor - - - http://d3-soundcast-edge-1.infomaniak.ch/alouette-high.mp3 - Alouette - https://images.lesindesradios.fr/fit-in/300x2000/filters:quality(100)/radios/alouette/images/logo.png - Hits - - - http://alpes1gap.ice.infomaniak.ch/alpes1gap-high.mp3 - Alpes 1 Alpes du Sud - http://alpesdusud.alpes1.com/media/option/logo.png - Hits - - - http://alpes1grenoble.ice.infomaniak.ch/alpes1grenoble-high.mp3 - Alpes 1 Grenoble - http://grandgrenoble.alpes1.com/media/option/logo.png - Hits - - - http://streaming.radionomy.com/Best---Radio?lang=fr-FR%2cfr%3bq%3d0.9%2cen-US%3bq%3d0.8%2cen%3bq%3d0.7%2cpt%3bq%3d0.6%2cnl%3bq%3d0.5 - Bestradio - https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/70/d6/117347/1/c175.png - Jazz - - - http://www.bide-et-musique.com/playlist-hq.m3u - Bide et Musique - https://i3.radionomy.com/radios/200/815857e5-5419-45f3-bd01-0fcd706ce2c1.jpg - Hits - - - https://bretagne5.streamakaci.com/bretagne5.mp3 - Bretagne 5 - https://www.bretagne5.fr/sites/bretagne5.fr/files/logo_0.png - News - - - https://secure-stream.c9.fr/c9radio-192.mp3 - C9 Radio - https://www.c9.fr/assets/c9.png - Pop - - - https://chantefrance.ice.infomaniak.ch/chantefrance-128.mp3 - Chante France - https://images.lesindesradios.fr/fit-in/300x2000/filters:quality(100)/radios/chante-france/images/logo_hcQoGGMTuD.png - Hits - - - http://radio5.pro-fhi.net:9027/ - Chic Radio Hits - https://www.radio.fr/images/broadcasts/38/dd/103311/1/c300.png - Hits - - - http://185.52.127.132/fr/30201/aac_64.mp3 - Chérie FM - https://players.nrjaudio.fm/live-metadata/player/img/player-files/cfm/logos/173x173/P_LOGO_CHERIE_BLOC_ROUGE-V1.png - Pop - - - https://listen.radioking.com/radio/245467/stream/289642 - Cocktail FM - https://www.cocktailfm.com/images/no-jaquette.jpg - Hits - - - https://radio-contact.ice.infomaniak.ch/radio-contact-high.mp3 - Contact FM - https://images.lesindesradios.fr/fit-in/300x2000/filters:quality(100)/radios/contactfm/images/logo.png - Hits - - - http://stream.srg-ssr.ch/m/couleur3/mp3_128 - Couleur 3 - https://i3.radionomy.com/radios/200/c031bd17-6000-4c73-8b9e-d2c4b61bf8e1.png - Hits - - - http://cristalfm.no-ip.biz:8000/ - Cristal FM - http://www.cristalfm.org/favicon-196.png - Hits - - - http://ridibundus.divergence-fm.org:8000/divergence.mp3 - Divergence FM - http://www.divergence-fm.org/divergencelogo.png - Pop - - - http://str30.creacast.com/ecn1 - ECN - https://images.lesindesradios.fr/fit-in/300x2000/filters:quality(100)/radios/radioecn/images/logo.png - Hits - - - https://ais-live.cloud-services.paris/europe1.mp3 - Europe 1 - https://cdn-europe1.lanmedia.fr/europe1/apple-touch-icon.png - News - - - https://evasion60e.ice.infomaniak.ch/evasion60e-128.mp3 - Evasion - https://www.evasionfm.com/assets/img/logo_evasion_big.png - Hits - - - https://radiofg.impek.com/max2.mp3 - FG 90's - https://ecouter.lesindesradios.net/logos/orange491.png - 90 - - - https://radiofg.impek.com/fge.mp3 - FG At Work - https://cdn.webrad.io/images/logos/ecouterradioenligne-com/fg-at-work.png - Lounge - - - https://radiofg.impek.com/fgc.mp3 - FG Chic - https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/97/6a/3171/4/c175.png - Lounge - - - https://radiofg.impek.com/fg6.mp3 - FG Club - https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/77/a8/22108/2/c175.png - Clubbing - - - https://radiofg.impek.com/fgd.mp3 - FG Deep Dance - https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/73/e5/3170/2/c175.png - Hits - - - https://radiofg.impek.com/max1.mp3 - FG Maxximum - https://ecouter.lesindesradios.net/logos/orange490.png - Hits - - - https://radiofg.impek.com/fg.mp3 - FG Radio FG - https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/7e/1d/1577/2/c175.png - Hits - - - https://radiofg.impek.com/ufg.mp3 - FG Underground - https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/95/d3/1578/2/c175.png - Electronic - - - https://icecast.radiofrance.fr/fip-hifi.aac - FIP - https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/fd/45/4234/c175.png - Blues - - - https://icecast.radiofrance.fr/fipelectro-midfi.mp3 - FIP Electro - https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/b0/49/103524/1/c175.png - Electronic - - - https://icecast.radiofrance.fr/fipgroove-midfi.mp3?ID=pd569ib97j - FIP Groove - https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/a4/5d/38217/2/c175.png - Groove - - - https://icecast.radiofrance.fr/fipjazz-midfi.mp3?ID=pd569ib97j - FIP Jazz - https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/36/24/38216/2/c175.png - Jazz - - - https://icecast.radiofrance.fr/fipworld-midfi.mp3?ID=pd569ib97j - FIP Monde - https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/91/7c/38218/2/c175.png - Lounge - - - https://icecast.radiofrance.fr/fipreggae-midfi.mp3?ID=pd569ib97j - FIP Reggae - https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/6f/78/103525/1/c175.png - Reggae - - - https://icecast.radiofrance.fr/fiprock-midfi.mp3?ID=pd569ib97j - FIP Rock - https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/e7/e8/38215/2/c175.png - Rock - - - http://icecast.radiofrance.fr/fb1071-midfi.mp3 - France Bleu - https://upload.wikimedia.org/wikipedia/fr/thumb/9/98/France_Bleu_logo_2015.svg/1200px-France_Bleu_logo_2015.svg.png - News - - - http://icecast.radiofrance.fr/franceculture-midfi.mp3 - France Culture - https://upload.wikimedia.org/wikipedia/fr/thumb/c/c9/France_Culture_-_2008.svg/1200px-France_Culture_-_2008.svg.png - News - - - http://icecast.radiofrance.fr/franceinfo-midfi.mp3 - France Info - https://upload.wikimedia.org/wikipedia/commons/thumb/0/03/Franceinfo.svg/510px-Franceinfo.svg.png - News - - - http://icecast.radiofrance.fr/franceinter-midfi.mp3 - France Inter - https://upload.wikimedia.org/wikipedia/fr/thumb/3/39/France_Inter_logo.svg/1200px-France_Inter_logo.svg.png - News - - - http://freqplus.ice.infomaniak.ch/freqplus-high.mp3 - Frequence Plus - https://dbs.radioline.fr/pictures/radio_ddcfaff132ad1be1a32b9ae001d5b9d1/logo200.jpg - Hits - - - http://ice.stream.frequence3.net/frequence3-128.mp3 - Fréquence 3 - https://www.frequence3.com/wp-content/uploads/2020/05/cropped-logo-site-f3-noir-6-2048x355.png - Hits - - - https://frequence3.net-radio.fr/frequence3gold.mp3 - Fréquence 3 GOLD - https://api2.frequence3.net/static/img/stations/horizontal/frequence3gold.png - 80 - - - https://frequence3.net-radio.fr/frequence3dance.mp3 - Fréquence 3 DANCE - https://api2.frequence3.net/static/img/stations/horizontal/frequence3dance.png - Dance - - - https://frequence3.net-radio.fr/frequence3urban-128.mp3 - Fréquence 3 URBAN - https://api2.frequence3.net/static/img/stations/horizontal/frequence3urban.png - Hip-hop - - - https://frequence3.net-radio.fr/frequence3world.mp3 - Fréquence 3 WORLD - https://api2.frequence3.net/static/img/stations/horizontal/frequence3world.png - Lounge - - - http://statslive.infomaniak.ch/playlist/frequencek/frequencek-128.mp3/playlist.m3u - Fréquence K - https://dbs.radioline.fr/pictures/radio_2eabe654d934373f924ab2d244de7935/logo200.jpg - Hits - - - http://icecast.rtl.fr:80/fun-1-44-128.mp3 - Fun Radio - https://cdn.onlineradiobox.com/img/logo/9/6239.v6.png - Hits - - - https://futuradiodance.ice.infomaniak.ch/frdance-128.mp3 - FutuRadio Dance - https://i3.radionomy.com/radios/200/d96d2fbb-410b-49f1-97a2-bb15a9482b9e.png - Electronic - - - https://futuradiohits.ice.infomaniak.ch/frhits-128.mp3 - FutuRadio Hits - https://i3.radionomy.com/radios/200/5b792cb5-190b-4ca2-a045-3e0e4c0034f0.png - Hits - - - https://futuradiopopsweet.ice.infomaniak.ch/frsweet-128.mp3 - FutuRadio Pop - https://i3.radionomy.com/radios/200/5b64f14a-35ba-4be1-9946-b7b797c118ac.png - Pop - - - https://futuradiorock.ice.infomaniak.ch/frrock-128.mp3 - FutuRadio Rock - https://i3.radionomy.com/radios/200/cf2d3005-6e03-4bd8-b2e2-afb0181444fd.png - Rock - - - https://futuradiorock.ice.infomaniak.ch/frurban-128.mp3 - FutuRadio Urban - http://cdn-profiles.tunein.com/s254136/images/logod.png - Hip-hop - - - http://80.82.229.202/graffiti.mp3 - Graffiti Urban Radio - https://i3.radionomy.com/radios/200/8909d2b8-a065-4337-9483-234ac29e70ce.jpg - News - - - https://player.hits1radio.com - Hit1 - https://cdn.webradio.media/Images/66886-1024.jpg - Hits - - - https://streamingp.shoutcast.com/hotmix-80s-fr-mp3 - Hot Mix Radio 80 - https://i3.radionomy.com/radios/200/2bf6e407-d028-4621-bc64-8964fa5e1d91.png - 80 - - - https://streamingp.shoutcast.com/hotmix-90s-fr-mp3 - Hot Mix Radio 90 - https://i3.radionomy.com/radios/200/b47f1666-c838-4231-ac36-ed1317d91d95.png - 90 - - - https://streamingp.shoutcast.com/hotmix-hits-fr-mp3 - Hot Mix Radio Hits - https://i3.radionomy.com/radios/200/8c5336b5-4818-4c22-80bc-874581587d1c.png - Hits - - - https://streamingp.shoutcast.com/hotmix-dance-fr-mp3 - Hot Mix Radio Dance - https://i3.radionomy.com/radios/200/dcdcdfeb-8e6c-4b4f-b9ac-9063a8909b37.png - Dance - - - http://streaming.radionomy.com/JamendoLounge - Jamendo lounge - https://i3.radionomy.com/404.s200.jpg - Lounge - - - http://eagle.streemlion.com:4171/stream - Kif Cool - http://www.kifradio.com/public/radios/player-png-140911141425.png - Pop - - - http://eagle.streemlion.com:4168/stream - Kif Radio - http://www.kifradio.com/public/radios/player-jpg-140911141400.jpg - Hits - - - http://eagle.streemlion.com:4180/stream - Kif Radio Hits - http://www.kifradio.com/public/radios/player-png-140911141635.png - Hits - - - http://eagle.streemlion.com:4183/stream - Kif Rock - http://www.kifradio.com/public/radios/player-png-140911141711.png - Rock - - - https://kissfm.ice.infomaniak.ch/kissfm-64.aac - Kiss FM - https://i3.radionomy.com/radios/200/a9dde2bb-7314-45ee-92ab-d4c6b165fc76.jpg - Hits - - - http://www.lagrosseradio.com/son/stream/192.m3u - La Grosse Radio - https://i3.radionomy.com/radios/200/60fc6a91-358e-4eb1-b112-c52dfee36fac.jpg - Rock - - - http://www.maxi80.com/ecoute/maxi80.m3u - Maxi 80 - https://i3.radionomy.com/radios/200/21916d71-53e8-43da-bc28-a8ff36fd27fb.jpg - 80 - - - https://maxxima.mine.nu/maxxima.mp3 - Maxxima - https://i3.radionomy.com/radios/200/4d0c49fa-4ebc-42dd-914f-26a9a988a2bb.png - Clubbing - - - http://direct.mouv.fr/live/mouv-midfi.mp3 - Mouv - https://i3.radionomy.com/radios/200/e90dfa5c-105a-456a-b69b-cf903a07a96d.jpg - Hip-hop - - - http://185.52.127.155/fr/30601/aac_64.mp3 - Nostalgie - https://players.nrjaudio.fm/live-metadata/player/img/600x/NOSTA-default_173_173.png - Hits - - - http://cdn.nrjaudio.fm/audio1/fr/40016/aac_64.mp3 - NRJ - https://ws.shoutcast.com/images/contacts/b/b19c/b19ccd7c-18af-43fe-aab4-8991024a659f/radios/d06a25da-31c9-4f39-812f-c76cd35cb9f7/d06a25da-31c9-4f39-812f-c76cd35cb9f7.png - Hits - - - http://listen.shoutcast.com/nrj.m3u - NRJ - Hit Music Only in Belgium - https://ws.shoutcast.com/images/contacts/b/b19c/b19ccd7c-18af-43fe-aab4-8991024a659f/radios/d06a25da-31c9-4f39-812f-c76cd35cb9f7/d06a25da-31c9-4f39-812f-c76cd35cb9f7.png - Hits - - - http://streaming.radionti.com/nti-hd.mp3.m3u - NTI - https://www.radionti.com/upload/design/5dd6aba2840dc2.95622307.png - Clubbing - - - http://ods-wr01.ice.infomaniak.ch/ods-wr01.mp3 - ODS Années 80 - https://www.odsradio.com/media/radio/thumb/100x100_512-ods-wr01.png - 80 - - - http://ods-wr03.ice.infomaniak.ch/ods-wr03.mp3 - ODS Années 90 - https://www.odsradio.com/media/radio/thumb/100x100_5e610120be846-ods-logo-rond-90.png - 90 - - - http://allzic13.ice.infomaniak.ch/allzic13.mp3 - ODS Fitness - https://www.odsradio.com/media/radio/thumb/100x100_ods-logo-rond-byallzic-fitness.png - Lounge - - - http://allzic44.ice.infomaniak.ch/allzic44.mp3 - ODS Live FR - https://www.odsradio.com/media/radio/thumb/100x100_ods-logo-rond-byallzic-livefr.png - Lounge - - - http://allzic21.ice.infomaniak.ch/allzic21.aac - ODS Lounge - https://www.odsradio.com/media/radio/thumb/100x100_ods-logo-rond-byallzic-lounge.png - Lounge - - - http://ods-wr02.ice.infomaniak.ch/ods-wr02.mp3 - ODS Pop Folk - https://www.odsradio.com/media/radio/thumb/100x100_5e3db2551275d-ods-logo-rond-byallzic-2016.png - Rock - - - http://allzic17.ice.infomaniak.ch/allzic17.mp3 - ODS Rock FM - https://www.odsradio.com/media/radio/thumb/100x100_ods-logo-rond-byallzic-rockfm.png - Rock - - - http://allzic22.ice.infomaniak.ch/allzic22.mp3 - ODS Top 10 - https://www.odsradio.com/media/radio/thumb/100x100_ods-logo-rond-byallzic-top10.png - Hits - - - https://ouifm.ice.infomaniak.ch/ouifm-high.mp3 - Oui FM - https://images.lesindesradios.fr/fit-in/300x2000/filters:quality(100)/radios/oui-fm/images/logo_of2SWOW1Wz.png - Hits - - - https://icecast.pulsradio.com/pulsHD.mp3 - PulsRadio - https://www.pulsradio.com/img/logo-pulsradio.png - Dance - - - https://icecast.pulsradio.com/magicradioHD.mp3 - PulsRadio 80 - https://www.pulsradio.com/img/logo-80.png - 80 - - - https://icecast.pulsradio.com/puls90HD.mp3 - PulsRadio 90 - https://www.pulsradio.com/img/logo-90.png - 90 - - - https://icecast.pulsradio.com/puls00HD.mp3 - PulsRadio 2000 - https://www.pulsradio.com/img/logo-2000.png - 90 - - - https://icecast.pulsradio.com/mxHD.mp3 - PulsRadio Club - https://www.pulsradio.com/img/logo-club.png - Clubbing - - - https://icecast.pulsradio.com/hitpartyHD.mp3 - PulsRadio Hits - https://www.pulsradio.com/img/logo-hitparty.png - Hits - - - https://icecast.pulsradio.com/relaxHD.mp3 - PulsRadio Lounge - https://www.pulsradio.com/img/logo-lounge.png - Lounge - - - https://icecast.pulsradio.com/pulstranceHD.mp3 - PulsRadio Trance - https://www.pulsradio.com/img/logo-trance.png - Trance - - - http://radio666.net:8000/666.mp3 - Radio 666 - http://www.radio666.com/wp-content/themes/radio666/images/logo-radio-666.png - Rock - - - http://players.creacast.com/creacast/classique/playlist.pls - Radio Classique - https://i3.radionomy.com/radios/200/b0e442d7-6114-40db-b158-5b1ad4b769dc.png - Classique - - - http://str45.streamakaci.com:8014 - Radio Flemme - https://i3.radionomy.com/radios/200/db55247b-c62d-4646-ab32-91ee496389d2.png - Hits - - - http://stream.radiometal.com:8010 - Radio Métal - https://i3.radionomy.com/radios/200/1d828876-7899-45a8-9004-7208ac538fd8.jpg - Metal - - - https://novazz.ice.infomaniak.ch/novazz-128.mp3 - Radio Nova - https://www.nova.fr/wp-content/themes/lnei-wp-theme-child-nova/dist/images/nova-default_342a3fb2.png - Hits - - - https://radiopulsar.ice.infomaniak.ch/radiopulsar-192.mp3 - Radio Pulsar - https://i3.radionomy.com/radios/200/b065bb49-a03f-48ff-8144-d30ed23f8ed9.png - Lounge - - - http://radiotopside.ice.infomaniak.ch/radiotopside-128.mp3 - Radio Top Side - https://i3.radionomy.com/radios/200/de615a7c-7c16-451c-ac58-d8f86ff31023.jpeg - Pop - - - http://listen.radionomy.com/vitamine-80 - Radio Vitamine - https://i3.radionomy.com/radios/200/64f37150-a7eb-4e31-88e5-bf105826c86a.jpg - 80 - - - https://stream.rfm.fr/rfm-wr15.aac - RFM - https://cdn-rfm.lanmedia.fr/bundles/rfmintegration/images/logoRFM.png - Hits - - - https://stream.rfm.fr/rfm-wr11.aac - RFM 100% Français - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/100-francais/50811-7-fre-FR/100-Francais.png - Lounge - - - https://stream.rfm.fr/rfm-wr16.aac - RFM 70's - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/rfm-70-s/67769-10-fre-FR/RFM-70-s.png - 70 - - - https://stream.rfm.fr/rfm-wr4.aac - RFM 80's - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/rfm-80-s/3281-3-fre-FR/RFM-80-s.png - 80 - - - https://stream.rfm.fr/rfm-wr1.aac - RFM Collector - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/rfm-collector/3275-3-fre-FR/RFM-Collector.png - Hits - - - https://stream.rfm.fr/rfm-wr8.aac - RFM Hits Party - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/rfm-hit-party/171024-19-fre-FR/RFM-Hit-Party.png - Hits - - - https://stream.rfm.fr/rfm-wr7.aac - RFM Le Hits - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/le-hit-rfm/3287-8-fre-FR/Le-HIT-RFM.png - Hits - - - https://stream.rfm.fr/rfm-wr3.aac - RFM La radio couleur - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/la-radio-couleur/19322-9-fre-FR/La-Radio-Couleur.png - Hits - - - https://stream.rfm.fr/rfm-wr6.aac - RFM Lounge - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/rfm-lounge/19264-1-fre-FR/RFM-Lounge.png - Lounge - - - https://stream.rfm.fr/rfm-wr14.aac - RFM Musique Fraiche - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/rfm-musique-fraiche/54039-11-fre-FR/RFM-Musique-Fraiche.png - Lounge - - - https://stream.rfm.fr/rfm-wr2.aac - RFM Night Fever - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/rfm-night-fever/3090-6-fre-FR/RFM-Night-Fever.png - Funk - - - https://stream.rfm.fr/rfm-wr12.aac - RFM New Wave - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/100-new-wave/30917-9-fre-FR/100-New-Wave.png - Hits - - - https://stream.rfm.fr/rfm-wr5.aac - RFM Party 90 - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/rfm-party-90/7598-1-fre-FR/RFM-Party-90.png - 90 - - - https://stream.rfm.fr/rfm-wr10.aac - RFM Pop Rock - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/rfm-pop-rock/19370-1-fre-FR/RFM-Pop-Rock.png - Pop - - - https://stream.rfm.fr/rfm-wr9.aac - RFM Run and Fit - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/run-fit/19356-1-fre-FR/Run-Fit.png - Pop - - - https://stream.rfm.fr/rfm-wr13.aac - RFM Slow - https://resize-rfm.lanmedia.fr/img/var/rfm/storage/images/programmes/les-webradios/rfm-slow/54053-1-fre-FR/RFM-Slow.png - Slow - - - http://185.52.127.155/fr/30401/aac_64.mp3?listenerid=a978bc03c59cbbe6cc2f7365363b2f9d&awparams=companionAds%3Atrue;playerid:&origine=playerrire - Rires et Chansons - https://players.nrjaudio.fm/live-metadata/player/img/200x/RIRE-default_173_173.png - News - - - https://audio.bfmtv.com/rmcradio_128.mp3 - RMC - https://i3.radionomy.com/radios/200/18950beb-a847-0d88-fa3c-e0d8e59e8049.jpg - News - - - https://icecast.rtl.fr/rtl-1-44-128 - RTL - https://static.rtl.fr/versions/www/6.0.945/img/apple-touch-icon-300x300-precomposed.png - News - - - https://icecast.rtl.fr/rtl2-1-44-128?listen=webAg4KDwgDCgkFBA4NBAQCCA - RTL 2 - https://ws.shoutcast.com/images/contacts/9/936c/936c7a47-fcec-477f-9440-743bfe57f1ce/radios/6795B2EC-DA03-4259-91BB-758935312469/6795B2EC-DA03-4259-91BB-758935312469.png - Hits - - - http://icecast.skyrock.net/s/natio_mp3_128k - Skyrock - https://i.skyrock.net/1589/23621589/pics/photo_23621589_24.gif - Hip-hop - - - http://tsfjazz.ice.infomaniak.ch/tsfjazz-high.mp3 - TSF Jazz - https://static.mytuner.mobi/media/tvos_radios/vdDEMNJrzp.png - Jazz - - - https://stream.virginradio.fr/virgin.128.aac/playlist.m3u8 - Virgin Radio - https://i3.radionomy.com/radios/200/48a8df4c-f063-4b46-8e1b-b5a1e65ed446.jpg - Hits - - - http://start-voltage.ice.infomaniak.ch/start-voltage-high.mp3 - Voltage - https://images.lesindesradios.fr/fit-in/300x2000/filters:format(webp)/filters:quality(100)/radios/voltage/images/logo_ExCzyMRb7o.jpeg - Hits - - - diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/extra/webtv2.m3u b/templates/.kodi/addons/plugin.video.vstream/resources/extra/webtv2.m3u deleted file mode 100644 index 4a666e6f..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/extra/webtv2.m3u +++ /dev/null @@ -1,48 +0,0 @@ -#EXTM3U -#EXTINF:-1 tvg-id="FRA1.kazer.org" tvg-name="France 1" tvg-logo="tf1.png" group-title="Generaliste",TF1 -[REGEX]"(http[^"]+)"[POSTFORM]udid=B85E0FCB-A255-48BD-9A71-3C1AB782A7BB&mediaId=L_TF1&appName=sdk%2FIphone%2F1.0&authKey=d7a5407b73696fc9b1e983c7be9009db%2F1409816606000&method=getLiveUrl[URL]http://api.wat.tv/services/Delivery - -#EXTINF:-1 tvg-id="FRA2.kazer.org" tvg-name="France 2" tvg-logo="france2.png" group-title="Generaliste",France 2 -[REGEX]{"url": "([^"]+)"}[URL]http://hdfauthftv-a.akamaihd.net/esi/TA?format=json&url=http%3A%2F%2Flive.francetv.fr%2Fsimulcast%2FFrance_2%2Fhls_v1%2Findex.m3u8&callback=_jsonp_loader_callback_request_2 - -#EXTINF:-1 tvg-id="FRA3.kazer.org" tvg-name="France 3" tvg-logo="france3.png" group-title="Generaliste",France 3 -[REGEX]{"url": "([^"]+)"}[URL]http://hdfauthftv-a.akamaihd.net/esi/TA?format=json&url=http%3A%2F%2Flive.francetv.fr%2Fsimulcast%2FFrance_3%2Fhls_v1%2Findex.m3u8&callback=_jsonp_loader_callback_request_2 - -#EXTINF:-1 tvg-id="FRA4.kazer.org" tvg-name="France 4" tvg-logo="france4.png" group-title="Generaliste",France 4 -[REGEX]{"url": "([^"]+)"}[URL]http://hdfauthftv-a.akamaihd.net/esi/TA?format=json&url=http%3A%2F%2Flive.francetv.fr%2Fsimulcast%2FFrance_4%2Fhls_v1%2Findex.m3u8&callback=_jsonp_loader_callback_request_2 - -#EXTINF:-1 tvg-id="FRA5.kazer.org" tvg-name="France 5" tvg-logo="france5.png" group-title="Generaliste",France 5 -[REGEX]{"url": "([^"]+)"}[URL]http://hdfauthftv-a.akamaihd.net/esi/TA?format=json&url=http%3A%2F%2Flive.francetv.fr%2Fsimulcast%2FFrance_5%2Fhls_v1%2Findex.m3u8&callback=_jsonp_loader_callback_request_2 - -#EXTINF:-1 tvg-id="FRA1.kazer.org" tvg-name="France O" tvg-logo="franceo.png" group-title="Generaliste",France O -[REGEX]{"url": "([^"]+)"}[URL]http://hdfauthftv-a.akamaihd.net/esi/TA?format=json&url=http%3A%2F%2Flive.francetv.fr%2Fsimulcast%2FFrance_O%2Fhls_v1%2Findex.m3u8&callback=_jsonp_loader_callback_request_2 - -#EXTINF:-1 tvg-id="ART1.kazer.org" tvg-name="Arte" tvg-logo="arte.png" group-title="Documentaire",Arte -http://artelive-lh.akamaihd.net/i/artelive_fr@344805/master.m3u8 - -#EXTINF:-1 tvg-id="GUL1.kazer.org" tvg-name="Gulli" tvg-logo="gulli.png" group-title="Jeunesse",Gulli -[REGEX]file: '([^']+master.m3u8)'[URL]http://replay.gulli.fr/jwplayer/embedstreamtv - -#EXTINF:-1 tvg-id="NRJ1.kazer.org" tvg-name="NRJ12" tvg-logo="nrj12.png" group-title="Generaliste",NRJ 12 -http://nrj-apple-live.adaptive.level3.net/apple/nrj/nrj/nrj12hi.m3u8 - -#EXTINF:-1 tvg-id="CSTAR.kazer.org" tvg-name="CStar" tvg-logo="cstar.png" group-title="Musique",CStar -https://www.dailymotion.com/cdn/live/video/x5gv5v0.m3u8?dvr=true&auth=1544287847-2690-f83ei1by-47e195fcdb70955ddd14e1b48bb1188b&redirect=0 - -#EXTINF:-1 tvg-id="C8.kazer.org" tvg-name="C8" tvg-logo="c8.png" group-title="Generaliste",C8 -https://www.dailymotion.com/cdn/live/video/x5gv5rr.m3u8?dvr=true&auth=1544290015-2690-2zy62iy0-a9bb7552b9e703cf92897102e73e935d&redirect=0 - -#EXTINF:-1 tvg-id="CANALPLUS.kazer.org" tvg-name="Canalplus" tvg-logo="canalplus.png" group-title="Generaliste",Canal + (en clair) -https://www.dailymotion.com/cdn/live/video/x5gv6be.m3u8?dvr=true&auth=1544290210-2690-p5u0v6zl-705ba025294d0b963e479d94afbb5b74&redirect=0 - -#EXTINF:-1 tvg-id="LCP.kazer.org" tvg-name="LCP" tvg-logo="lcp.png" group-title="Politque",LCP Assemblée nationale -[REGEX](http[^"]+)[URL]https://www.dailymotion.com/cdn/live/video/xgepjr.m3u8?auth=1544290796-2690-x24zggrf-6b20f9c339bee5de334887a09918d2cc&redirect=0 - -#EXTINF:-1 tvg-id="BFMTV.kazer.org" tvg-name="BFMTV" tvg-logo="bfm.png" group-title="Information",BFM TV -https://bfmtvalive1-a.akamaihd.net/9824d8182ef7475abb5cb41f0d2b71d0/eu-central-1/876450610001/dd257bd6bff64eccb0a29b54cc705a07/playlist_ssaiM.m3u8 - -#EXTINF:-1 tvg-id="BFMBuisness.kazer.org" tvg-name="BFM buisness" tvg-logo="bfmbus.png" group-title="Econimie",BFM Buisness -https://bfmbusisecure-i.akamaihd.net/hls/live/265375/876450612001/BFMBusinessS/playlist.m3u8 - -#EXTINF:-1 tvg-id="RMCDECOUVERTE.kazer.org" tvg-name="Rmc decouverte" tvg-logo="rmcdecouverte.png" group-title="Documentaire",RMC Decouverte -[POSTFORM]__nn__=5375862360001&hdnea=st=1544284800~exp=1544288400~acl=/i/*~hmac=e1d7c87c9c836fd50e3fee08b39320c339141596805739676e5cb5eddd176973[URL]https://nextmediahdslive-lh.akamaihd.net/i/RMCDECOUVERTE_KB@300868/master.m3u8 diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/1fichier.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/1fichier.py deleted file mode 100644 index a80a5512..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/1fichier.py +++ /dev/null @@ -1,173 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons - -import sys -import random -import re -import urllib3 - -from resources.hosters.hoster import iHoster -from resources.lib.comaddon import dialog, VSlog -from resources.lib.handler.premiumHandler import cPremiumHandler -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser - -UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0' - - -class cHoster(iHoster): - def __init__(self): - iHoster.__init__(self, '1fichier', '1FIchier', 'violet') - - def __getIdFromUrl(self, url): - # http://kzu0y3.1fichier.com/ - # https://1fichier.com/?s6gdceia9y - sId = url.replace('https://', '') - sId = sId.replace('http://', '') - sId = sId.replace('1fichier.com/?', '') - sId = sId.replace('.1fichier.com', '') - sId = sId.replace('/', '') - - return sId - - def getMediaLink(self): - self.oPremiumHandler = cPremiumHandler(self.getPluginIdentifier()) - print(self.oPremiumHandler.isPremiumModeAvailable()) - - if ('site=cDownload&function' not in sys.argv[2]) and not (self.oPremiumHandler.isPremiumModeAvailable()): - oDialog = dialog().VSok("Pas de streaming sans premium.\n" + - "Pour voir le film passer par l'option 'Télécharger et Lire' du menu contextuel.") - return False, False - - if self.oPremiumHandler.isPremiumModeAvailable(): - return self._getMediaLinkByPremiumUser() - else: - return self._getMediaLinkForGuest() - - def _getMediaLinkForGuest(self): - - api_call = False - url = 'https://1fichier.com/?' + self.__getIdFromUrl(self._url) - - adcode = random.uniform(000.000000000, 999.999999999) - - oRequestHandler = cRequestHandler(url) - oRequestHandler.setRequestType(1) - oRequestHandler.addHeaderEntry('Host', url.split('/')[2]) - oRequestHandler.addHeaderEntry('Referer', url) - oRequestHandler.addHeaderEntry('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8') - oRequestHandler.addHeaderEntry('User-Agent', UA) - oRequestHandler.addHeaderEntry('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3') - oRequestHandler.addHeaderEntry('Content-Type', 'application/x-www-form-urlencoded') - - oRequestHandler.addParameters('dl_no_ssl', 'on') - oRequestHandler.addParameters('adz', adcode) - sHtmlContent = oRequestHandler.request() - - # fh = open('c:\\test.txt', "w") - # fh.write(sHtmlContent) - # fh.close - - api_call = self.getMedialinkDL(sHtmlContent) - - if api_call: - return True, api_call - - return False, False - - def getMedialinkDL(self, sHtmlContent): - - oParser = cParser() - api_call = False - - sPattern = 'Vous devez attendre encore [0-9]+ minutes' - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0] is True: - dialog().VSinfo('Erreur - Limitation %s' % aResult[1][0]) - return False - - sPattern = '' - aResult = oParser.parse(sHtmlContent, sPattern) - - if aResult[0] is True: - # xbmc.sleep(1*1000) - # VSlog( aResult[1][0] ) - api_call = aResult[1][0] + '|User-Agent=' + UA # + '&Referer=' + self._url - return api_call - - return False - - def _getMediaLinkByPremiumUser(self): - api_call = False - - if not self.oPremiumHandler.Authentificate(): - return False, False - - url = 'https://1fichier.com/?' + self.__getIdFromUrl(self._url) - - ''' - La partie ci-dessous permet d'utiliser l'option "Forcer l'affichage du menu pour les téléchargements" permettant - notamment de choisir depuis l'interface web de télécharger ou d'ajouter un fichier. - Pour cela, on va ajouter le paramètre e=1 (cf. https://1fichier.com/hlp.html#dev ) à la requête permettant - d'obtenir le lien direct - ''' - - sHtmlContent = self.oPremiumHandler.GetHtml('%s&e=1' % url) - if sHtmlContent: - # L'option est désactivée : la réponse sera de type "text/plain; charset=utf-8", exemple : - # https://serveur-2b.1fichier.com/lelienactif;Film.de.Jacquie.et.Michel.a.la.montagne.mkv;1234567890;0 - m = re.search('^(.*);.*;.*;.*$', sHtmlContent) - if m: - url = m.group(1) - # L'option est activée : pour récupérer le lien direct il faut POSTer le formulaire demandant le download - else: - cookie = self.oPremiumHandler.AddCookies().replace('Cookie=', '', 1) - data = { - 'submit': 'download' - } - # Seul le Cookie est nécessaire, néanmoins autant rendre les headers cohérents - headers = {'User-Agent': UA, - 'Host': '1fichier.com', - 'Referer': url, - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'Accept-Language': 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3', - 'Cookie': cookie, - 'Content-Length': '15', - 'Content-Type': 'application/x-www-form-urlencoded' - } - try: - http = urllib3.PoolManager() - response = http.request(method='POST', url=url, fields=data, headers=headers) - except urllib3.exceptions.HTTPError as e: - VSlog(e.read()) - VSlog(e.reason) - # Par défaut on suit la redirection (code: 302 + entête 'Location') dans la réponse - # on peut ainsi récupérer le lien direct - url = response.geturl() - response.release_conn() - else: - return False, False - - # Mode = '' - # Mode = {'dl_no_ssl': 'on' , 'dlinline': 'on'} - # Mode = {'dl_no_ssl': 'on'} - # postdata = urlEncode(Mode) - - # Pas de page html mais lien direct - # sHtmlContent = self.oPremiumHandler.GetHtml(url, postdata) - # fh = open('c:\\test.txt', "w") - # fh.write(sHtmlContent) - # fh.close() - - # mode inline - # url = url + '&inline' - - api_call = url + '|' + self.oPremiumHandler.AddCookies() - - VSlog(api_call) - - if api_call: - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/1fichier.pyo b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/1fichier.pyo deleted file mode 100644 index eb5ba82f..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/1fichier.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/__init__.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/__init__.pyo b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/__init__.pyo deleted file mode 100644 index ef07dd3d..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/__init__.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/abcvideo.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/abcvideo.py deleted file mode 100644 index 080db1ac..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/abcvideo.py +++ /dev/null @@ -1,125 +0,0 @@ -# coding: utf-8 -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -# https://abcvideo.cc/embed-xxxxx.html' -# https://abcvideo.cc/xxxxx.html' -# pour récuperer le token : https://github.com/addon-lab/addon-lab_resolver_Project adapté pour evoload -# mais meme principe - -import re -import requests -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster -from resources.lib.comaddon import dialog - -UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:70.0) Gecko/20100101 Firefox/70.0' - - -class cHoster(iHoster): - def __init__(self): - iHoster.__init__(self, 'abcvideo', 'Abcvideo') - - def _getMediaLinkForGuest(self): - api_call = '' - key = "6LcOeuUUAAAAANS5Gb3oKwWkBjOdMXxqbj_2cPCy" - co = "aHR0cHM6Ly9hYmN2aWRlby5jYzo0NDM." - loc = "https://abcvideo.cc" - sUrlPlayer = "https://abcvideo.cc/dl" - - urlcode = self._url.replace('embed-', '') - urlcode = urlcode.replace('.html', '') - code = urlcode.split('/')[-1] - - headers1 = {'user-agent': UA, - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8' - } - - headers2 = {'user-agent': UA, - 'Accept': '*/*', - 'Content-Type': 'text/plain; charset=UTF-8', - 'Referer': self._url - } - - s = requests.session() - s.get(self._url, headers=headers1) - - bvalid, token = get_token(key, co, loc) - if bvalid: - url2 = sUrlPlayer + '?op=video_src&file_code=' + code + '&g-recaptcha-response=' + token - req = s.get(url2, headers=headers2) - response = str(req.content) - - sPattern = '"(https.+?)"' - aResult = re.findall(sPattern, response) - if aResult: - api_call = aResult[0] # fichier master valide pour la lecture - req = s.get(api_call, headers=headers2) - response = str(req.content) - list_url = [] - list_q = [] - oParser = cParser() - sPattern = 'PROGRAM.*?BANDWIDTH.*?RESOLUTION=(\d+x\d+).*?(https.*?m3u8)' - aResult = oParser.parse(response, sPattern) - if aResult[0] is True: - for aEntry in aResult[1]: - list_url.append(aEntry[1]) - list_q.append(aEntry[0]) - if list_url: - api_call = dialog().VSselectqual(list_q, list_url) - - if api_call: - return True, api_call - - return False, False - - -def get_token(site_key, co, loc): - - sa = '' - cb = '365ae0il5lwn' - headers1 = {'user-agent': UA, - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8', - 'Referer': loc - } - - url1 = 'https://www.google.com/recaptcha/api.js' - s = requests.session() - req = s.get(url1, headers=headers1) - data = req.text - - aresult = re.findall("releases\/(.*?)\/", data) - if aresult: - v = aresult[0] - else: - return False, False - url2 = "https://www.google.com/recaptcha/api2/anchor?ar=1&k=" + site_key + "&co=" + co - url2 += "&hl=ro&v=" + v + "&size=invisible&cb=" + cb - - req = s.get(url2) - data = req.text - data = data.replace('\x22', '') - aresult = re.findall("recaptcha-token.*?=(.*?)>", data) - - if aresult: - c = aresult[0] - else: - return False, False - - url3 = "https://www.google.com/recaptcha/api2/reload?k=" + site_key - - post_data = {'v': v, 'reason': 'q', 'k': site_key, 'c': c, 'sa': sa, 'co': co} - - headers2 = {'user-agent': UA, - 'Accept': '*/*', - 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8', - 'Referer': url2 - } - - req_url3 = s.post(url3, data=post_data, headers=headers2) - data = req_url3.text - aresult = re.findall("resp\",\"(.*?)\"", data) - if aresult: - token = aresult[0] - return True, token - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/alldebrid.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/alldebrid.py deleted file mode 100644 index 341e77f7..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/alldebrid.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -# Ovni-crea -import json - -from resources.lib.handler.premiumHandler import cPremiumHandler -from resources.lib.handler.requestHandler import cRequestHandler -from resources.hosters.hoster import iHoster -from resources.lib.comaddon import VSlog - - -class cHoster(iHoster): - def __init__(self): - iHoster.__init__(self, 'alldebrid', 'Alldebrid', 'violet') - - def _getMediaLinkForGuest(self): - token_Alldebrid = cPremiumHandler(self.getPluginIdentifier()).getToken() - if token_Alldebrid: - sUrl_Bypass = "https://api.alldebrid.com/v4/link/unlock?agent=service&version=1.0-&apikey=" + \ - token_Alldebrid + "&link=" + self._url - else: - return False, False - - oRequest = cRequestHandler(sUrl_Bypass) - sHtmlContent = json.loads(oRequest.request()) - - if 'error' in sHtmlContent: - if sHtmlContent['error']['code'] == 'LINK_HOST_NOT_SUPPORTED': - # si alldebrid ne prend pas en charge ce type de lien, on retourne le lien pour utiliser un autre hoster - return False, self._url - else: - VSlog('Hoster Alldebrid - Error: ' + sHtmlContent["error"]['code']) - return False, False - - api_call = HostURL = sHtmlContent["data"]["link"] - try: - mediaDisplay = HostURL.split('/') - VSlog('Hoster Alldebrid - play : %s/ ... /%s' % ('/'.join(mediaDisplay[0:3]), mediaDisplay[-1])) - except: - VSlog('Hoster Alldebrid - play : ' + HostURL) - - if api_call: - # api_call = api_call + '|User-Agent=Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) ' + \ - # 'Gecko/20100101 Firefox/39.0' - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/allow_redirects.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/allow_redirects.py deleted file mode 100644 index 8c8e751f..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/allow_redirects.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -from resources.hosters.hoster import iHoster -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.gui.hoster import cHosterGui - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'allow_redirects', 'redirection') - - def _getMediaLinkForGuest(self): - oRequestHandler = cRequestHandler(self._url) - oRequestHandler.request() - sHosterUrl = oRequestHandler.getRealUrl() - - if sHosterUrl and sHosterUrl != self._url: - oHoster = cHosterGui().checkHoster(sHosterUrl) - if oHoster: - oHoster.setUrl(sHosterUrl) - api_call = oHoster.getMediaLink() - - if api_call[0] is True: - return True, api_call[1] - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/allow_redirects.pyo b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/allow_redirects.pyo deleted file mode 100644 index 95b72a3d..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/allow_redirects.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/aparat.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/aparat.py deleted file mode 100644 index fdb5656e..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/aparat.py +++ /dev/null @@ -1,78 +0,0 @@ -# -*- coding: utf-8 -*- -# https://github.com/Kodi-vStream/venom-xbmc-addons -# https://aparat.cam/embed-xxxxx.html - -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster -from resources.lib.comaddon import dialog - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'aparat', 'Aparat') - - def _getMediaLinkForGuest(self): - VideoType = 2 # dl mp4 lien existant non utilisé ici - VideoType = 1 # m3u8 - - list_q = [] - list_url = [] - - if VideoType == 1: - oRequestHandler = cRequestHandler(self._url) - sHtmlContent = oRequestHandler.request() - - oParser = cParser() - sPattern = 'src:\s+"([^"]+)' - aResult = oParser.parse(sHtmlContent, sPattern) - - if aResult[0] is True: - url2 = aResult[1][0] - oRequestHandler = cRequestHandler(url2) - sHtmlContent2 = oRequestHandler.request() - - # prend tous les formats (peu créer problèmes CODECS avc1) - # sPattern = 'RESOLUTION=(\w+).+?(https.+?m3u8)' - - # limite les formats - sPattern = 'PROGRAM-ID.+?RESOLUTION=(\w+).+?(https.+?m3u8)' - aResult = oParser.parse(sHtmlContent2, sPattern) - for aEntry in aResult[1]: - list_q.append(aEntry[0]) - list_url.append(aEntry[1]) # parfois lien de meme qualité avec url différentes - - if list_url: - api_call = dialog().VSselectqual(list_q, list_url) - if api_call: - return True, api_call - - if VideoType == 2: - oRequestHandler = cRequestHandler(self._url) - sHtmlContent = oRequestHandler.request() - - oParser = cParser() - sPattern = 'file_code=(\w+)&hash=([^&]+)' - aResult = oParser.parse(sHtmlContent, sPattern) - - if aResult[0] is True: - resultId = aResult[1][0][0] - resultHash = aResult[1][0][1] - url = 'https://aparat.cam/dl?op=download_orig&id=' + resultId + \ - '&mode=0&hash=' + resultHash # + '&embed=1&adb=0' - data = 'op=download_orig&id=' + resultId + '&mode=n&hash=' + resultHash - oRequestHandler = cRequestHandler(url) - oRequestHandler.setRequestType(1) - oRequestHandler.addHeaderEntry('Referer', url) - oRequestHandler.addParametersLine(data) - sHtmlContent = oRequestHandler.request() - - sPattern = 'href="([^"]+.mp4)' - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0] is True: - api_call = aResult[1][0] - if api_call: - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/archive.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/archive.py deleted file mode 100644 index b89a54b3..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/archive.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'archive', 'Archive') - - def _getMediaLinkForGuest(self): - api_call = '' - - oParser = cParser() - oRequest = cRequestHandler(self._url) - sHtmlContent = oRequest.request() - - sPattern = 'otakufr - -from resources.lib.handler.requestHandler import cRequestHandler -from resources.hosters.hoster import iHoster -from resources.lib.parser import cParser - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'cloudhost', 'Cloudhost') - - def _getMediaLinkForGuest(self, api_call=None): - oRequest = cRequestHandler(self._url) - sHtmlContent = oRequest.request() - - sPattern = '(.+?)' - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0] is True: - stri = cPacker().unpack(aResult[1][0]) - sPattern = 'file:"([^"]+)",label:"([0-9]+)"}' - aResult = oParser.parse(stri, sPattern) - if aResult[0] is True: - url = [] - qua = [] - - for aEntry in aResult[1]: - url.append(aEntry[0]) - qua.append(aEntry[1][:3] + '*' + aEntry[1][3:]) - - api_call = dialog().VSselectqual(qua, url) - - if api_call: - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/evoload.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/evoload.py deleted file mode 100644 index 8a29fda4..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/evoload.py +++ /dev/null @@ -1,60 +0,0 @@ -# coding: utf-8 -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -# https://evoload.io/e/xxxxxx - -import re -import requests - -from resources.hosters.hoster import iHoster - -UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:70.0) Gecko/20100101 Firefox/70.0' - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'evoload', 'Evoload') - - def _getMediaLinkForGuest(self): - api_call = '' - sUrlSecurePlayer = "https://evoload.io/SecurePlayer" - - code = self._url.split('/')[-1] - - headers = {'User-Agent': UA, - 'Accept': 'application/json, text/plain, */*', - 'Origin': 'https://evoload.io', - 'Referer': 'https://evoload.io/' - } - - headers1 = {'user-agent': UA, - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8' - } - - headers2 = {'user-agent': UA, - 'Accept': 'Accept: application/json, text/plain, */*', - 'Content-Type': 'application/json;charset=utf-8', - 'Referer': self._url - } - - s = requests.session() - - crsv = requests.get('https://csrv.evosrv.com/captcha?m412548', headers=headers).text - - html = s.get(self._url, headers=headers1).text - passe = re.search('
', html).group(1) - - post = '{"code":"' + code + '","csrv_token":"'+crsv+'","pass":"' + passe + '","token":"ok"}' - - req = s.post(sUrlSecurePlayer, data=post, headers=headers2) - response = str(req.content) - - sPattern = 'stream.+?src.+?"(https.+?)"' - aResult = re.findall(sPattern, response) - if aResult: - api_call = aResult[0] - - if api_call: - return True, api_call + '|User-Agent=' + UA - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/facebook.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/facebook.py deleted file mode 100644 index 19b12046..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/facebook.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster -from resources.lib.comaddon import dialog - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'facebook', 'Facebook') - - def _getMediaLinkForGuest(self): - - qua = [] - url = [] - api_call = '' - - oRequest = cRequestHandler(self._url) - sHtmlContent = oRequest.request() - sPattern = '((?:h|s)d)_src:"([^"]+)"' - oParser = cParser() - aResult = oParser.parse(sHtmlContent, sPattern) - - if aResult[0] is True: - for aEntry in aResult[1]: - qua.append(str(aEntry[0])) - url.append(str(aEntry[1])) - - # dialogue qualité - api_call = dialog().VSselectqual(qua, url) - - if api_call: - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/filepup.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/filepup.py deleted file mode 100644 index 843d329b..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/filepup.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'filepup', 'FilePup') - - def _getMediaLinkForGuest(self): - oRequestHandler = cRequestHandler(self._url) - # oRequestHandler.addParameters('login', '1') - sHtmlContent = oRequestHandler.request() - - oParser = cParser() - sPattern = 'type: "video\/mp4", *src: "([^<>"{}]+?)"' - aResult = oParser.parse(sHtmlContent, sPattern) - - if aResult[0] is True: - return True, aResult[1][0] - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/filetrip.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/filetrip.py deleted file mode 100644 index ed7aaf31..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/filetrip.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# https://github.com/Kodi-vStream/venom-xbmc-addons -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'filetrip', 'Filetrip') - - def reformat(self, url): - url = url.replace('http://filetrip.net/', '') - url = url.replace('embed?', '') - url = 'http://filetrip.net/embed?' + str(url) - return url - - def _getMediaLinkForGuest(self): - # lien deja decode - if self._url[-4] == '.': - return True, self._url - - # Sinon on decode - self._url = self.reformat(self._url) - - oRequest = cRequestHandler(self._url) - sHtmlContent = oRequest.request() - - sPattern = "file': '(.+?)'," - oParser = cParser() - aResult = oParser.parse(sHtmlContent, sPattern) - - if aResult[0] is True: - return True, aResult[1][0] - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/flashx.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/flashx.py deleted file mode 100644 index eb6471e5..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/flashx.py +++ /dev/null @@ -1,430 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -# - -try: # Python 2 - import urllib2 - from urllib2 import URLError as UrlError - from urllib2 import HTTPError as HttpError - -except ImportError: # Python 3 - import urllib.request as urllib2 - from urllib.error import URLError as UrlError - from urllib.error import HTTPError as HttpError - -import re - -from resources.hosters.hoster import iHoster -from resources.lib.comaddon import dialog, VSlog -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.packer import cPacker -from resources.lib.parser import cParser - -# Remarque : meme code que vodlocker - -UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0' - - -def ASCIIDecode(string): - i = 0 - l = len(string) - ret = '' - while i < l: - c = string[i] - if string[i:(i + 2)] == '\\x': - c = chr(int(string[(i + 2):(i + 4)], 16)) - i += 3 - if string[i:(i + 2)] == '\\u': - cc = int(string[(i + 2):(i + 6)], 16) - if cc > 256: - # ok c'est de l'unicode, pas du ascii - return '' - c = chr(cc) - i += 5 - ret = ret + c - i = i + 1 - - return ret - - -def getHtml(url, headers): - request = urllib2.Request(url, None, headers) - reponse = urllib2.urlopen(request) - sCode = reponse.read() - reponse.close() - - return sCode - - -def unlockUrl(url2=None): - headers9 = { - 'User-Agent': UA, - 'Referer': 'https://www.flashx.co/dl?playthis' - } - - url1 = 'https://www.flashx.co/js/code.js' - if url2: - url1 = url2 - - if not url1.startswith('http'): - url1 = 'https:' + url1 - - VSlog('Test unlock url :' + url1) - - oRequest = cRequestHandler(url1) - oRequest.addParameters('User-Agent', UA) - # oRequest.addParameters('Accept', '*/*') - # oRequest.addParameters('Accept-Encoding', 'gzip, deflate, br') - # oRequest.addParameters('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3') - oRequest.addParameters('Referer', 'https://www.flashx.co/dl?playthis') - code = oRequest.request() - - url = '' - if not code: - url = oRequest.getRealUrl() - VSlog('Redirection :' + url) - else: - # VSlog(code) - aResult = re.search("!= null\){\s*\$.get\('([^']+)', *{(.+?)}", code, re.DOTALL) - if aResult: - dat = aResult.group(2) - dat = dat.replace("'", '') - dat = dat.replace(" ", '') - - dat2 = dict(x.split(':') for x in dat.split(',')) - - dat3 = aResult.group(1) + '?' - for i, j in dat2.items(): - dat3 = dat3 + str(i) + '=' + str(j) + '&' - - url = dat3[:-1] - - # url = 'https://www.flashx.tv/flashx.php?fxfx=6' - - if url: - VSlog('Good Url :' + url1) - VSlog(url) - getHtml(url, headers9) - return True - - VSlog('Bad Url :' + url1) - - return False - - -def loadLinks(htmlcode): - VSlog('Scan des liens') - - host = 'https://www.flashx.tv' - sPattern = '[\("\'](https*:)*(\/[^,"\'\)\s]+)[\)\'"]' - aResult = re.findall(sPattern, htmlcode, re.DOTALL) - - # VSlog(str(aResult)) - for http, urlspam in aResult: - sUrl = urlspam - - if http: - sUrl = http + sUrl - - sUrl = sUrl.replace('/\/', '//') - sUrl = sUrl.replace('\/', '/') - - # filtrage mauvaise url - if (sUrl.count('/') < 2) or ('<' in sUrl) or ('>' in sUrl) or (len(sUrl) < 15): - continue - if '[' in sUrl or ']' in sUrl: - continue - if '.jpg' in sUrl or '.png' in sUrl: - continue - - # VSlog('test : ' + sUrl) - - if '\\x' in sUrl or '\\u' in sUrl: - sUrl = ASCIIDecode(sUrl) - if not sUrl: - continue - - if sUrl.startswith('//'): - sUrl = 'http:' + sUrl - - if sUrl.startswith('/'): - sUrl = host + sUrl - - # Url ou il ne faut pas aller - if 'dok3v' in sUrl: - continue - - # pour test - if ('.js' not in sUrl) or ('.cgi' not in sUrl): - continue - # if 'flashx' in sUrl: - # continue - - headers8 = {'User-Agent': UA, - 'Referer': 'https://www.flashx.tv/dl?playthis' - } - - try: - request = urllib2.Request(sUrl, None, headers8) - reponse = urllib2.urlopen(request) - sCode = reponse.read() - reponse.close() - # VSlog('Worked ' + sUrl) - except HttpError as e: - if not e.geturl() == sUrl: - try: - headers9 = { - 'User-Agent': UA, - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'Accept-Language': 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3', - 'Accept-Encoding': 'gzip, deflate, br' - } - request = urllib2.Request(e.geturl().replace('https', 'http'), None, headers9) - reponse = urllib2.urlopen(request) - sCode = reponse.read() - reponse.close() - # VSlog('Worked ' + sUrl) - except HttpError as e: - VSlog(str(e.code)) - # VSlog(e.read()) - VSlog('Redirection Blocked ' + sUrl + ' Red ' + e.geturl()) - else: - # VSlog('Blocked ' + sUrl) - VSlog(str(e.code)) - VSlog('>>' + e.geturl()) - VSlog(e.read()) - - VSlog('fin des unlock') - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'flashx', 'FlashX') - - def getRedirectHtml(self, web_url, sId, NoEmbed=False): - headers = { - # 'Host': 'www.flashx.tv', - 'User-Agent': UA, - # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - # 'Accept-Language': 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3', - 'Referer': 'http://embed.flashx.tv/embed.php?c=' + sId, - 'Accept-Encoding': 'identity' - } - - MaxRedirection = 3 - while MaxRedirection > 0: - - # generation headers - # headers2 = headers - # headers2['Host'] = self.getHost(web_url) - - VSlog(str(MaxRedirection) + ' Test sur : ' + web_url) - request = urllib2.Request(web_url, None, headers) - - redirection_target = web_url - - try: - # ok ca a enfin marche - reponse = urllib2.urlopen(request) - sHtmlContent = reponse.read() - reponse.close() - - if reponse.geturl() != web_url and reponse.geturl() != '': - redirection_target = reponse.geturl() - else: - break - except UrlError as e: - if (e.code == 301) or (e.code == 302): - redirection_target = e.headers['Location'] - else: - # VSlog(str(e.code)) - # VSlog(str(e.read())) - return False - - web_url = redirection_target - - if 'embed' in redirection_target and NoEmbed: - # rattage, on a pris la mauvaise url - VSlog('2') - return False - - MaxRedirection = MaxRedirection - 1 - - return sHtmlContent - - def __getIdFromUrl(self, url): - sPattern = "https*:\/\/((?:www.|play.)?flashx.+?)\/(?:playvid-)?(?:embed-)?(?:embed.+?=)?" + \ - "(-*[0-9a-zA-Z]+)?(?:.html)?" - oParser = cParser() - aResult = oParser.parse(url, sPattern) - if aResult[0] is True: - return aResult[1][0][1] - - return '' - - def getHost(self, url): - oParser = cParser() - sPattern = 'https*:\/\/(.+?)\/' - aResult = oParser.parse(url, sPattern) - if aResult[0]: - return aResult[1][0] - return '' - - def setUrl(self, url): - self._url = 'http://' + self.getHost(url) + '/embed.php?c=' + self.__getIdFromUrl(url) - - def _getMediaLinkForGuest(self): - api_call = False - - oParser = cParser() - - # on recupere le host actuel - HOST = self.getHost(self._url) - - # on recupere l'ID - sId = self.__getIdFromUrl(self._url) - if sId == '': - VSlog("Id prb") - return False, False - - # on ne garde que les chiffres - # sId = re.sub(r'-.+', '', sId) - - # on cherche la vraie url - sHtmlContent = self.getRedirectHtml(self._url, sId) - - # fh = open('c:\\test.txt', "w") - # fh.write(sHtmlContent) - # fh.close() - - sPattern = 'href=["\'](https*:\/\/www\.flashx[^"\']+)' - AllUrl = re.findall(sPattern, sHtmlContent, re.DOTALL) - # VSlog(str(AllUrl)) - - # Disabled for the moment - # if False: - # if AllUrl: - # # Need to find which one is the good link - # # Use the len don't work - # for i in AllUrl: - # if i[0] == '': - # web_url = i[1] - # else: - # return False,False - # else: - # web_url = AllUrl[0] - - web_url = AllUrl[0] - - # Requests to unlock video - # unlock fake video - loadLinks(sHtmlContent) - # unlock bubble - unlock = False - url2 = re.findall('["\']([^"\']+?\.js\?cache.+?)["\']', sHtmlContent, re.DOTALL) - if not url2: - VSlog('No special unlock url find') - for i in url2: - unlock = unlockUrl(i) - if unlock: - break - - if not unlock: - VSlog('No special unlock url working') - return False, False - - # get the page - sHtmlContent = self.getRedirectHtml(web_url, sId, True) - - if sHtmlContent is False: - VSlog('Passage en mode barbare') - # ok ca a rate on passe toutes les url de AllUrl - for i in AllUrl: - if not i == web_url: - sHtmlContent = self.getRedirectHtml(i, sId, True) - if sHtmlContent: - break - - if not sHtmlContent: - return False, False - - if 'reload the page!' in sHtmlContent: - # VSlog("page bloquée") - - # On recupere la bonne url - sGoodUrl = web_url - - # on recupere la page de refresh - sPattern = 'reload the page!
!! ' - aResult = re.findall(sPattern, sHtmlContent) - if not aResult: - return False, False - sRefresh = aResult[0] - - # on recupere le script de debloquage - sPattern = "" - # aResult = oParser.parse(sHtmlContent, sPattern) - - aResult = re.search('(eval\(function.*?)\s*', sHtmlContent, re.DOTALL) - - if aResult.group(1): - sJavascript = aResult.group(1) - - # sUnpacked = cJsUnpacker().unpackByString(sJavascript) - sUnpacked = cPacker().unpack(sJavascript) - - return sUnpacked - - return False - - def _getMediaLinkForGuest(self): - oRequest = cRequestHandler(self._url) - sHtmlContent = oRequest.request() - - sUnpacked = self.__getUrlFromJavascriptCode(sHtmlContent) - - # jwplayer("vplayer").setup({sources:[ - # {file:"http://94.242.57.154/l7z7fz25dmnhgn4vfkbbeauaqogvhaabb62mkm4zvaxq3iodhdvlahybe6sa/v.flv",label:"SD"}], - # image:"http://94.242.57.154/i/03/00249/d8g74g00wtuv.jpg",skin:"",duration:"5314",width:680,height:390, - # primary:"flash",startparam:"start",plugins:{"http://letwatch.us/player6/lightsout.js - - sPattern = 'sources:\[{file:"(.+?)"' - - oParser = cParser() - aResult = oParser.parse(sUnpacked, sPattern) - - if aResult[0] is True: - api_call = aResult[1][0] - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/lien_direct.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/lien_direct.py deleted file mode 100644 index 38dd0684..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/lien_direct.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -import re - -from resources.lib.handler.requestHandler import cRequestHandler -from resources.hosters.hoster import iHoster -from resources.lib.comaddon import dialog -from resources.lib.util import urlEncode, Quote - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'lien_direct', 'Lien direct') - - def setUrl(self, url): - self._url = str(url).replace('+', '%20') # un lien direct n'est pas forcement urlEncoded - - def _getMediaLinkForGuest(self): - api_call = self._url - - if ('hds.' in api_call) or ('bidzen' in api_call): - UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:70.0) Gecko/20100101 Firefox/70.0' - api_call = api_call + '|User-Agent=' + UA + '&referer=' + self._url - - # full moviz lien direct final nowvideo - if 'zerocdn.to' in api_call: - UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0' - api_call = api_call + '|User-Agent=' + UA - - # Special pour mangacity - if 'pixsil' in api_call: - api_call = api_call.split('|')[0] + '|Referer=http://www.mangacity.org/jwplayer/player.swf' - - # Modif pr aliez - if 'aplayer1.me' in api_call: - UA = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0' - api_call = api_call + '|User-Agent=' + UA - - if 'sport7' in api_call: - UA = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0' - api_call = api_call + '|User-Agent=' + UA + '&referer=' + self._url - - # Special pour toonanime. - if 'toonanime' in api_call: - oRequest = cRequestHandler(api_call) - oRequest.addHeaderEntry('Referer', 'https://lb.toonanime.xyz/') - sHtmlContent = oRequest.request() - - aResult = re.findall(',RESOLUTION=(.+?)\n(.+?).m3u8', sHtmlContent) - # initialisation des tableaux - url = [] - qua = [] - # Remplissage des tableaux - for i in aResult: - url.append(str(i[1]) + '.m3u8') - qua.append(str(i[0])) - - headers = { - "User-Agent": Quote("Mozilla/5.0 (Linux; Android 6.0.1; SM-G930V Build/MMB29M) " + - "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.89 Mobile Safari/537.36"), - "Referer": "https://lb.toonanime.xyz/" - } - - # Affichage du tableau - api_call = "http://127.0.0.1:2424?u=https://lb.toonanime.xyz" + dialog().VSselectqual(qua, url) + \ - "@" + urlEncode(headers) - - if api_call: - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/lien_direct.pyo b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/lien_direct.pyo deleted file mode 100644 index f7f9090d..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/lien_direct.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/mailru.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/mailru.py deleted file mode 100644 index 9d5b8440..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/mailru.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons - -try: # Python 2 - import urllib2 - from urllib2 import URLError as UrlError - -except ImportError: # Python 3 - import urllib.request as urllib2 - from urllib.error import URLError as UrlError - -from resources.hosters.hoster import iHoster -from resources.lib.parser import cParser -from resources.lib.comaddon import dialog - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'mailru', 'MailRu') - - def _getMediaLinkForGuest(self): - api_call = False - - UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0' - - headers = {"User-Agent": UA} - - req1 = urllib2.Request(self._url, None, headers) - resp1 = urllib2.urlopen(req1) - sHtmlContent = resp1.read() - resp1.close() - - sPattern = '{"metadataUrl":"([^"]+)",' - oParser = cParser() - aResult = oParser.parse(sHtmlContent, sPattern) - - vurl = 'http://my.mail.ru/' + aResult[1][0] - - req = urllib2.Request(vurl, None, headers) - - try: - response = urllib2.urlopen(req) - except UrlError as e: - print(e.read()) - print(e.reason) - - data = response.read() - head = response.headers - response.close() - - # get cookie - cookies = '' - if 'Set-Cookie' in head: - oParser = cParser() - sPattern = '(?:^|,) *([^;,]+?)=([^;,\/]+?);' - aResult = oParser.parse(str(head['Set-Cookie']), sPattern) - # print(aResult) - if aResult[0] is True: - for cook in aResult[1]: - cookies = cookies + cook[0] + '=' + cook[1] + ';' - - sPattern = '{"url":"([^"]+)",.+?"key":"(\d+p)"}' - aResult = oParser.parse(data, sPattern) - if aResult[0] is True: - # initialisation des tableaux - url = [] - qua = [] - # Remplissage des tableaux - for i in aResult[1]: - url.append(str(i[0])) - qua.append(str(i[1])) - - # Affichage du tableau - api_call = dialog().VSselectqual(qua, url) - - if api_call: - return True, 'http:' + api_call + '|User-Agent=' + UA + '&Cookie=' + cookies - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/megadrive.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/megadrive.py deleted file mode 100644 index 345dc26d..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/megadrive.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -from resources.lib.handler.requestHandler import cRequestHandler -from resources.hosters.hoster import iHoster -from resources.lib.parser import cParser - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'megadrive', 'Megadrive') - - def _getMediaLinkForGuest(self): - api_call = False - - oRequest = cRequestHandler(self._url) - sHtmlContent = oRequest.request() - oParser = cParser() - sPattern = " 1: - dialog2 = xbmcgui.Dialog() - ret = dialog2.select('Select Quality', qua) - if ret > -1: - api_call = url[ret] - - if api_call: - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/mystream.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/mystream.py deleted file mode 100644 index f3a3b99e..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/mystream.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- coding: utf-8 -*- -# https://github.com/Kodi-vStream/venom-xbmc-addons -import re - -from resources.lib.handler.requestHandler import cRequestHandler -from resources.hosters.hoster import iHoster - -UA = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0' - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'mystream', 'MyStream') - - def setUrl(self, url): - self._url = str(url).replace('https://mystream.to/watch/', 'https://embed.mystream.to/') - - def _getMediaLinkForGuest(self): - oRequest = cRequestHandler(self._url) - oRequest.addHeaderEntry('User-Agent', UA) - oRequest.addHeaderEntry('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8') - sHtmlContent = oRequest.request() - - api_call = False - - sPattern = '(\$=.+?;)\s*<' - aResult = re.search(sPattern, sHtmlContent, re.DOTALL) - if aResult: - decoded = temp_decode(aResult.group(1)) - if decoded: - r = re.search("setAttribute\(\'src\', *\'([^']+)\'\)", decoded, re.DOTALL) - if r: - api_call = r.group(1) - - if api_call: - return True, api_call + '|User-Agent=' + UA + '&Referer=' + self._url + '&Origin=https://embed.mystream.to' - - return False, False - - -def temp_decode(data): - startpos = data.find('"\\""+') + 5 - endpos = data.find('"\\"")())()') - - first_group = data[startpos:endpos] - - pos = re.search(r"(\(!\[\]\+\"\"\)\[.+?\]\+)", first_group) - if pos: - first_group = first_group.replace('$.__+', 't').replace('$._+', 'u').replace('$._$+', 'o') - - tmplist = [] - js = re.search(r'(\$={.+?});', data) - if js: - js_group = js.group(1)[3:][:-1] - second_group = js_group.split(',') - - i = -1 - for x in second_group: - a, b = x.split(':') - - if b == '++$': - i += 1 - tmplist.append(("$.{}+".format(a), i)) - - elif b == '(![]+"")[$]': - tmplist.append(("$.{}+".format(a), 'false'[i])) - - elif b == '({}+"")[$]': - tmplist.append(("$.{}+".format(a), '[object Object]'[i])) - - elif b == '($[$]+"")[$]': - tmplist.append(("$.{}+".format(a), 'undefined'[i])) - - elif b == '(!""+"")[$]': - tmplist.append(("$.{}+".format(a), 'true'[i])) - - tmplist = sorted(tmplist, key=lambda z: str(z[1])) - for x in tmplist: - first_group = first_group.replace(x[0], str(x[1])) - - first_group = first_group.replace('\\"', '\\').replace("\"\\\\\\\\\"", "\\\\")\ - .replace('\\"', '\\').replace('"', '').replace("+", "") - first_group = re.sub('(\(\!\[\]\)\[.+?\]+)', 'l', first_group) - try: - final_data = first_group.encode('ascii').decode('unicode-escape').encode('ascii')\ - .decode('unicode-escape') - return final_data - except: - return False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/mystream.pyo b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/mystream.pyo deleted file mode 100644 index 87fc75a8..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/mystream.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/myvi.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/myvi.py deleted file mode 100644 index 91b821f2..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/myvi.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -# https://www.myvi.tv/embed/xxxxxxxxx -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster -from resources.lib.util import Unquote - -UA = 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36' - - -class cHoster(iHoster): - def __init__(self): - iHoster.__init__(self, 'myvi', 'Myvi') - - def _getMediaLinkForGuest(self): - api_call = '' - oParser = cParser() - - oRequest = cRequestHandler(self._url) - sHtmlContent = oRequest.request().replace('\\u0026', '&') - cookies = oRequest.GetCookies()# + ";" - - sPattern = 'CreatePlayer.+?v=(.+?)&tp' - - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0] is True: - api_call = Unquote(aResult[1][0]) - if api_call: - return True, api_call + '|User-Agent=' + UA + '&Referer=' + self._url + '&Cookie=' + cookies - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/netu.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/netu.py deleted file mode 100644 index beb73adb..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/netu.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# https://github.com/Kodi-vStream/venom-xbmc-addons -# test film strem vk 1er page dark higlands & tous ces enfants m'appartiennent -import re - -from resources.hosters.hoster import iHoster -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser - -UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:72.0) Gecko/20100101 Firefox/72.0' - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'netu', 'Netu') - - def setUrl(self, url): - self._url = url.replace('https', 'http') - self._url = self._url.replace('http://netu.tv/', 'http://hqq.tv/') - self._url = self._url.replace('http://waaw.tv/', 'http://hqq.tv/') - self._url = self._url.replace('http://vizplay.icu/', 'http://hqq.tv/') - self._url = self._url.replace('http://hqq.tv/player/hash.php?hash=', - 'http://hqq.tv/player/embed_player.php?vid=') - self._url = self._url.replace('http://hqq.tv/watch_video.php?v=', 'http://hqq.tv/player/embed_player.php?vid=') - - def __getIdFromUrl(self): - sPattern = 'https*:\/\/hqq\.(?:tv|player|watch)\/player\/embed_player\.php\?vid=([0-9A-Za-z]+)' - oParser = cParser() - aResult = oParser.parse(self._url, sPattern) - - if aResult[0] is True: - return aResult[1][0] - return '' - - def isDownloadable(self): - return False - - def _getMediaLinkForGuest(self): - ids = self.__getIdFromUrl() - - hqqUrl = 'http://hqq.tv/player/embed_player.php?vid=' + ids + '&autoplay=no' - - oRequestHandler = cRequestHandler(hqqUrl) - oRequestHandler.addHeaderEntry('User-Agent', UA) - html = oRequestHandler.request() - - vid = re.search("videokeyorig *= *\'(.+?)\'", html, re.DOTALL).group(1) - - url = "time=1&ver=0&secure=0&adb=0%2F&v={}&token=>=&embed_from=0&wasmcheck=1".format(vid) - - oRequestHandler = cRequestHandler('https://hqq.tv/player/get_md5.php?' + url) - oRequestHandler.addHeaderEntry('User-Agent', UA) - oRequestHandler.addHeaderEntry('Accept', '*/*') - oRequestHandler.addHeaderEntry('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3') - oRequestHandler.addHeaderEntry('x-requested-with', 'XMLHttpRequest') - oRequestHandler.addHeaderEntry('Referer', hqqUrl) - # ok - - oRequestHandler.request() - api_call = oRequestHandler.getRealUrl() - - if api_call: - return True, api_call + '.mp4.m3u8' + '|User-Agent=' + UA - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/netu.pyo b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/netu.pyo deleted file mode 100644 index 3edd0260..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/netu.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/ninjastream.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/ninjastream.py deleted file mode 100644 index 812ac418..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/ninjastream.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons - -from resources.lib.handler.requestHandler import cRequestHandler -from resources.hosters.hoster import iHoster - -UA = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' + \ - 'Chrome/83.0.4103.116 Safari/537.36' - - -class cHoster(iHoster): - def __init__(self): - iHoster.__init__(self, 'ninjastream', 'NinjaStream') - - # facultatif mais a laisser pour compatibilitee - # Extraction du lien et decodage si besoin - def _getMediaLinkForGuest(self): - oRequestHandler = cRequestHandler("https://ninjastream.to/api/video/get") - oRequestHandler.setRequestType(1) - oRequestHandler.addHeaderEntry('Referer', self._url) - oRequestHandler.addHeaderEntry('User-Agent', UA) - oRequestHandler.addHeaderEntry('X-Requested-With', 'XMLHttpRequest') - oRequestHandler.addHeaderEntry('Origin', 'https://{0}'.format(self._url.split('/')[2])) - oRequestHandler.addJSONEntry('id', self._url.split('/')[4]) - sHtmlContent = oRequestHandler.request(jsonDecode=True) - - api_call = sHtmlContent['result']['playlist'] - - if api_call: - # Rajout d'un header ? - # api_call = api_call + '|User-Agent=Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) ' + \ - # 'Gecko/20100101 Firefox/39.0' - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/ninjastream.pyo b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/ninjastream.pyo deleted file mode 100644 index e6b4d60a..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/ninjastream.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/ok_ru.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/ok_ru.py deleted file mode 100644 index ebba93c3..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/ok_ru.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -# - -try: # Python 2 - import urllib2 -except ImportError: # Python 3 - import urllib.request as urllib2 - -import json -import requests - -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster -from resources.lib.comaddon import dialog -from resources.lib.util import cUtil - - -class cHoster(iHoster): - def __init__(self): - iHoster.__init__(self, 'ok_ru', 'Ok.ru') - - def getHostAndIdFromUrl(self, sUrl): - sPattern = 'https*:\/\/.*?((?:(?:ok)|(?:odnoklassniki))\.ru)\/.+?\/([0-9]+)' - oParser = cParser() - aResult = oParser.parse(sUrl, sPattern) - if aResult[0] is True: - return aResult[1][0] - return '' - - def _getMediaLinkForGuest(self): - v = self.getHostAndIdFromUrl(self._url) - sId = v[1] - sHost = v[0] - web_url = 'http://' + sHost + '/videoembed/' + sId - - HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0', - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'} - - St=requests.Session() - sHtmlContent = St.get(web_url).content.decode('utf-8') - oParser = cParser() - - sHtmlContent = oParser.abParse(sHtmlContent, 'data-options=', '" data-player-container', 14) - sHtmlContent = cUtil().removeHtmlTags(sHtmlContent) - sHtmlContent = cUtil().unescape(sHtmlContent) - - page = json.loads(sHtmlContent) - page = json.loads(page['flashvars']['metadata']) - if page: - url = [] - qua = [] - for x in page['videos']: - url.append(x['url']) - qua.append(x['name']) - - # Si au moins 1 url - if url: - # dialogue qualité - api_call = dialog().VSselectqual(qua, url) - - if api_call: - api_call = api_call + '|Referer=' + self._url - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/onevideo.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/onevideo.py deleted file mode 100644 index 2994ce9f..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/onevideo.py +++ /dev/null @@ -1,58 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster -from resources.lib.util import Unquote - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'onevideo', 'Onevideo') - - def __getIdFromUrl(self): - sPattern = "id=([^<]+)" - oParser = cParser() - aResult = oParser.parse(self._url, sPattern) - if aResult[0] is True: - return aResult[1][0] - - return '' - - def __getKey(self): - oRequestHandler = cRequestHandler(self._url) - sHtmlContent = oRequestHandler.request() - sPattern = 'key: "(.+?)";' - oParser = cParser() - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0] is True: - aResult = aResult[1][0].replace('.', '%2E') - return aResult - return '' - - def setUrl(self, url): - self._url = str(url) - self._url = self._url.replace('http://www.onevideo.to/', '') - self._url = self._url.replace('embed.php?id=', '') - self._url = 'http://www.onevideo.to/embed.php?id=' + str(self._url) - - def _getMediaLinkForGuest(self): - # api_call = ('http://www.nowvideo.sx/api/player.api.php?key=%s&file=%s') % - # (self.__getKey(), self.__getIdFromUrl()) - api_call = ('http://www.onevideo.to/api/player.api.php?user=undefined&codes=1&file=%s' + - '&pass=undefined&key=%s') % (self.__getIdFromUrl(), self.__getKey()) - - oRequest = cRequestHandler(api_call) - sHtmlContent = oRequest.request() - - sPattern = 'url=(.+?)&title' - oParser = cParser() - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0] is True: - stream_url = Unquote(aResult[1][0]) - return True, stream_url - else: - return False, False - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/onlystream.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/onlystream.py deleted file mode 100644 index 23aef98b..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/onlystream.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster -from resources.lib.packer import cPacker -from resources.lib.comaddon import dialog - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'onlystream', 'OnlyStream') - - def _getMediaLinkForGuest(self): - api_call = False - - oParser = cParser() - oRequest = cRequestHandler(self._url) - sHtmlContent = oRequest.request() - - sPattern = '(?:file|src): *"([^"]+)"[^{}<>]+?(?:, *label: *"([^"]+)")*}' - aResult = oParser.parse(sHtmlContent, sPattern) - - if aResult[0] is True: - api_call = aResult[1][0][0] - - else: - sPattern = '(\s*eval\s*\(\s*function\(p,a,c,k,e(?:.|\s)+?)<\/script>' - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0] is True: - sHtmlContent = cPacker().unpack(aResult[1][0]) - - sPattern = '(?:file|src): *"([^"]+)"[^{}<>]+?(?:, *label: *"([^"]+)")*}' - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0] is True: - url = [] - qua = [] - for i in aResult[1]: - url.append(str(i[0])) - if len(i) > 1: - q = str(i[1]) - qua.append(q) - else: - q = "Inconnu" - qua.append(q) - - api_call = dialog().VSselectqual(qua, url) - - if api_call: - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/pdj.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/pdj.py deleted file mode 100644 index f2d1ce91..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/pdj.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'pdj', 'Promo DJ') - - def _getMediaLinkForGuest(self): - api_call = False - - oRequest = cRequestHandler(self._url) - sHtmlContent = oRequest.request() - - oParser = cParser() - sPattern = '.+?href="(.+?)" ambatitle="Download podcast">' - aResult = oParser.parse(sHtmlContent, sPattern) - - if aResult[0]: - api_call = aResult[1][0] - - if api_call: - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/playreplay.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/playreplay.py deleted file mode 100644 index b4ab1851..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/playreplay.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons - -try: # Python 2 - import urllib2 - from urllib2 import URLError as UrlError - -except ImportError: # Python 3 - import urllib.request as urllib2 - from urllib.error import URLError as UrlError - -import re - -from resources.hosters.hoster import iHoster -from resources.lib.util import urlEncode - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'playreplay', 'PlayReplay') - - def __getIdFromUrl(self, sUrl): - sPattern = 'http:..playreplay.net\/framevideo\/(.+?)\?' - aResult = re.findall(sPattern, sUrl) - if aResult: - return aResult[0] - - return '' - - def _getMediaLinkForGuest(self): - vUrl = False - sId = self.__getIdFromUrl(self._url) - - query_args = {'r': '["tVL0gjqo5",["preview/flv_image",{"uid":"' + sId + '"}],' + - '["preview/flv_link",{"uid":"' + sId + '"}]]'} - - data = urlEncode(query_args) - headers = {'User-Agent': 'Mozilla 5.10'} - url = 'http://api.letitbit.net' - request = urllib2.Request(url, data, headers) - - try: - reponse = urllib2.urlopen(request) - except UrlError as e: - print(e.read()) - print(e.reason) - - html = reponse.read() - - sHtmlContent = html.replace('\\', '') - - link = re.findall('"link":"(.+?)"', sHtmlContent) - if link: - vUrl = link[0] - - # print(vUrl) - - if vUrl: - api_call = vUrl - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/playtube.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/playtube.py deleted file mode 100644 index 9cd7847e..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/playtube.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -# https://playtube.ws/embed-xxxxx.html -import re - -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster -from resources.lib.comaddon import dialog -from resources.lib.packer import cPacker - -UA = 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36' - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'playtube', 'Playtube') - - def _getMediaLinkForGuest(self): - oRequestHandler = cRequestHandler(self._url) - sHtmlContent = oRequestHandler.request() - - sPattern2 = '(\s*eval\s*\(\s*function(?:.|\s)+?\)\)\))' - aResult = re.findall(sPattern2, sHtmlContent) - list_url = [] - list_qua = [] - if aResult: - str2 = aResult[0] - if not str2.endswith(';'): - str2 = str2 + ';' - - strs = cPacker().unpack(str2) - oParser = cParser() - sPattern = '(https.+?.m3u8)' - aResult = re.findall(sPattern, strs) - if aResult: - urlhost = aResult[0] - oRequestHandler = cRequestHandler(urlhost) - oRequestHandler.addHeaderEntry('User-Agent', UA) - oRequestHandler.addHeaderEntry('Referer', self._url) - sHtmlContent2 = oRequestHandler.request() - oParser = cParser() - sPattern = 'PROGRAM.*?BANDWIDTH.*?RESOLUTION=(\d+x\d+).*?(https.*?m3u8)' - aResult = oParser.parse(sHtmlContent2, sPattern) - if aResult[0] is True: - for aEntry in aResult[1]: - list_url.append(aEntry[1]) - list_qua.append(aEntry[0]) - - api_call = dialog().VSselectqual(list_qua, list_url) - - if api_call: - return True, api_call + '|User-Agent=' + UA + '&Referer=' + self._url - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/plynow.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/plynow.py deleted file mode 100644 index 7d94b83f..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/plynow.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -# http://uqload.com/embed-xxx.html - -import re -try: - import urllib.parse as urllib -except: - import urllib - -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster -UA = 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36' - - -class cHoster(iHoster): - def __init__(self): - iHoster.__init__(self, 'plynow', 'Plynow') - - def _getMediaLinkForGuest(self): - oParser = cParser() - - oRequest = cRequestHandler(self._url) - sHtmlContent = oRequest.request() - - # On récupere l'array - sPattern = '' - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0]: - for i in aResult[1]: - # Bon evidement la jai pris "48-" mais ca change surement - if '48-' in i: - url2 = i - break - else: - VSlog('err id1') - return False - - if not url2: - VSlog('err url2') - return False - - oRequest = cRequestHandler(url2) - oRequest.addHeaderEntry('User-Agent', UA) - sHtmlContent = oRequest.request() - - sPattern = 'client_id:"([^"]+)"' - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0]: - sId = aResult[1][0] - else: - VSlog('err id2') - return False - - # Need track - TrackUrl = 'https://api-v2.soundcloud.com/tracks?ids=' + n + '&client_id=' + sId - VSlog('TrackUrl : ' + TrackUrl) - oRequest = cRequestHandler(TrackUrl) - oRequest.addHeaderEntry('User-Agent', UA) - sHtmlContent = oRequest.request() - sPattern = 'soundcloud:tracks:([^"]+\/)stream' - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0]: - sTrack = aResult[1][0] - else: - VSlog('err tracks') - return False - - jsonurl = 'https://api-v2.soundcloud.com/media/soundcloud:tracks:' + sTrack + 'stream/hls?client_id=' + sId - VSlog('jsonurl : ' + jsonurl) - - oRequest = cRequestHandler(jsonurl) - oRequest.addHeaderEntry('User-Agent', UA) - sHtmlContent = oRequest.request() - - # fh = open('c:\\test.txt', 'w') - # fh.write(sHtmlContent) - # fh.close() - - json_string = json.loads(sHtmlContent) - api_call = json_string['url'] - - if api_call: - return True, api_call + '|User-Agent=' + UA - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/speedvid.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/speedvid.py deleted file mode 100644 index cab59668..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/speedvid.py +++ /dev/null @@ -1,189 +0,0 @@ -# coding: utf-8 -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -import re - -from resources.hosters.hoster import iHoster -from resources.lib.comaddon import VSlog -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.jsparser import JsParser -from resources.lib.packer import cPacker -from resources.lib.parser import cParser - -UA = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0' - - -class cHoster(iHoster): - def __init__(self): - iHoster.__init__(self, 'speedvid', 'Speedvid') - - def __getHost(self): - parts = self._url.split('//', 1) - host = parts[0] + '//' + parts[1].split('/', 1)[0] - return host - - def _getMediaLinkForGuest(self): - oRequest = cRequestHandler(self._url.replace('sn', 'embed')) - oRequest.addHeaderEntry('User-Agent', UA) - oRequest.addHeaderEntry('Host', 'www.speedvid.net') - sHtmlContent = oRequest.request() - - # suppression commentaires - sHtmlContent = re.sub(r'', '', sHtmlContent) - - oParser = cParser() - - # fh = open('c:\\test0.txt', "w") - # fh.write(sHtmlContent) - # fh.close() - - # decodage de la page html - sHtmlContent3 = sHtmlContent - code = '' - maxboucle = 10 - while maxboucle > 0: - VSlog('loop : ' + str(maxboucle)) - sHtmlContent3 = checkCpacker(sHtmlContent3) - sHtmlContent3 = checkAADecoder(sHtmlContent3) - - maxboucle = maxboucle - 1 - - sHtmlContent = sHtmlContent3 - - VSlog('fini') - - # fh = open('c:\\test.txt', "w") - # fh.write(sHtmlContent) - # fh.close() - - realurl = '' - - red = re.findall('location.href *= *[\'"]([^\'"]+)', sHtmlContent) - if red: - realurl = red[0] - else: - VSlog("2") - red = re.findall('location\.assign *\( *"([^"]+)" \)', sHtmlContent) - if red: - realurl = red[0] - - if 'speedvid' not in realurl: - realurl = self.__getHost() + realurl - - if not realurl.startswith('http'): - realurl = 'http:' + realurl - - if not realurl: - VSlog("mauvaise redirection") - return False, False - - VSlog('Real url>> ' + realurl) - - oRequest = cRequestHandler(realurl) - oRequest.addHeaderEntry('User-Agent', UA) - oRequest.addHeaderEntry('Referer', self._url) - - sHtmlContent = oRequest.request() - - # fh = open('c:\\test.txt', "w") - # fh.write(sHtmlContent) - # fh.close() - - api_call = '' - - sPattern = '(eval\(function\(p,a,c,k,e(?:.|\s)+?\)\))<' - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0] is True: - for packed in aResult[1]: - sHtmlContent = cPacker().unpack(packed) - sHtmlContent = sHtmlContent.replace('\\', '') - if "jwplayer('vplayer').setup" in sHtmlContent: - sPattern2 = "{file:.([^']+.mp4)" - aResult2 = oParser.parse(sHtmlContent, sPattern2) - if aResult2[0] is True: - api_call = aResult2[1][0] - break - - else: - sPattern = "file\s*:\s*\'([^\']+.mp4)" - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0] is True: - api_call = aResult[1][0] - - VSlog('API_CALL: ' + api_call) - - if api_call: - api_call = api_call + '|User-Agent=' + UA # + #'|Host=' + api_call.replace('http://','').rsplit('/', 2)[0] - - return True, api_call - - return False, False -# ********************************************************************************************************************* - - -def checkCpacker(strToPack): - sPattern = '>([^>]+\(p,a,c,k,e(?:.|\s)+?\)\)\s*)<' - aResult = re.search(sPattern, strToPack, re.DOTALL | re.UNICODE) - if aResult: - # VSlog('Cpacker encryption') - str2 = aResult.group(1) - - if not str2.endswith(';'): - str2 = str2 + ';' - - # if not str2.startswith('eval'): - # str2 = 'eval(function' + str2[4:] - - # Me demandez pas pourquoi mais si je l'affiche pas en log, ca freeze ????? - # VSlog(str2) - - try: - tmp = cPacker().unpack(str2) - # tmp = tmp.replace("\\'", "'") - except: - tmp = '' - - # VSlog(tmp) - - return strToPack[:(aResult.start() + 1)] + tmp + strToPack[(aResult.end()-1):] - - return strToPack - - -# def checkJJDecoder(str): - -# sPattern = '([a-z]=.+?\(\)\)\(\);)' -# aResult = re.search(sPattern, str, re.DOTALL | re.UNICODE) -# if (aResult): -# VSlog('JJ encryption') -# tmp = JJDecoder(aResult.group(0)).decode() - -# return str[:aResult.start()] + tmp + str[aResult.end():] - -# return str - - -def checkAADecoder(stringToDecode): - aResult = re.search('([>;]\s*)(゚ω゚.+?\(\'_\'\);)', str, re.DOTALL | re.UNICODE) - if aResult: - VSlog('AA encryption') - - # tmp = aResult.group(1) + AADecoder(aResult.group(2)).decode() - - JP = JsParser() - liste_var = [] - - try: - js_code = aResult.group(2) - - try: - js_code = unicode(js_code, "utf-8") - except Exception: - js_code = str(js_code) - - tmp = JP.ProcessJS(js_code, liste_var) - tmp = JP.LastEval.decode('string-escape').decode('string-escape') - - return stringToDecode[:aResult.start()] + tmp + stringToDecode[aResult.end():] - except Exception: - return '' - return stringToDecode diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/speedvideo.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/speedvideo.py deleted file mode 100644 index 21d40f0e..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/speedvideo.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons - -try: # Python 2 - import urllib2 - -except ImportError: # Python 3 - import urllib.request as urllib2 - -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster -from resources.lib.comaddon import VSlog - -UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:61.0) Gecko/20100101 Firefox/61.0' - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'speedvideo', 'Speedvideo') - - def isDownloadable(self): - return False - - def setUrl(self, url): - self._url = str(url) - sPattern = 'https*:\/\/speedvideo.[a-z]{3}\/(?:embed-)?([0-9a-zA-Z]+)' - oParser = cParser() - aResult = oParser.parse(url, sPattern) - if aResult[0] is True: - self._url = 'https://speedvideo.net/embed-' + aResult[1][0] + '.html' - else: - VSlog('ID error') - - def _getMediaLinkForGuest(self): - api_call = False - - oRequest = cRequestHandler(self._url) - sHtmlContent = oRequest.request() - sPattern = 'var linkfile\s*=\s*"([^"]+)"' - - oParser = cParser() - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0] is True: - sUrl = aResult[1][0] - - class NoRedirection(urllib2.HTTPErrorProcessor): - def http_response(self, request, response): - return response - - https_response = http_response - - opener = urllib2.build_opener(NoRedirection) - opener.addheaders = [('User-Agent', UA)] - opener.addheaders = [('Referer', self._url)] - response = opener.open(sUrl) - if response.code == 301 or response.code == 302: - api_call = response.headers['Location'] - - response.close() - - if api_call: - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/stagevu.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/stagevu.py deleted file mode 100644 index 37ca8bf0..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/stagevu.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons - -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'stagevu', 'Stagevu') - - def _getMediaLinkForGuest(self): - oRequest = cRequestHandler(self._url) - sHtmlContent = oRequest.request() - - sPattern = '> embed depreciated - sPattern = '(?:play/|video/|embed\?videoid=|vid=)([0-9]+)' - oParser = cParser() - aResult = oParser.parse(sUrl, sPattern) - if aResult[0] is True: - return aResult[1][0] - - return '' - - def _getMediaLinkForGuest(self): - api_call = '' - url = [] - qua = [] - sId = self.__getIdFromUrl(self._url) - - sUrl = 'https://api.tune.pk/v3/videos/' + sId - - oRequest = cRequestHandler(sUrl) - oRequest.addHeaderEntry('User-Agent', UA) - oRequest.addHeaderEntry('X-KEY', '777750fea4d3bd585bf47dc1873619fc') - oRequest.addHeaderEntry('X-REQ-APP', 'web') # pour les mp4 - oRequest.addHeaderEntry('Referer', self._url) # au cas ou - sHtmlContent1 = oRequest.request() - - if sHtmlContent1: - sHtmlContent1 = cUtil().removeHtmlTags(sHtmlContent1) - sHtmlContent = cUtil().unescape(sHtmlContent1) - - content = json.loads(sHtmlContent) - - content = content["data"]["videos"]["files"] - - if content: - for x in content: - if 'Auto' in str(content[x]['label']): - continue - url2 = str(content[x]['file']).replace('index', str(content[x]['label'])) - - url.append(url2) - qua.append(repr(content[x]['label'])) - - api_call = dialog().VSselectqual(qua,url) - - if api_call: - return True, api_call + '|User-Agent=' + UA - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/tune.pyo b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/tune.pyo deleted file mode 100644 index 26109f12..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/tune.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/up2stream.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/up2stream.py deleted file mode 100644 index a4da41af..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/up2stream.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons - -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.lib.packer import cPacker -from resources.hosters.hoster import iHoster - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'up2stream', 'Up2Stream') - - def _getMediaLinkForGuest(self): - api_call = False - - oRequest = cRequestHandler(self._url) - sHtmlContent = oRequest.request() - - oParser = cParser() - sPattern = '(eval\(function\(p,a,c,k,e(?:.|\s)+?\))<\/script>' - - aResult = oParser.parse(sHtmlContent, sPattern) - - if aResult[0] is True: - sHtmlContent = cPacker().unpack(aResult[1][0]) - - sPattern = '\("src","([^"]+)"\)' - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0]: - api_call = aResult[1][0] - - if api_call: - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uplea.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uplea.py deleted file mode 100644 index 3f237c09..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uplea.py +++ /dev/null @@ -1,98 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons - -import sys -try: # Python 2 - import urllib2 - -except ImportError: # Python 3 - import urllib.request as urllib2 - -import xbmc - -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster -from resources.lib.comaddon import dialog - - -class cHoster(iHoster): - def __init__(self): - iHoster.__init__(self, 'uplea', 'Uplea', 'violet') - - def getMediaLink(self): - if 'site=cDownload&function' not in sys.argv[2]: - oDialog = dialog().VSok("ATTENTION, Pas de streaming sans premium\n" + - "Pour voir le film passer par l'option 'Télécharger et Lire' du menu contextuel.") - return False, False - return self._getMediaLinkForGuest() - - def _getMediaLinkForGuest(self): - # http:///dl/12345XXYEEEEREERERE - - UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0' - headers = {'User-Agent': UA, - 'Host': 'uplea.com', - # 'Referer': self._url , - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'Accept-Language': 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3' - # 'Content-Type': 'application/x-www-form-urlencoded' - } - - req = urllib2.Request(self._url, None, headers) - response = urllib2.urlopen(req) - sHtmlContent = response.read() - head = response.headers - response.close() - - oParser = cParser() - - # get step - urlstep = '' - sPattern = '' - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0] is True: - urlstep = aResult[1][0] - - # get cookie - cookies = '' - if 'Set-Cookie' in head: - cookies = head['Set-Cookie'] - sPattern = '(__cfduid=[0-9a-z]+;).+?(PHPSESSID=[0-9a-z]+)' - aResult = oParser.parse(str(cookies), sPattern) - if aResult[0] is True: - cookies = str(aResult[1][0][0]) + str(aResult[1][0][1]) - - url = 'http://uplea.com' + urlstep - - headers['Cookie'] = cookies - headers['Referer'] = self._url - - req = urllib2.Request(url, None, headers) - response = urllib2.urlopen(req) - sHtmlContent = response.read() - head = response.headers - response.close() - - # fh = open('c:\\test.txt', "w") - # fh.write(sHtmlContent) - # fh.close() - - # waiting time - waitingtime = 20 - sPattern = "ulCounter\({'timer':([0-9]+)}\);" - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0] is True: - waitingtime = int(aResult[1][0]) + 2 - - sPattern = '' - aResult = oParser.parse(sHtmlContent, sPattern) - - if aResult[0] is True: - dialog.VSinfo('Waiting time', self._displayName, waitingtime) - xbmc.sleep(waitingtime*1000) - - # print(aResult[1][0]) - - return True, aResult[1][0] + '|User-Agent=' + UA # + '&Referer=' + self._url - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uploaded.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uploaded.py deleted file mode 100644 index 747333d5..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uploaded.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -from resources.hosters.hoster import iHoster -from resources.lib.comaddon import dialog -from resources.lib.handler.premiumHandler import cPremiumHandler - -UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0' - - -class cHoster(iHoster): - def __init__(self): - iHoster.__init__(self, 'uploaded', 'Uploaded', 'violet') - - def getMediaLink(self): - self.oPremiumHandler = cPremiumHandler(self.getPluginIdentifier()) - print(self.oPremiumHandler.isPremiumModeAvailable()) - - if (not self.oPremiumHandler.isPremiumModeAvailable()): - oDialog = dialog().VSok('ATTENTION, Pas de streaming sans premium.') - return False, False - - return self._getMediaLinkByPremiumUser() - - def _getMediaLinkForGuest(self): - pass - - def _getMediaLinkByPremiumUser(self): - api_call = False - - if not self.oPremiumHandler.Authentificate(): - return False, False - - url = self._url - - api_call = url + '|' + self.oPremiumHandler.AddCookies() - - # print(api_call) - - if api_call: - return True, api_call - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uploaded.pyo b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uploaded.pyo deleted file mode 100644 index 03f4d5d3..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uploaded.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/upstream.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/upstream.py deleted file mode 100644 index dd6c8f83..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/upstream.py +++ /dev/null @@ -1,54 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons - -import re - -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster -from resources.lib.packer import cPacker - -UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:62.0) Gecko/20100101 Firefox/62.0' - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'upstream', 'Upstream') - - def isDownloadable(self): - return False - - def _getMediaLinkForGuest(self): - api_call = '' - - oRequest = cRequestHandler(self._url) - oRequest.addHeaderEntry("User-Agent", UA) - sHtmlContent = oRequest.request() - - sPattern = "(\s*eval\s*\(\s*function(?:.|\s)+?)<\/script>" - aResult_1 = re.findall(sPattern, sHtmlContent) - - if aResult_1: - sUnpacked = cPacker().unpack(aResult_1[0]) - sHtmlContent = sUnpacked - - sPattern = 'sources: *\[\{file:"([^"]+)"' - oParser = cParser() - aResult = oParser.parse(sHtmlContent, sPattern) - - if aResult[0] is True: - api_call = aResult[1][0] - elif len(aResult_1) > 1: - sUnpacked = cPacker().unpack(aResult_1[1]) - sHtmlContent = sUnpacked - sPattern = 'sources: *\[\{file:"([^"]+)"' - oParser = cParser() - aResult = oParser.parse(sHtmlContent, sPattern) - if aResult[0] is True: - api_call = aResult[1][0] - - if api_call: - return True, api_call + '|Referer=' + self._url - - return False, False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/upstream.pyo b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/upstream.pyo deleted file mode 100644 index 6be14b00..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/upstream.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uptobox.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uptobox.py deleted file mode 100644 index 7be8a518..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uptobox.py +++ /dev/null @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- -# https://github.com/Kodi-vStream/venom-xbmc-addons -# - -from resources.hosters.hoster import iHoster -from resources.hosters.uptostream import cHoster as uptostreamHoster -from resources.lib.comaddon import dialog, VSlog, addon -from resources.lib.handler.premiumHandler import cPremiumHandler -from resources.lib.handler.requestHandler import cRequestHandler - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'uptobox', 'Uptobox', 'violet') - self.oPremiumHandler = None - - def setUrl(self, url): - self._url = str(url) - self._url = self._url.replace('iframe/', '') - self._url = self._url.replace('http:', 'https:') - self._url = self._url.split('?aff_id')[0] - - def checkUrl(self, sUrl): - return True - - def getMediaLink(self): - self.oPremiumHandler = cPremiumHandler(self.getPluginIdentifier()) - if self.oPremiumHandler.isPremiumModeAvailable(): - ADDON = addon() - - try: - mDefault = int(ADDON.getSetting("hoster_uptobox_mode_default")) - except AttributeError: - mDefault = 0 - - if mDefault == 0: - ret = dialog().VSselect(['Passer en Streaming (via Uptostream)', 'Rester en direct (via Uptobox)'], - 'Choissisez votre mode de fonctionnement') - else: - # 0 is ask me, so 1 is uptostream and so on... - ret = mDefault - 1 - - # mode stream - if ret == 0: - return self._getMediaLinkForGuest() - # mode DL - if ret == 1: - return self._getMediaLinkByPremiumUser() - - return False - - else: - VSlog('UPTOBOX - no premium') - return self._getMediaLinkForGuest() - - def _getMediaLinkForGuest(self): - self._url = self._url.replace('uptobox.com/', 'uptostream.com/') - - # On redirige vers le hoster uptostream - oHoster = uptostreamHoster() - oHoster.setUrl(self._url) - return oHoster.getMediaLink() - - def _getMediaLinkByPremiumUser(self): - - token = self.oPremiumHandler.getToken() - if not token: - return self._getMediaLinkForGuest() - - fileCode = self._url.split('/')[-1].split('?')[0] - url1 = "https://uptobox.com/api/link?token=%s&file_code=%s" % (token, fileCode) - try: - oRequestHandler = cRequestHandler(url1) - dict_liens = oRequestHandler.request(jsonDecode=True) - statusCode = dict_liens["statusCode"] - if statusCode == 0: # success - return True, dict_liens["data"]["dlLink"] - - if statusCode == 16: # Waiting needed - status = "Pas de compte Premium" # dict_liens["data"]["waiting"] - elif statusCode == 7: # Invalid parameter - status = dict_liens["message"] + ' : ' + dict_liens["data"] - else: - status = 'Erreur inconnue : %s, message = %s : %s' % (str(statusCode), dict_liens["message"], str(dict_liens["data"])) - except Exception as e: - status = e - - VSlog('UPTOBOX - ' + str(status)) - - return False diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uptobox.pyo b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uptobox.pyo deleted file mode 100644 index 357aced2..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uptobox.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uptostream.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uptostream.py deleted file mode 100644 index d0b1315a..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uptostream.py +++ /dev/null @@ -1,158 +0,0 @@ -# -*- coding: utf-8 -*- -# vStream https://github.com/Kodi-vStream/venom-xbmc-addons -# -import json -import re -import requests -import xbmc - -from resources.hosters.hoster import iHoster -from resources.lib.comaddon import dialog, VSlog, CountdownDialog, VSPath -from resources.lib.config import GestionCookie -from resources.lib.handler.premiumHandler import cPremiumHandler -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.librecaptcha.gui import cInputWindowYesNo -from resources.lib.parser import cParser - - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'uptostream', 'UpToStream') - self.oPremiumHandler = None - - def setUrl(self, url): - self._url = str(url) - - def checkSubtitle(self, sHtmlContent): - if sHtmlContent: - Files = [] - lab = [] - for aEntry in sHtmlContent: - if aEntry["label"] == "French": - url = aEntry["src"] - if not url.startswith('http'): - url = 'http:' + url - Files.append(url) - else: - continue - return Files - return False - - def _getMediaLinkForGuest(self): - pass - - def getMediaLink(self): - self.oPremiumHandler = cPremiumHandler('uptobox') - premium = self.oPremiumHandler.isPremiumModeAvailable() - if not premium: - dialog().VSok('Ce hoster necessite un compte, meme gratuit.') - return False, False - - api_call = False - SubTitle = False - filecode = self._url.split('/')[-1].split('?')[0] - - # Uptostream avec un compte uptobox, pas besoin du QRcode - token = self.oPremiumHandler.getToken() - r = requests.get('https://uptobox.com/api/user/me?token=' + token).json() - if r["data"]["premium"]: - status = '' - url1 = "https://uptobox.com/api/streaming?token=%s&file_code=%s" % (token, filecode) - try: - oRequestHandler = cRequestHandler(url1) - dict_liens = oRequestHandler.request(jsonDecode=True) - status = dict_liens["statusCode"] - if status == 0: - js_result = dict_liens["data"] - except Exception as e: - status = e - - if status: - VSlog('UPTOBOX - ' + status) - return False - - # Uptostream sans compte uptobox, il faut valider un code - else: - SubTitle = "" - cookies = GestionCookie().Readcookie("uptobox") - - s = requests.Session() - s.headers.update({"Cookie": cookies}) - r = s.get('https://uptobox.com/api/streaming?file_code=' + filecode).json() - - if r["statusCode"] != 0: # Erreur - dialog().VSinfo(r["data"]) - return False, False - - r1 = s.get(r["data"]["user_url"]).text - tok = re.search('token.+?;.+?;(.+?)&', r1).group(1) - - if not xbmc.getCondVisibility('system.platform.android'): - # Si possible on ouvre la page automatiquement dans un navigateur internet. - import webbrowser - webbrowser.open(r['data']['user_url']) - with CountdownDialog("Autorisation nécessaire", "Pour voir cette vidéo, veuillez vous connecter", - "Allez sur ce lien : " + r['data']['user_url'], - "Et valider le pin : " + r['data']['pin'], True, r["data"]['expired_in'], 10) as cd: - js_result = cd.start(self.__check_auth, [r["data"]["check_url"]])["data"] - else: - import pyqrcode - qr = pyqrcode.create(r['data']['user_url']) - qr.png(VSPath('special://home/userdata/addon_data/plugin.video.vstream/qrcode.png'), scale=5) - oSolver = cInputWindowYesNo(captcha='special://home/userdata/addon_data/plugin.video.vstream/qrcode.png', msg="Scanner le QRCode pour acceder au lien d'autorisation", roundnum=1) - retArg = oSolver.get() - DIALOG = dialog() - if retArg == "N": - return False - - js_result = s.get(r["data"]["check_url"]).json()["data"] - - # Deux modes de fonctionnement different. - if js_result.get("streamLinks").get('src'): - api_call = js_result['streamLinks']['src'].replace(".m3u8", ".mpd") - else: - sPattern = "'(.+?)': {(.+?)}" - - oParser = cParser() - aResult = oParser.parse(js_result["streamLinks"], sPattern) - - url = [] - qua = [] - - for aEntry in aResult[1]: - QUAL = aEntry[0] - d = re.findall("'u*(.+?)': u*'(.+?)'", aEntry[1]) - for aEntry1 in d: - url.append(aEntry1[1]) - qua.append(QUAL + ' (' + aEntry1[0] + ')') - - # Affichage du tableau - api_call = dialog().VSselectqual(qua, url) - - try: - SubTitle = self.checkSubtitle(js_result["subs"]) - except: - VSlog("Pas de sous-titre") - - if api_call: - if SubTitle: - return True, api_call, SubTitle - else: - return True, api_call - - return False, False - - def __check_auth(self, url): - try: - js_result = json.loads(requests.get(url).content) - except ValueError: - raise Exception('Unusable Authorization Response') - - if js_result.get('statusCode') == 0: - if js_result.get('data') == "wait-pin-validation": - return False - else: - return js_result - - raise Exception('Error during check authorisation.') diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uptostream.pyo b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uptostream.pyo deleted file mode 100644 index ae873c80..00000000 Binary files a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/uptostream.pyo and /dev/null differ diff --git a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/upvid.py b/templates/.kodi/addons/plugin.video.vstream/resources/hosters/upvid.py deleted file mode 100644 index b57d6067..00000000 --- a/templates/.kodi/addons/plugin.video.vstream/resources/hosters/upvid.py +++ /dev/null @@ -1,115 +0,0 @@ -# -*- coding: utf-8 -*- -# https://upvid.co/embed-xxx.html -# https://upvid.co/xxx.html - -import base64 -import re - -from resources.lib.handler.requestHandler import cRequestHandler -from resources.lib.parser import cParser -from resources.hosters.hoster import iHoster -from resources.lib.aadecode import AADecoder -from resources.lib.comaddon import isMatrix, VSlog - -UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0' - -class cHoster(iHoster): - - def __init__(self): - iHoster.__init__(self, 'upvid', 'UpVid') - - def setUrl(self, url): - self._url = str(url) - # lien embed obligatoire - if 'embed-' not in self._url: - self._url = self._url.rsplit('/', 1)[0] + '/embed-' + self._url.rsplit('/', 1)[1] - - def _getMediaLinkForGuest(self): - api_call = '' - oParser = cParser() - sUrl = self._url - - sPattern1 = '' - aResult = oParser.parse(sHtmlContent, sPattern) - - if aResult[0]: - - sHosterUrl = '' - Referer = '' - url = aResult[1][0] - if not (url.startswith("http")): - url = "http:" + url - - if 'popofthestream' in url: - oRequestHandler = cRequestHandler(url) - sHtmlContent = oRequestHandler.request() - sPattern = 'src="([^"]+)' - aResult = re.findall(sPattern, sHtmlContent) - if aResult: - url2 = url.replace('-', '/') - urlChannel = url2.replace('html', 'json') - oRequestHandler = cRequestHandler(urlChannel) - sHtmlContent = oRequestHandler.request() - - if not sHtmlContent.startswith('id=\'(.+?)\'' - aResult2 = re.findall(sPattern3, sHtmlContent3) - if aResult2: - sHosterUrl3 = aResult2[0] - sHosterUrl3 = "http://hdcast.pw/stream_jw2.php?id=" + sHosterUrl3 - oRequestHandler = cRequestHandler(sHosterUrl3) - sHtmlContent4 = oRequestHandler.request() - sPattern4 = 'curl = "([^"]+)";' - aResult3 = re.findall(sPattern4, sHtmlContent4) - if aResult3: - sHosterUrl = aResult3[0] - sHosterUrl = base64.b64decode(sHosterUrl) - - if 'stream365' in url: # Terminé - oRequestHandler = cRequestHandler(url) - sHtmlContent2 = oRequestHandler.request() - sPattern2 = 'var a[ 0-9]+="(.+?)"' - aResult = re.findall(sPattern2, sHtmlContent2) - if aResult: - gameId = int(aResult[2]) + int(aResult[0]) - int(aResult[1]) - int(aResult[2]) - sHosterUrl = 'http://91.192.80.210/edge0/xrecord/' + str(gameId) + '/prog_index.m3u8' - - if 'youtube' in url: # Je sais pas - sPattern2 = 'youtube.com/embed/(.+?)[?]autoplay=1' - aResult = re.findall(sPattern2, url) - - if aResult: - video_id = aResult[0] - url2 = url.replace('/embed/', '/watch?v=').replace('?autoplay=1', '') - oRequestHandler = cRequestHandler(url2) - oRequestHandler.addHeaderEntry('User-Agent', UA) - sHtmlContent3 = Unquote(str(oRequestHandler.request())) - - sPattern3 = 'hlsManifestUrl":"(.+?)"' - aResult = re.findall(sPattern3, sHtmlContent3) - - if aResult: - sHosterUrl = aResult[0] + '|User-Agent=' + UA + '&Host=manifest.googlevideo.com' - else: - url2 = 'https://youtube.com/get_video_info?video_id=' + video_id + '&sts=17488&hl=fr' - - oRequestHandler = cRequestHandler(url2) - oRequestHandler.addHeaderEntry('User-Agent', UA) - sHtmlContent3 = Unquote(str(oRequestHandler.request())) - - sPattern3 = 'hlsManifestUrl":"(.+?)"' - aResult = re.findall(sPattern3, sHtmlContent3) - - if aResult: - sHosterUrl = aResult[0] + '|User-Agent=' + UA + '&Host=manifest.googlevideo.com' - - if 'streamup.me' in url: # Terminé - oRequestHandler = cRequestHandler(url) - sHtmlContent2 = oRequestHandler.request() - sPattern2 = '' - aResult = re.findall(sPattern2, sHtmlContent2) - if aResult: - Referer = url - url = aResult[0] # decryptage plus bas (telerium) - - if 'telerium.tv' in url: # WIP - oRequestHandler = cRequestHandler(url) - if Referer: - oRequestHandler.addHeaderEntry('User-Agent', UA) - oRequestHandler.addHeaderEntry('Referer', Referer) - sHtmlContent2 = oRequestHandler.request() - sPattern2 = '(\s*eval\s*\(\s*function(?:.|\s)+?{}\)\))' - aResult = re.findall(sPattern2, sHtmlContent2) - - if aResult: - str2 = aResult[0] - if not str2.endswith(';'): - str2 = str2 + ';' - - strs = cPacker().unpack(str2) - - sPattern3 = '{url:window\.atob\((.+?)\)\.slice.+?\+window\.atob\((.+?)\)' - aResult1 = re.findall(sPattern3, strs) - if aResult1: - m3u = aResult1[0][0] - sPatternM3u = m3u + '="(.+?)"' - m3u = re.findall(sPatternM3u, strs) - m3u = base64.b64decode(m3u[0])[14:] - - token = aResult1[0][1] - sPatterntoken = token + '="(.+?)"' - token = re.findall(sPatterntoken, strs) - token = base64.b64decode(token[0]) - - sHosterUrl = 'https://telerium.tv/' + m3u + token + '|referer=' + url - - # TODO A TESTER - if 'usasports.live' in url: - oRequestHandler = cRequestHandler(url) - sHtmlContent2 = oRequestHandler.request() - sPattern1 = 'var sou = " (.+?)"' - aResult = re.findall(sPattern1, sHtmlContent2) - if aResult: - sHosterUrl = aResult[0] - - # TODO A TESTER - if 'wiz1' in url: - oRequestHandler = cRequestHandler(url) - sHtmlContent2 = oRequestHandler.request() - sPattern1 = '"iframe" src="(.+?)"' - aResult = re.findall(sPattern1, sHtmlContent2) - if aResult: - sHosterUrl = aResult[0] - - if 'var16.ru' in url: - sHosterUrl = getHosterVar16(url, url) - - # TODO A TESTER - if 'livesportone' in url: - url = url.replace('livesportone.com', 'sportes.pw') - - oRequestHandler = cRequestHandler(url) - sHtmlContent2 = oRequestHandler.request() - sPattern2 = ' + + + +
+
+ +
+
+ + + + +